REST es un estilo de API con muchos endpoints fijos; GraphQL es un lenguaje de consultas donde los clientes piden a un endpoint solo los campos que necesitan. La comparación trata en realidad de quién decide la forma de la respuesta: en REST el servidor la decidió en tiempo de diseño; en GraphQL el cliente la decide en cada solicitud. Todo lo demás — caché, versionado, errores, rendimiento — se desprende de esa única inversión.
Puntos clave
| Pregunta | Respuesta |
|---|---|
| REST | Muchos endpoints, respuestas definidas por el servidor, caché nativo de HTTP |
| GraphQL | Un endpoint, schema tipado, campos y anidamiento seleccionados por el cliente |
| La victoria de GraphQL | Mueren el overfetching y el underfetching; un round trip por pantalla |
| La victoria de REST | Caché en CDN, simplicidad, soporte universal |
| La realidad de 2026 | Coexistencia — REST en todas partes, GraphQL como capa de agregación del frontend |
La misma pantalla, de las dos formas
Una pantalla de perfil necesita un usuario, sus cinco posts más recientes y el conteo de seguidores. REST habla en recursos:
GET /users/42 → 38 campos, necesitabas 3 (overfetching)
GET /users/42/posts?limit=5 → segundo round trip (underfetching)
GET /users/42/followers → tercer round trip
GraphQL habla en una sola pregunta con forma:
POST /graphql
query {
user(id: 42) {
name
avatarUrl
posts(first: 5) { title likes }
followers { totalCount }
}
}
→ un solo round trip, exactamente esos campos, nada más
La brecha se estrecha más de lo que sugieren los titulares: una API REST bien diseñada también soporta selección de campos — y los query builders de los SDKs la vuelven un hábito de primera clase:
// JavaScript / Node.js — Back4app JS SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
const query = new Parse.Query('Article');
query.equalTo('status', 'published');
query.select('title', 'views'); // field selection, GraphQL-style
const articles = await query.find(); // lean payload over the REST API
// The same backend also speaks real GraphQL: query { articles { ... } } // Flutter / Dart — Back4app Flutter SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
final query = QueryBuilder<ParseObject>(ParseObject('Article'))
..whereEqualTo('status', 'published')
..keysToReturn(['title', 'views']); // field selection, GraphQL-style
final response = await query.query(); // lean payload over the REST API // iOS / Swift — Back4app Swift SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
let query = Article.query("status" == "published")
.select("title", "views") // field selection, GraphQL-style
query.find { result in
if case .success(let articles) = result { render(articles) }
} // Android / Kotlin — Back4app Android SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
val query = ParseQuery.getQuery<ParseObject>("Article")
query.whereEqualTo("status", "published")
query.selectKeys(listOf("title", "views")) // field selection, GraphQL-style
query.findInBackground { articles, e -> if (e == null) render(articles) } GraphQL vs. REST de un vistazo
| Dimensión | REST | GraphQL |
|---|---|---|
| Endpoints | Muchos, con forma de recurso | Uno, con forma de schema |
| Forma de la respuesta | Definida por el servidor | Seleccionada por el cliente en cada query |
| Tipado | Convención (OpenAPI opcional) | Impuesto por el schema, introspectable |
| Round trips | Uno por recurso | Uno por pantalla |
| Caché | Nativo de HTTP/CDN, indexado por URL | Normalizado en el cliente; persisted queries |
| Versionado | /v1 → /v2 | Evolucionar + deprecar, sin versiones |
| Errores | Códigos de estado HTTP | 200 + array de errors, resultados parciales |
| Tiempo real | Aparte (webhooks, sockets) | Subscriptions en la spec |
| Curva de aprendizaje | Mínima | Schema, resolvers, control de costo |
| Mejor primer encaje | CRUD público, cacheable, simple | Frontends multi-cliente, densos en datos |
Las partes que las páginas de comparación omiten
El problema N+1 se mudó, no murió. Una query de GraphQL por posts-con-autores dispara ingenuamente una llamada de resolver por post — la misma patología N+1 que los ORMs hicieron famosa, ahora del lado del servidor. La cura estándar es el batching: un loader por solicitud junta los IDs de autor y los trae en una sola consulta. Adoptar GraphQL sin estrategia de batching es adoptar el peor bug de rendimiento de REST en una nueva dirección.
Los errores son una decisión de operaciones. “200 con un array de errors” significa que los dashboards, las alertas y la lógica de CDN construidas sobre códigos de estado quedan ciegas por defecto. Los equipos que prosperan con GraphQL tratan la observabilidad de errores como parte de la adopción, no como una idea tardía.
Las consultas sin límites necesitan límites. Un endpoint flexible significa que una query puede recorrer el grafo entero — la guía oficial de seguridad recomienda límites de profundidad, presupuestos de costo por query y allowlists de persisted queries para los clientes propios. Los endpoints fijos de REST hacían implícito el control de costo; GraphQL lo convierte en tu trabajo.
Casos de uso comunes
- GraphQL: apps móviles en redes lentas, dashboards que cosen muchas entidades, productos con clientes web + móvil + partners que divergen en necesidades de datos, iteración rápida del frontend contra un schema estable.
- REST: APIs públicas para desarrolladores, entrega de contenido cacheable, superficies de webhooks e integraciones, transferencia de archivos, llamadas servicio-a-servicio donde gana la simplicidad.
- Ambos (la norma enterprise): REST o RPC entre servicios de backend; una capa GraphQL agregándolos para los frontends — el patrón backend-for-frontend con schema.
¿Deberías elegir GraphQL o REST? Matriz de decisión
| Elige REST cuando… | Elige GraphQL cuando… | Usa ambos cuando… |
|---|---|---|
| Terceros consumen la API | Las pantallas cosen muchos recursos | Los servicios hablan REST, los frontends quieren formas |
| El caché de CDN carga el tráfico | Los clientes difieren en necesidades de datos | Coexisten una API pública y un frontend de producto |
| Los recursos mapean 1:1 a pantallas | El overfetching duele en móviles | Migras de forma incremental |
| El equipo entrega esta semana | Los contratos tipados aceleran el frontend | Equipos distintos poseen capas distintas |
| Dominan archivos y webhooks | Las subscriptions en tiempo real son núcleo | Prefieres no relitigar este debate |
El default honesto: empieza con REST, agrega GraphQL cuando el dolor de moldear datos multi-cliente llegue de verdad — y si tu plataforma genera ambos desde un mismo esquema, la elección deja de ser arquitectónica y se vuelve por solicitud.
Limitaciones y trade-offs
- REST: over/underfetching en pantallas densas en datos, migraciones de versión, deriva de formas de respuesta entre equipos y N endpoints de documentación.
- GraphQL: el caché exige maquinaria, el control de costo exige vigilancia, los resolvers exigen disciplina de batching y el patrón 200-con-errors exige rehacer la observabilidad.
- Ambos: ninguno arregla un mal modelo de datos — un dominio confuso produce una API confusa en cualquier estilo, como la propia tesis de REST insinúa en voz baja: las restricciones siempre trataron de la arquitectura de abajo.
GraphQL y REST en Back4app
Back4app es una plataforma open-source de Backend as a Service (BaaS) que combina base de datos gestionada, APIs REST y GraphQL generadas automáticamente, autenticación, almacenamiento de archivos y funciones serverless con Cloud Code. Disuelve el dilema de este artículo de raíz: ambos estilos de API se generan desde el mismo schema — endpoints REST cacheables por URL y una API GraphQL tipada con consultas anidadas — más SDKs cuya selección de campos (las pestañas de código de arriba) entrega el beneficio estrella de GraphQL sobre cualquiera de los dos transportes. Elige por cliente, cambia por pantalla y no escribas la capa de API en absoluto.
Preguntas frecuentes
¿Cuál es la diferencia principal entre GraphQL y REST?
La forma del contrato. REST expone muchos endpoints de recursos, cada uno devolviendo una respuesta definida por el servidor — tomas lo que el endpoint te da. GraphQL expone un endpoint con un schema tipado, y cada cliente escribe una query nombrando exactamente los campos y relaciones anidadas que quiere. REST fija las respuestas en el servidor; GraphQL traslada esa decisión al cliente.
¿GraphQL es más rápido que REST?
Para pantallas que necesitan datos de varios recursos, normalmente sí — una query reemplaza múltiples round trips y el payload lleva solo los campos pedidos. Para un recurso simple, REST suele ser más rápido porque sus respuestas indexadas por URL se cachean de maravilla en las CDNs. Y unos resolvers mal escritos pueden hacer a GraphQL más lento que cualquier cosa, vía el problema N+1. La carga de trabajo decide.
¿Qué son el overfetching y el underfetching?
Los dos dolores de REST que GraphQL nació para resolver. Overfetching: un endpoint devuelve el recurso completo cuando la pantalla necesita tres campos. Underfetching: una llamada no basta, así que el cliente hace N solicitudes de seguimiento por los datos relacionados. La selección de campos y las consultas anidadas atacan ambos — por eso las apps multi-cliente y densas en datos sienten primero la atracción hacia GraphQL.
¿GraphQL está reemplazando a REST?
No — los datos de la industria dicen coexistencia. Las encuestas muestran de forma consistente a la inmensa mayoría de los equipos usando REST, con cerca de un tercio usando GraphQL, casi siempre junto a REST y no en su lugar. El patrón enterprise dominante es híbrido: REST (o RPC) entre servicios y para APIs públicas, con GraphQL como capa de agregación sirviendo a los clientes frontend.
¿En qué difiere el caché entre REST y GraphQL?
Las respuestas REST viven en URLs únicas, así que navegadores y CDNs las cachean sin esfuerzo — su superpoder silencioso. GraphQL típicamente envía POSTs a un endpoint, lo que rompe el caché indexado por URL; el ecosistema compensa con cachés normalizados del lado del cliente y persisted queries sobre GET. El caché es el argumento más fuerte a favor de REST en APIs públicas de mucha lectura.
¿En qué difiere el versionado?
REST versiona explícitamente — un v2 en la URL o en un header — y mantiene ambas versiones durante las migraciones. GraphQL apunta a la evolución sin versiones: agrega campos nuevos con libertad, marca los viejos como deprecated, observa la telemetría de uso y elimínalos cuando los clientes dejen de pedirlos. Ambos funcionan; GraphQL cambia la ceremonia de versiones por disciplina de gobernanza del schema.
¿Cómo difieren los errores entre los dos?
REST se apoya en los códigos de estado HTTP — un 404 es visible para cada proxy, monitor y librería cliente. GraphQL suele devolver 200 con un array de errors junto a datos parciales, lo que habilita el éxito parcial pero obliga al monitoreo a parsear cuerpos de respuesta en vez de confiar en los códigos. Es una diferencia operativa real, no una nota al pie.
¿Cuándo deberías seguir eligiendo REST?
Disparadores concretos: APIs públicas consumidas por muchos terceros, tráfico de lectura muy cacheable, CRUD simple con forma de recursos, subida y descarga de archivos, integraciones estilo webhook y equipos sin experiencia operativa en GraphQL. REST es el default que todo soporta; GraphQL es el especialista que contratas para frontends multi-cliente y densos en datos.