REST a menudo resulta excesivo al proveer datos (over-fetching) o insuficiente (under-fetching), obligándonos a escribir un montón de endpoints auxiliares. GraphQL vino para resolver esos problemas. Hoy veremos para qué sirve, qué problemas arregla y en las próximas clases pasaremos a su integración con Spring Boot.
¿Qué es GraphQL?
Imagina un restaurante. Abres el menú y pides platos concretos, sabiendo exactamente lo que vas a recibir. GraphQL es como el menú de un API. Describes qué datos necesitas y el servidor devuelve justo eso (nada de más). Este lenguaje de consultas fue desarrollado por Facebook en 2012 para solucionar problemas que tenían con REST API mientras trabajaban en sus apps móviles. Más tarde, en 2015, Facebook hizo GraphQL open source, y ahora lo usan empresas como GitHub, Shopify y Twitter.
GraphQL es un language de consultas para API y un runtime para ejecutar esas consultas. Su objetivo es dar a los desarrolladores una herramienta para solicitar datos de forma flexible y eficiente.
Aquí tienes algunas características clave de GraphQL:
- Flexibilidad de las queries. Tú decides cuántos datos y cuáles exactamente necesitas.
- Tipado estricto. El esquema (Schema) define una estructura clara de los datos, lo que hace al API predecible.
- Punto de acceso único. Todas las queries y mutations pasan por una sola URL.
- Soporte de tiempo real vía Subscriptions.
Problemas que resuelve GraphQL
1. Over-Fetching y Under-Fetching
Imagina que trabajas con un REST API para obtener datos de usuarios. Solo necesitas su email, pero el REST API devuelve toda la info del usuario (nombre, edad, dirección, etc.). Eso es un problema de exceso de datos — Over-Fetching.
Ahora imagina que necesitas info de usuarios incluyendo sus últimos pedidos. Los devs del REST API no añadieron un endpoint así, y tienes que hacer dos llamadas: una a /users y otra a /orders. Eso es un problema de falta de datos — Under-Fetching.
GraphQL resuelve ambos problemas. Puedes pedir exactamente los datos que necesitas, incluso si pertenecen a distintas entidades.
Ejemplo de query en GraphQL:
query {
user(id: 1) {
name
email
orders {
id
total
}
}
}
Esta query devolverá solo los campos necesarios:
{
"data": {
"user": {
"name": "Ivan Ivanov",
"email": "ivan@example.com",
"orders": [
{"id": 101, "total": 300},
{"id": 102, "total": 150}
]
}
}
}
2. Unificación y estandarización del API
En REST API solemos tener un montón de endpoints separados, como /users, /orders, /products. Cada uno con sus reglas, parámetros y respuestas. GraphQL propone un único endpoint (/graphql) por el que hacemos todas las operaciones. Eso hace el API más predecible y cómodo.
3. Escalabilidad
GraphQL permite añadir funcionalidades al API fácilmente sin romper lo que ya existe. El esquema (Schema) define los tipos de datos y sus relaciones, y cualquier funcionalidad nueva se añade como una parte nueva del esquema sin necesidad de modificar lo ya existente.
Conceptos básicos de GraphQL
1. Tipado estricto
GraphQL usa tipado estricto para describir los datos. Esto se hace mediante el esquema (Schema), que define todos los tipos de datos posibles y las operaciones disponibles en el API. El esquema actúa como un contrato entre cliente y servidor.
Ejemplo de esquema:
query {
user(id: 1) {
name
email
orders {
id
total
}
}
}
Tipos de datos en GraphQL:
- Scalar: tipos simples como
Int,Float,String,BooleanyID. - Object: tipos con campos anidados (por ejemplo,
User,Order). - Enum: enumeraciones, por ejemplo,
Status { ACTIVE, INACTIVE }. - Input: tipos para pasar datos en las Mutations.
2. Queries (Queries)
Las queries son la forma de obtener datos del servidor. Son análogas a las peticiones HTTP GET en REST API, pero con mucha más flexibilidad. El cliente construye la query eligiendo solo los campos que necesita.
Ejemplo de query:
query {
user(id: 1) {
name
email
}
}
3. Mutations (Mutations)
Las Mutations se usan para cambiar datos en el servidor — análogas a POST/PUT/PATCH en REST API. Puedes crear, actualizar o eliminar datos.
Ejemplo de Mutation:
mutation {
createUser(name: "Ivan Ivanov", email: "ivan@example.com") {
id
name
email
}
}
Respuesta:
{
"data": {
"createUser": {
"id": "1",
"name": "Ivan Ivanov",
"email": "ivan@example.com"
}
}
}
4. Suscripciones (Subscriptions)
Las Suscripciones permiten a los clientes recibir actualizaciones en tiempo real. Por ejemplo, notificaciones de nuevos mensajes en un chat o actualización del estado de un pedido.
Ejemplo de Subscription:
subscription {
orderUpdated {
id
status
}
}
El cliente recibe las actualizaciones en cuanto hay nuevos datos.
Ventajas de GraphQL frente a REST
| Característica | GraphQL | REST |
|---|---|---|
| Flexibilidad de las queries | El cliente solicita solo los datos necesarios | Respuestas predefinidas de los endpoints |
| Endpoint único | Un único endpoint para todas las operaciones | Varios endpoints para distintas operaciones |
| Tipado | Tipado estricto mediante Schema | No existe una descripción estricta de los datos |
| Eficiencia | Mínimo número de consultas al servidor | A menudo se requieren varias consultas |
Historia de la creación de GraphQL
Todo empezó en 2012, cuando Facebook se encontró con problemas de rendimiento en su REST API dentro de su aplicación móvil. Llegaron a la conclusión de que REST API no era eficiente para móviles, que a menudo necesitaban distintos datos según el contexto. Como resultado, se creó GraphQL para abordar esos problemas. En 2015 Facebook lo hizo open source, y rápidamente ganó popularidad en la comunidad.
Dato interesante: GraphQL se desarrolló inicialmente para uso interno en Facebook, pero luego impulsó un cambio en la forma de abordar los APIs en la industria.
En este punto entendimos los conceptos básicos de GraphQL, su historia y los problemas que resuelve. En las siguientes lecciones configuraremos Spring Boot para trabajar con GraphQL y crearemos nuestra primera aplicación.
GO TO FULL VERSION