REST vs GraphQL
GraphQL nació para resolver un problema concreto de REST: pedir tres veces al servidor para pintar una pantalla, y que cada respuesta traiga el triple de datos de los necesarios. Resuelve eso, y a cambio trae complejidad propia.
Varios endpoints, cada uno devuelve una cosa fija
Un endpoint, el cliente pide exactamente lo que necesita
En REST el servidor decide qué devuelve cada endpoint; el cliente coge lo que hay, aunque solo necesite dos campos de veinte. En GraphQL el cliente escribe la forma de la respuesta y recibe exactamente eso, en una sola petición. La flexibilidad se paga en caché —mucho más difícil— y en el riesgo de consultas que tumban el servidor.
| Dimensión | REST | GraphQL |
|---|---|---|
| Endpoints | Uno por recurso | Uno solo |
| Quién decide la respuesta | El servidor | El cliente |
| Datos de más o de menos | Habitual | Se evita por diseño |
| Peticiones para una pantalla | Varias | Una |
| Caché HTTP | Directa, es su punto fuerte | Difícil: todo es POST al mismo sitio |
| Curva de aprendizaje | Baja | Notable, en cliente y en servidor |
| Riesgo operativo | Bajo | Consultas anidadas que saturan el servidor |
| Versionado | Por URL: /v1, /v2 | Evolutivo: se añaden campos y se deprecan |
| Contrato y tipado | Documentado aparte (OpenAPI) | El esquema ES el contrato, y se introspecciona |
Por defecto, y especialmente cuando la API es pública, cuando la caché importa, o cuando los consumidores son pocos y conocidos.
Cuando hay muchos clientes distintos con necesidades muy distintas —web, móvil, integraciones— y el coste de mantener endpoints a medida para cada uno se ha vuelto el cuello de botella.
Adoptar GraphQL en un proyecto con un solo frontend. El problema que resuelve —muchos consumidores con necesidades divergentes— no existe ahí, y lo que llega es la complejidad sin el beneficio: perder la caché HTTP gratis y ganar una capa más que mantener. Si el síntoma es que una pantalla hace cinco llamadas, casi siempre sale más barato crear un endpoint que devuelva justo lo que esa pantalla necesita que reescribir la API entera.