¿Qué es GraphQL?
GraphQL es un lenguaje de consulta de código abierto para API que permite obtener datos de varias fuentes en una sola llamada a la API. También funciona como un entorno de ejecución del lado del servidor para resolver consultas con los datos existentes. GraphQL prioriza proporcionar al cliente únicamente los datos solicitados, al tiempo que ofrece una descripción completa de los datos de la API, y facilita la escalabilidad y la evolución de las API.
Entender GraphQL
GraphQL se diseñó pensando en la flexibilidad, la velocidad y los desarrolladores. Con GraphQL, los desarrolladores pueden crear las API como consideren oportuno y, a continuación, utilizar una especificación de GraphQL para garantizar que las API sean funcionales para los clientes.
Uno de los conceptos fundamentales de una consulta GraphQL es que los datos que se reciben son predecibles. En lugar de cadenas de código innecesario, se devuelve exactamente lo solicitado. Esta obtención declarativa de datos resulta especialmente útil en dispositivos móviles, donde el ancho de banda es limitado. Las aplicaciones que utilizan GraphQL también son estables y rápidas porque son ellas, y no el servidor, las que controlan los datos que se solicitan y reciben. Además, funcionan con rapidez incluso en conexiones de red lentas, ya que una sola solicitud puede devolver varios elementos solicitados a la vez.
Partiendo de la simplificación de datos que ofrece GraphQL, las API se organizan por tipos y campos en lugar de por endpoints. Esto permite acceder a todos los datos desde un único endpoint, de modo que las aplicaciones puedan solicitar solo lo necesario. Al reducir la complejidad operativa, GraphQL se integra en el flujo de trabajo de una solución de conectividad de API optimizada.
Breve historia
En 2012, Meta (entonces Facebook) necesitaba una API de obtención de datos que fuera lo suficientemente potente para sus aplicaciones móviles de Facebook. Bajo la dirección de Lee Byron, Facebook desarrolló GraphQL para simplificar la obtención de datos, concretamente desde la perspectiva de los diseñadores y desarrolladores de productos. GraphQL se utilizó primero de forma interna en Facebook y, posteriormente, se lanzó públicamente como código abierto en 2015. Siguiendo la trayectoria de muchos otros proyectos de código abierto, en 2019 el proyecto GraphQL pasó a formar parte de su propia GraphQL Foundation, alojada en la Linux Foundation.
GraphQL se diseñó como una alternativa a la arquitectura REST. Las API REST estándar requieren cargar información desde varias URL mediante solicitudes HTTP GET independientes. Con las API GraphQL, todos los datos se recuperan mediante una única solicitud POST. Aunque tanto REST como GraphQL devuelven respuestas en formato JSON, GraphQL se centra en simplificar y consolidar los datos.
¿Cómo funciona GraphQL?
GraphQL admite solicitudes de datos detalladas y ofrece a los clientes un mayor control sobre la información que se envía. El cliente envía una consulta de GraphQL en forma de solicitud POST, a la que el servidor responde con datos en formato JSON. GraphQL no requiere una arquitectura de aplicación específica, puede implementarse en varios entornos (incluido un entorno de desarrollo integrado [IDE]) y puede utilizarse con herramientas existentes de gestión de API o sobre API REST existentes.
Algunos términos clave de GraphQL son:
- Esquema: creado por los desarrolladores de API para mostrar qué datos pueden consultar los clientes. Los esquemas se componen de tipos de objetos que definen qué puede solicitar un cliente y los campos que representan las características del objeto.
- Consulta – Las consultas se validan y, a continuación, se ejecutan según el esquema. GraphQL no puede ejecutar una consulta sin definir un tipo de objeto.
- Resolver – Las funciones de resolución asociadas a cada campo del esquema se invocan para generar un valor durante la ejecución de la API. Los resolvers son componentes arquitectónicos fundamentales de GraphQL.
Una característica única de GraphQL es que las respuestas reflejan la estructura de la consulta (que, a su vez, viene definida por el esquema). Esto simplifica el análisis por parte del cliente, ya que el formato de la respuesta del servidor es totalmente predecible.
Diseño
La naturaleza jerárquica de GraphQL refleja las relaciones entre objetos y funciona bien en interfaces de usuario jerárquicas. Además, utiliza un sistema de tipado fuerte, lo que significa que cada nivel de una consulta se corresponde con un tipo. A su vez, estos tipos definen un conjunto de campos. Esto es similar a SQL, donde se muestran mensajes de error descriptivos antes de completar una consulta.
Conectar los resolvers a las fuentes de datos
Los resolvers son los módulos arquitectónicos clave que conectan los campos, las aristas, las mutaciones, las consultas y las suscripciones de GraphQL con las fuentes de datos (y los microservicios).
Puedes aprender a crear resolutores para fuentes de datos de AWS en este tutorial de GraphQL.
Especifica qué obtener
Una de las características que hacen únicas a las consultas de GraphQL son las respuestas que reflejan su estructura. Los datos devueltos por una consulta son predecibles, porque sabes que tendrán la misma estructura que la solicitud a la API. Cuando la estructura de los datos devueltos se ajusta a la consulta del cliente, los servidores se simplifican.
Ventajas de GraphQL
Una de las principales ventajas de GraphQL es que existen extensiones que ofrecen funcionalidades no disponibles en REST. Otras ventajas de GraphQL son las siguientes.
Establece una única fuente de verdad
Un esquema de GraphQL establece una única fuente de verdad en las aplicaciones GraphQL, proporcionando una ubicación central en la que se describen todos los datos. Aunque el esquema de GraphQL suele definirse en el servidor, los clientes pueden consultar y escribir datos basándose en él.
Sin obtención excesiva de datos
En las arquitecturas REST, la obtención excesiva de datos puede convertirse rápidamente en un problema: la aplicación (backend) define los datos disponibles para cada recurso y los devuelve todos en su respuesta, aunque el cliente (frontend) solo necesite un único elemento. Las llamadas a GraphQL se realizan en una sola petición y proporcionan a los clientes los datos solicitados sin obtener información innecesaria.
Mejora de la comunicación entre el cliente y el servidor
Como los tipos de datos están claramente definidos, la comunicación entre el cliente y el servidor es más clara en GraphQL que en REST. Esta estructura subyacente también implica que no se necesitan clientes complejos para realizar llamadas a un servidor GraphQL. Para obtener más información y ver el código en acción, consulta la información sobre clientes y servidores en la página oficial de GraphQL.
Escalable con Federation
Como conjunto de principios de diseño y herramientas, la federación de API permite exponer los servicios de un contexto delimitado como una API coherente para los usuarios, al tiempo que permite que los servicios de dicho contexto evolucionen sin restricciones. GraphQL ofrece un método para federar toda la API y hacerla evolucionar sin que las consultas anteriores dejen de funcionar, lo que permite escalarla. Esta escalabilidad es una de las razones por las que muchas empresas utilizan GraphQL.
Introspección
La naturaleza introspectiva de GraphQL permite obtener el esquema de GraphQL de una API de GraphQL. Los clientes también pueden solicitar una lista de los tipos de datos disponibles, lo que resulta ideal para generar documentación automáticamente y para probar u obtener esquemas de varios microservicios.
Desventajas de GraphQL
Aunque hay muchas razones para adoptar GraphQL, también hay algunos inconvenientes que conviene tener en cuenta. Por ejemplo, no todo funciona de forma inmediata: se necesitan bibliotecas específicas para consumir la API de terceros. Además, en general, GraphQL requiere más herramientas de apoyo que REST.
Las desventajas de GraphQL frente a REST incluyen las siguientes.
Curva de aprendizaje
Para los desarrolladores acostumbrados a las API REST, GraphQL presenta una curva de aprendizaje más pronunciada. También puede cambiar el flujo de trabajo: los equipos de API que utilizan GraphQL deben escribir además esquemas de GraphQL que sean fáciles de mantener. Dicho esto, si se empieza desde cero, GraphQL puede ser fácil de aprender y utilizar, ya que las solicitudes y las respuestas tienen la misma estructura.
Estrategias únicas de gestión de API
GraphQL podría requerir nuevas estrategias de gestión de API, mientras que las API REST suelen adaptarse a los modelos de gestión de API existentes. Es importante tenerlo en cuenta, ya que añadir una nueva estrategia de gestión de API puede aumentar el coste total.
Almacenamiento en caché complejo
El almacenamiento en caché es menos sencillo en GraphQL que en REST, donde las solicitudes suelen utilizar un método HTTP (GET, POST, PUT o DELETE). Una solicitud estándar de GraphQL utiliza POST, que no se puede almacenar en caché en el nivel HTTP. El almacenamiento en caché también puede resultar complejo en GraphQL, ya que disponer de un único endpoint implica que la URL de dicho endpoint genera múltiples respuestas distintas que no se pueden almacenar en caché (algo positivo para obtener datos, pero negativo para almacenarlos en caché). Esto obliga a los desarrolladores del servidor a diferenciar las consultas, aunque todas operen dentro del mismo objeto. Dicho esto, muchas bibliotecas de GraphQL incluyen mecanismos de almacenamiento en caché de serie.

