Puede ser difícil elegir las tecnologías que se incluirán en la pila tecnológica de tu próximo proyecto. En muchos casos -y especialmente cuando se trata de elegir entre GraphQL y las APIs RESTful- se trata de elegir la mejor arquitectura de diseño de APIs.
Hay cuatro formas importantes de construir APIs: SOAP, GRPC, REST y GraphQL. A menudo nos limitamos a REST y GraphQL cuando queremos construir APIs. Esto se debe a que REST cambió las formas tradicionales de construir APIs con SOAP y GRPC.
GraphQL está ampliamente etiquetado como un mejor REST porque representa una mejor forma de construir APIs. Muchos desarrolladores creen que GraphQL sustituirá a REST. Muchos más ya han descubierto que GraphQL ayuda a resolver algunos de los retos habituales a los que se enfrentan los desarrolladores al construir APIs REST.
Estos dos métodos de construcción de APIs son totalmente diferentes. En la práctica, estas tecnologías funcionan enviando una petición HTTP y recibiendo el resultado. Ambas tienen sus pros y sus contras, y en este artículo hablaremos ampliamente de estas dos grandes tecnologías que han cambiado la forma de desarrollar y escalar APIs.
Sin embargo, antes de entrar en detalles, vamos a explorar primero el significado de GraphQL y de las APIs RESTful.
¿Qué es GraphQL?
GraphQL es un lenguaje de consulta de la API, así como un tiempo de ejecución para responder a esas consultas con los datos existentes. También viene equipado con potentes herramientas para manejar incluso las consultas más complejas.
La característica central de GraphQL es su capacidad para solicitar y recibir sólo los datos específicos solicitados, nada más. Esto hace que sea mucho más sencillo escalar tus APIs junto con tu aplicación.
La parte más emocionante de GraphQL es su capacidad para proporcionarte todos los datos en un punto final.
El diagrama anterior es una representación típica de la arquitectura GraphQL. Los clientes hacen peticiones desde diferentes dispositivos, y GraphQL gestiona sus peticiones y devuelve sólo los datos solicitados. Esto resuelve perfectamente el problema de la sobre-obtención y la falta de obtención en las APIs RESTful.
En el ejemplo anterior, mostramos un playground GraphQL y cómo puedes consultar datos con un único endpoint. En la parte superior está el endpoint de la API, a la izquierda la consulta que solicita los nombres de los continentes, y por último, a la derecha, respondemos a la consulta que hemos solicitado.
GraphQL fue creado por Facebook con el objetivo principal de resolver la experiencia de los desarrolladores de aplicaciones móviles al trabajar con las APIs REST. Desde que se publicó su primera versión de código abierto en 2015, GraphQL ha experimentado un enorme crecimiento debido a la adopción de la tecnología por parte de los grandes actores del negocio tecnológico.
Empresas que Utilizan GraphQL
A continuación se muestra una lista de algunas de las empresas y aplicaciones que utilizan GraphQL activamente en sus servidores.
Facebook creó GraphQL, y lo ha utilizado en producción para impulsar sus aplicaciones móviles desde 2012. La multimillonaria empresa de redes sociales abrió la especificación GraphQL en 2015, haciéndola accesible en muchos entornos y para equipos de todos los tamaños.
GitHub
GitHub también anuncia el uso de GraphQL proporcionando una API GraphQL para crear integraciones, recuperar datos y automatizar sus flujos de trabajo utilizando la API GraphQL de GitHub. La API GraphQL de GitHub ofrece consultas más precisas y flexibles que la API REST de GitHub.
Pinterest también es uno de los primeros en adoptar GraphQL. El gigante de las fotos compartidas ha hablado públicamente de su exploración temprana de GraphQL y de cómo utilizan la tecnología GraphQL que impulsa su empresa de mil millones de dólares.
Muchas otras empresas multimillonarias, como Intuit, Shopify, Coursera y Airbnb, alimentan sus aplicaciones con GraphQL. Y esta amplia preferencia por REST no hace más que crecer.
¿Qué Es Una API RESTful?
REST significa «Representational State Transfer» (Transferencia de Estado Representacional), que es un estilo arquitectónico de software para sistemas hipermedia distribuidos. Define principios y restricciones para el intercambio de recursos entre el servidor y los clientes.
Si estos principios se siguen en una API, la aplicación de esa API se denomina «RESTful». La API REST de WordPress es un excelente ejemplo de ello.
A continuación se exponen algunos de los principios y restricciones que debe satisfacer una API para que se la considere una API Restful:
- Desacoplamiento cliente-servidor: Los clientes (frontend) y el servidor (backend) están completamente separados y sólo pueden comunicarse a través de los puntos finales.
- Interfaz uniforme: Los datos que se ven en la interfaz son idénticos en todos los dispositivos.
- Sin estado: El servidor no recuerda si la solicitud actual se realiza por primera vez o no. Cada vez que se hace una petición, tiene que incluir toda la información necesaria para procesarla desde el principio.
- Almacenamiento en caché: Se permite el almacenamiento en caché y en sesión, pero deben configurarse para que los usuarios finales puedan optar por no almacenar datos en caché.
- Arquitectura del sistema en capas: Las API deben estar diseñadas de forma que ni el cliente ni el servidor puedan saber si se están comunicando directamente o a través de un intermediario.
El diagrama siguiente es una arquitectura REST básica. Muestra cómo se gestionan normalmente las peticiones y las respuestas.
GraphQL vs REST: ¿Cuál es la Diferencia?
La principal diferencia es cómo se comunican con el servidor. GraphQL es una tecnología más reciente que utiliza un único endpoint para responder a las consultas, mientras que REST utiliza un conjunto de endpoints que responden a peticiones HTTP específicas. GraphQL se considera generalmente más eficiente y flexible que REST.
Ventajas de GraphQL
A continuación se indican algunas ventajas de utilizar GraphQL, que ilustran por qué es más que suficiente para construir la próxima aplicación de mil millones de dólares.
Obtención de Datos a Través de Un Único Punto Final de la API
La principal ventaja de GraphQL es su capacidad para acceder a cualquiera o a todos los puntos de datos a través de un único punto final de la API.
Uno de los problemas más comunes de las API RESTful es tener demasiados puntos finales para acceder a la información. En GraphQL, sólo tienes un único punto final, por lo que no necesitas enviar varias solicitudes para recuperar información diferente sobre un objeto.
El diagrama siguiente muestra un claro ejemplo de recuperación de recursos mediante la API RESTful y GraphQL. Puedes ver que sólo hay un punto final para acceder al recurso en el servidor GraphQL, mientras que se necesitan varios puntos finales de la API para acceder a diferentes recursos en la API RESTful.
No Hay Exceso de Búsqueda Ni Falta de Búsqueda
La cuestión de la sobrecarga o infracarga es un problema conocido en las APIs RESTful. Esto ocurre cuando los clientes descargan datos al llegar a puntos finales que devuelven estructuras de datos fijas, o bien recuperan más o menos de lo que esperaban.
El exceso de búsqueda hace que la solicitud reciba -o «busque»- más datos de los que requiere una determinada solicitud. Imagina que buscas todos los usuarios de una tabla con la intención de mostrar sus nombres de usuario en tu página web. En ese caso, la búsqueda excesiva devolverá todos los datos de cada usuario, incluyendo (pero no sólo) el nombre.
La infraobtención es relativamente rara, pero ocurre cuando el punto final específico no proporciona toda la información solicitada. El cliente tendrá que hacer peticiones adicionales para acceder al resto de la información que necesite.
GraphQL resuelve eficazmente el problema de la sobrecarga o infracarga al obtener el recurso exacto que el cliente ha solicitado sin ningún detalle adicional.
Mejor Manejo de Sistemas Complejos y Microservicios
GraphQL puede unificar y ocultar la complejidad de los sistemas múltiples integrados.
Por ejemplo, digamos que queremos migrar de una aplicación backend monolítica a una arquitectura de microservicios. La API GraphQL ayuda a manejar la comunicación entre varios microservicios fusionándolos en un esquema GraphQL.
Una vez definidos estos esquemas, tanto el frontend como el backend pueden comunicarse por separado sin necesidad de realizar más cambios, ya que el frontend sabe que los datos del esquema van a estar siempre sincronizados en todo el sistema.
Rápido y Seguro
El problema de la sobrecarga de datos puede dar lugar a un mayor consumo de ancho de banda para los clientes, lo que puede, con el tiempo, provocar un retraso en tu aplicación. Utilizar los patrones de diseño de la API RESTful requiere más tiempo para clasificar la información necesaria de una enorme carga útil.
Gracias a la capacidad de GraphQL de evitar la sobreobtención y la infraobtención, el servidor devuelve una forma segura, fácil de leer y predecible que hace que tus peticiones y respuestas a la API sean más rápidas.
Ventajas de REST
A pesar de la creciente popularidad de GraphQL, REST sigue siendo uno de los estándares de API más populares. Veamos por qué.
- Curva de aprendizaje: Las API RESTful son las más fáciles de aprender y comprender. Ésta es su principal ventaja sobre otras API.
- Serialización: REST cuenta con un enfoque y formatos flexibles para serializar los datos en JSON.
- Caché: La API REST puede gestionar una gran carga con la ayuda de un servidor proxy HTTP y una caché.
- Solicitudes complejas: Las APIs de REST tienen un punto final separado para diferentes peticiones, y eso ayuda a que las peticiones complejas sean más manejables que en otras APIs.
- Limpias y sencillas: Las API REST son elegantes, sencillas y limpias. Son fáciles de explorar.
- Procedimientos HTTP estándar: REST utiliza llamadas a procedimientos HTTP estándar para recuperar datos y hacer peticiones.
- Cliente/Servidor: Esto significa que su lógica de negocio está desacoplada de la presentación. Así que puedes cambiar una sin que afecte a la otra.
- REST no tiene estado: Todos los mensajes intercambiados entre el cliente y el servidor tienen todo el contexto necesario para saber qué hacer con el mensaje.
Inconvenientes de GraphQL
Ahora que hemos hablado de los pros de GraphQL frente a REST, vamos a explorar algunos de los inconvenientes de GraphQL:
- Difícil curva de aprendizaje: GraphQL no es tan fácil de aprender como REST. La parte más difícil de construir una API GraphQL es el diseño del esquema. Esto requiere mucho tiempo y conocimiento del dominio.
- Carga de archivos: GraphQL no tiene una función nativa de carga de archivos. Esto puede solucionarse utilizando la codificación Base64, pero el coste de codificar y descodificar de esta manera puede ser largo y caro.
- Caché web: La caché ayuda a reducir el tráfico frecuente al servidor, lo que acelera las peticiones y el proceso de respuesta al mantener cerca del servidor la información a la que se accede con frecuencia. GraphQL no admite ni se basa en los métodos de almacenamiento en caché de HTTP, sino que depende de los mecanismos de almacenamiento en caché de los clientes Apollo o Relay.
- No es adecuado para aplicaciones pequeñas: GraphQL puede no ser la mejor arquitectura de API para construir una aplicación pequeña. Si tu aplicación no requiere las consultas más flexibles que ofrece GraphQL, REST es el camino a seguir.
- Problema de consultas complejas: La capacidad de GraphQL de dar a un cliente exactamente lo que quiere también puede conducir a problemas de propagación de consultas. Si un cliente envía demasiadas consultas anidadas, puede hacer que se envíen consultas erróneas, lo que puede llevar mucho tiempo al servidor. Es mejor utilizar REST con puntos finales personalizados para atender esas peticiones.
Inconvenientes de REST
Ahora vamos a centrar nuestra atención en algunos de los inconvenientes de REST:
- Múltiples viajes de ida y vuelta: El mayor problema de las APIs REST es la naturaleza de los numerosos puntos finales. Esto significa que para que el cliente obtenga todos los recursos de una aplicación completa, tiene que hacer innumerables viajes de ida y vuelta para obtener los datos.
- Sobrecarga y subcarga: El problema de la sobrecarga y subcarga es un inconveniente importante en las APIS RESTful. Puede provocar un retraso en las respuestas debido a la obtención de grandes cargas útiles no deseadas.
- Jerarquía: Dado que las API REST se basan en recursos de referencia URI, no se adaptan bien a los recursos que no se organizan o acceden de forma natural en una jerarquía simple.
Por Qué Utilizar GraphQL en Lugar de REST
A continuación, hablaremos de las razones por las que podrías considerar GraphQL para tu futuro desarrollo de API en lugar de RESTful API.
Esquema Fuertemente Tipado
GraphQL utiliza un sistema de tipos fuertes para definir las capacidades de la API. En GraphQL, el lenguaje de definición de esquemas (SDL) se utiliza para definir los parámetros que rodean el modo en que el cliente accede a los datos del servidor. Todas las APIs expuestas al cliente están escritas en SDL, lo que resuelve el problema de inconsistencia de los datos que se observa en las APIs RESTful.
No Hay Exceso de Búsqueda Ni Falta de Búsqueda
El problema de la búsqueda excesiva o insuficiente es un problema conocido en las APIs RESTful, en las que los clientes reciben más o menos información de la que han solicitado. GraphQL resuelve este problema proporcionando un medio para que el cliente especifique la información que necesita, y luego devolviendo exactamente -y sólo- esa información específica.
Múltiples Puntos Finales
Uno de los mayores problemas de las API RESTful es tener demasiados puntos finales para acceder a la información.
Supongamos que quieres acceder a un usuario concreto a través de su número de identificación. Se te presentaría un punto final como /users/1
. Pero si quieres acceder a las fotos de ese usuario, tendrás que enviar una solicitud a otro punto final, como /users/1/photos
.
En GraphQL, tienes un único punto final, y no necesitas enviar varias peticiones para recuperar información diferente sobre el usuario.
Enfrentamiento Entre GraphQL y REST
Por último, vamos a explorar la principal diferencia entre GraphQL y las APIs RESTful. Después, hablaremos de algunas de las características de un buen diseño de API y compararemos cómo las maneja cada tecnología.
Rendimiento
No hay duda de que GraphQL rinde más que las APIs RESTful debido a su capacidad de proporcionar un único punto final para acceder a todos tus recursos. Las APIs RESTful utilizan múltiples puntos finales, lo que puede provocar latencia en la red.
Complejidad de la Consulta
Como los puntos finales no están separados en múltiples puntos finales, las consultas GraphQL pueden volverse cada vez más complejas con el tiempo. Los puntos finales de las APIs RESTful, por el contrario, están separados, lo que restringe las APIs RESTful a consultas simples.
Popularidad y Soporte de la Comunidad
GraphQL es un patrón arquitectónico de API y un lenguaje de consulta en crecimiento. Aunque todavía es joven, su tasa de adopción y su reserva de recursos están creciendo rápidamente, y ya abundan los recursos para los interesados en aprenderlo por sí mismos.
REST, por otra parte, ya cuenta con un amplio soporte de la comunidad y sigue siendo utilizado por empresas de todo tipo, desde las que construyen pequeños microservicios hasta las que crean complejas aplicaciones sociales y más allá.
En la actualidad, el concurso de popularidad entre GraphQL y REST es un empate. Ambas tecnologías siguen siendo ampliamente utilizadas y cuentan con el soporte de la comunidad de desarrolladores.
Curva de Aprendizaje
La curva de aprendizaje de GraphQL es empinada. Requiere un buen conocimiento del desarrollo de API y de la ingeniería de software en general. Un completo principiante tendrá dificultades para entender GraphQL lo suficientemente bien como para construir una aplicación compleja.
Por el contrario, REST es muy fácil de empezar y requiere menos conocimientos de dominio desde el principio. La API RESTful está bien integrada en la mayoría de los principales lenguajes de programación y marcos populares, lo que hace que su aprendizaje sea muy fácil.
Resumen
GraphQL es una nueva tecnología que sigue las huellas de los patrones arquitectónicos de las APIs RESTful, al igual que REST se introdujo para resolver los problemas de los patrones de las APIs SOAP.
GraphQL te ofrece respuestas más rápidas, un único punto final de la API para todas tus consultas y un esquema estricto para un acceso a los datos consistente. Estas razones son las que han hecho que empresas multimillonarias empiecen a pasarse a GraphQL, incluso en su fase inicial. Sin embargo, a pesar de sus limitaciones, el progenitor de GraphQL, REST, sigue manteniendo una fuerte presencia en el escenario.
En esta guía, hemos explorado todo lo que necesitas saber sobre GraphQL y las API RESTful, incluidas las ventajas e inconvenientes de cada tecnología, para ayudarte a decidir con seguridad cuál prefieres. También hemos hablado de los problemas conocidos de las API RESTful -como la búsqueda excesiva, la búsqueda insuficiente y los múltiples puntos finales- y de cómo GraphQL intenta resolver esos problemas y aumentar el rendimiento de tu aplicación.
Ahora tienes suficiente información para elegir si GraphQL o REST es apropiado para tu próximo proyecto. Haznos saber en la sección de comentarios qué construirás con el ganador que hayas elegido.
Deja una respuesta