# GraphQL

> Un lenguaje de APIs donde la app pide justo los campos que necesita, en un solo pedido.

- Nivel: Avanzado
- Temas: Software
- URL: https://tidbit.legios.com.ar/es/graphql/
- En inglés: [GraphQL](https://tidbit.legios.com.ar/graphql/)

**GraphQL** es una forma de armar APIs en la que el cliente escribe una **consulta** (query) que describe exactamente los datos que quiere, y el servidor responde con JSON con esa misma forma. Se creó en Facebook en 2012 para alimentar sus apps móviles, se publicó en 2015 y hoy lo mantiene la GraphQL Foundation, parte de la Linux Foundation.

Comparalo con una API REST. Para mostrar una pantalla de perfil, una app REST quizás llama a `/users/7`, después a `/users/7/orders`, después a `/orders/91/items`, y recibe un montón de campos que nunca muestra. Con GraphQL manda un solo pedido a un único endpoint, normalmente `/graphql`, diciendo "usuario 7: nombre, y los dos últimos pedidos con su total", y recibe solo eso. Así evita el **over-fetching** (traer de más) y el **under-fetching** (necesitar muchas idas y vueltas), algo que pesa en conexiones móviles lentas.

Detrás del endpoint hay un **schema** (esquema): una descripción tipada de cada objeto y campo que ofrece la API, que las herramientas usan para autocompletar y validar consultas antes de correrlas. Cada campo lo completa una función chica llamada **resolver**, que puede leer de una base de datos, de un servicio REST o de lo que sea. La flexibilidad tiene costos: cachear es más difícil que con URLs simples, y una consulta descuidada puede pedir tantos datos anidados que sobrecargue el servidor, así que las APIs en producción limitan la profundidad y el costo de las consultas.

## Una analogía

REST es un menú fijo: cada plato viene como decidió la cocina. GraphQL es pedir a la carta desde una lista impresa de todos los ingredientes: te llega exactamente lo que pediste, pero la cocina tiene que cuidarse de los pedidos absurdos.

## Para quedarse

- Un solo endpoint; la consulta del cliente decide la forma de la respuesta.
- Un schema tipado lista todo lo que se puede pedir.
- Evita traer datos de más o hacer muchas idas y vueltas.
- Es más difícil de cachear y necesita límites contra consultas muy caras.

## Para seguir leyendo

- [Introduction to GraphQL (sitio oficial, en inglés)](https://graphql.org/learn/)
- [¿Qué es GraphQL? (AWS)](https://aws.amazon.com/es/graphql/)
- [GraphQL en Wikipedia](https://es.wikipedia.org/wiki/GraphQL)

## Términos relacionados

- [API](https://tidbit.legios.com.ar/es/api/): El menú de cosas que un programa le deja pedir a otro programa.
- [Servidor](https://tidbit.legios.com.ar/es/server/): Una computadora cuyo trabajo es responder pedidos de otras computadoras, todo el día.
- [JSON](https://tidbit.legios.com.ar/es/json/): El formato de texto con el que los programas se pasan datos estructurados.
- [Meta](https://tidbit.legios.com.ar/es/meta/): La empresa detrás de Facebook, Instagram y WhatsApp, financiada con publicidad.
- [Linux](https://tidbit.legios.com.ar/es/linux/): Un sistema operativo libre y de código abierto que mueve la mayoría de los servidores.
- [API REST](https://tidbit.legios.com.ar/es/rest-api/): El estilo de API web más común: cada cosa tiene una URL y la manejás con verbos HTTP.
- [Esquema de base de datos](https://tidbit.legios.com.ar/es/database-schema/): El plano de una base de datos: qué tablas hay, sus columnas y cómo se conectan.
- [Base de datos](https://tidbit.legios.com.ar/es/database/): Un depósito ordenado de datos que los programas consultan y actualizan sin riesgo.
