¿Qué es GraphQL y en qué se diferencia de REST?
GraphQL es un lenguaje de consulta y resolución de tiempo de ejecución para API, que se utiliza para brindar más estructura a los servicios que trabajan con datos complejos. Con GraphQL, los clientes pueden solicitar solo los datos que necesitan y nada más.
La diferencia es quién establece el esquema
Las API REST tradicionales involucran un servidor API que responde a las solicitudes con datos estructurados, generalmente en forma de JSON. Si realiza una solicitud GET a api.com/users/
, es posible que espere recibir una respuesta similar a la siguiente:
{
users: [
{
name: 'Anthony',
friends: [...]
}
]
}
Su aplicación se verá diferente, pero el punto es que el esquema está definido por el punto final REST. Solo realizó una solicitud a /users/
, pero recuperó todos estos datos.
Sin embargo, esto funciona bien si sabe qué datos obtendrá y es el estándar para la mayoría de los servicios en la web. Sin embargo, si está realizando solicitudes PUT, debe proporcionar a la API los parámetros adecuados para que funcione, o de lo contrario se encontrará con errores. Por supuesto, puede usar parámetros de URL para pasar valores a la API, como la ID de usuario para obtener, que puede usar para hacer que la API sea más dinámica.
Las API de GraphQL hacen las cosas un poco diferentes. En lugar de realizar solicitudes individuales a diferentes puntos finales, que representan diferentes datos, una aplicación GraphQL enviará una solicitud a un único origen. El cuerpo de la solicitud contiene un esquema y le dice a la API qué datos devolver. De esta manera, puede solicitar datos complejos en una sola solicitud y la API nunca devuelve más de lo que se le indica, lo que reduce los tamaños de respuesta grandes.
Por ejemplo, si desea solicitar la dirección de correo electrónico de un usuario específico, puede enviar una solicitud de GraphQL al extremo api.com
con la siguiente consulta:
{
users(name: "Anthony") {
email
}
}
No importa si el objeto Usuario contiene campos para otra información; debido a que solo solicitó el correo electrónico, solo se le enviará el correo electrónico. Por supuesto, aún se le envía un objeto JSON como REST y aún se comunica de la misma manera, pero las solicitudes son mucho más informativas.
Para aplicaciones con esquemas complejos, este tipo de API puede ser muy útil por motivos organizativos. Con GraphQL, se ve obligado a definir estrictamente su esquema al configurar la API, al igual que la escritura estática lo obliga a adherirse a estructuras y tipos. La estructura de los datos es fácilmente referenciable y modificable. Puede lograr fácilmente este mismo efecto con las API REST estándar, pero GraphQL lo impone.
Además de eso, las consultas de GraphQL pueden ser más eficientes. Por ejemplo, un problema popular es la consulta amigos de amigos. En una API REST, tendría que enviar una solicitud para el usuario en cuestión y luego, al recibir las identificaciones de sus amigos, enviar solicitudes individuales para la información de cada amigo y luego filtrar todo eso para las cosas que desea. Por supuesto, puede (y debe) implementar un nuevo punto final para realizar esta consulta en el lado de la base de datos, pero ese es un parche en el problema real.
Con GraphQL, esta consulta es simple. Solo necesita especificar que desea el nombre de cada amigo y (suponiendo que el backend esté configurado para manejar esto correctamente) la API manejará esta interacción de forma natural, sin una configuración especial para cada solicitud.
{
users(name: "Anthony") {
friends {
name
}
}
}
Por supuesto, GraphQL no está exento de inconvenientes. Para aplicaciones simples, es demasiado complejo reemplazar un punto final REST básico. Además, con una API REST tradicional, obtiene la ventaja de poder dividir diferentes rutas. Por ejemplo, /users
y /posts
pueden gestionarse mediante funciones de Lambda sin servidor separadas, y pueden trabajarse y actualizarse independientemente unas de otras, un concepto conocido como back-end de microservicios. Para GraphQL, es mucho más centralizado y más difícil (aunque no imposible) dividirlo en partes separadas.
¿Cómo empiezas?
GraphQL tiene muchas bibliotecas de servidor para diferentes idiomas, pero se usa comúnmente con JavaScript y NodeJS.
Hay dos cosas que necesita una consulta de GraphQL: un esquema, que define la estructura y los tipos de datos, y un solucionador, que toma una entrada y devuelve el valor asociado con el esquema. En el resolutor, puede hacer cosas como obtener solicitudes de base de datos, modificar datos y realizar cualquier acción que necesite, siempre que todo se condense en un valor de retorno que coincida con el esquema al final.
Para aplicaciones complejas, el esquema y la resolución relacionada se pueden generar automáticamente en función de la estructura, pero al final del día, el esquema es solo una definición de tipo y la resolución es solo un objeto con funciones que resuelve diferentes claves en el esquema. .
var { graphql, buildSchema } = require('graphql');
// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
type Query {
hello: String
}
`);
// The root provides a resolver function for each API endpoint
var root = {
hello: () => {
return 'Hello world!';
},
};
// Run the GraphQL query '{ hello }' and print out the response
graphql(schema, '{ hello }', root).then((response) => {
console.log(response);
});
Para obtener más información sobre cómo configurar un servidor GraphQL completo, puede leer la guía de GraphQL sobre cómo instalarlo y usarlo con Express.