GraphQL fue creado por Facebook en el 2012 para uso interno en sus proyectos, que pasó a ser de código abierto en el 2015 y ahora es mantenido por una gran comunidad de empresas e individuos de todo el mundo.
Es importante decir que GraphQL no es ni un framework ni una librería, es una especificación(o también se podria decir que un estándar ʕ·ᴥ·ʔ) y que tenemos distintas librerías de código que lo implementan para distintos lenguajes de programación.
Ahora si vayamos con la definición ʕ ·ᴥʔ:
GraphQL es un lenguaje de consultas para API. GraphQL le da a los clientes de la API el poder de pedir exactamente lo que necesitan y nada más, facilita la evolución de las API a lo largo del tiempo y habilita poderosas herramientas para desarrolladores.
Así que hoy vamos a crear un servidor GraphQL usando solo ruby
en solo 5 sencillos pasos.
Step 1: Inicialización del proyecto
Creamos una carpeta en donde vamos a trabajar:
mkdir graphql-server
cd graphql-server
Inicializamos un nuevo proyecto con ruby a través del gestor de paquetes de ruby bundler
:
bundle init
Step 2: Instalación de dependencias
A continuación, instalamos las dependencias principales que son necesarias para responder a las solicitudes de GraphQL:
- rack: Gema que define una interfaz muy simple para construir servidores web en Ruby.
- graphql: Gema para crear un esquema y ejecutar consultas en dicho esquema.
- graphql_graphql_playground: Gema que nos proporciona un editor gráfico para escribir consultas en GraphQL.
Agregamos estas gemas a nuestro Gemfile:
source "https://rubygems.org"
gem "rack"
gem "graphql"
gem "graphql_playground"
Y las instalamos corriendo este comando:
bundle install
En el siguiente paso, usaremos estas dependencias para crear un servidor que procesa y responde a las solicitudes entrantes de GraphQL.
Step 3: Crear el servidor
Creamos un archivo server.rb
y agregamos lo siguiente:
require 'rack'
class GraphQLServer
def initialize(schema:, context: {})
@schema = schema
@context = context
end
def call(env)
request = Rack::Request.new(env)
payload = if request.get?
request.params
elsif request.post?
body = request.body.read
JSON.parse(body)
end
response = @schema.execute(
payload['query'],
variables: payload['variables'],
operation_name: payload['operationName'],
context: @context,
).to_json
[200, {'Content-Type' => 'application/json', 'Content-Length' => response.bytesize.to_s}, [response]]
rescue InvalidRequestType
# Method Not Allowed
[405, {"Content-Type" => "text/html"}, ["GraphQL Server supports only GET/POST requests"]]
rescue PostBodyMissing
# Bad Request
[400, {"Content-Type" => "text/html"}, ["POST body missing"]]
end
end
Ahora creamos el archivo config.ru
require 'graphql'
require "graphql_playground"
require_relative 'server'
# definimos los types
type_def = <<-GRAPHQL
type Query {
hello: String
todos: [Todo!]!
}
type Todo {
id: Int!
name: String!
}
GRAPHQL
class Todo
attr_accessor :id, :name
def initialize(id, name)
@id = id
@name = name
end
end
# creamos un array con objectos de la clase `Todo` para consultarlos desde el cliente
todos = [
Todo.new(1, "Clean the house"),
Todo.new(2, "Go to the store")
]
# creamos nuestros resolvers
resolver = {
"Query" => {
"hello" => Proc.new { "world" },
"todos" => Proc.new { todos }
}
}
# definimos una ruta para acceder al playground(editor gráfico)
map '/playground' do
use GraphQLPlayground, endpoint: '/'
end
# creamos un schema
schema = GraphQL::Schema.from_definition(
type_def,
default_resolve: resolver
)
# corremos el server con el schema ya creado
run GraphQLServer.new(schema: schema)
Step 4: Start the server
Corremos el server usando este comando:
rackup config.ru
Ahora que nuestro server se está ejecutando, abrimos el editor graphql en http://localhost:9292/playground.
Step 5: Corre tu primera query
En este punto, podrás comenzar a enviar consultas al servidor GraphQL utilizando GraphQL Playground
, que se divide en algunas partes:
- La petición (en la izquierda)
- La respuesta (a la derecha)
- La documentación (disponible usando el botón "SCHEMA" en el extremo derecho)
Probamos nuestra primera query
en nuestro editor playground
:
{
hello
}
Y obtenemos el clásico world

Ahora obtenemos los todos
, ingresando la siguiente query
en lado izquierdo de la ventana:
{
todos {
id
name
}
}
Y obtenemos una lista de todos
que definimos en nuestro server.

Próximos pasos
Está aplicación es una implementacion super básica de un servidor graphql con ruby y un excelente punto de partida para sumergirte en este curioso mundo de graphQL, te dejo algunos enlaces que serán un gran paso para construir servidores graphql con rails: