{"id":45674,"date":"2025-12-02T17:39:59","date_gmt":"2025-12-02T16:39:59","guid":{"rendered":"\/ar\/tutoriales\/graphql-vs-rest"},"modified":"2025-12-02T17:39:59","modified_gmt":"2025-12-02T16:39:59","slug":"graphql-vs-rest","status":"publish","type":"post","link":"\/ar\/tutoriales\/graphql-vs-rest","title":{"rendered":"GraphQL vs. REST: \u00bfcu\u00e1l es el mejor para el desarrollo API?"},"content":{"rendered":"<p>API, el acr&oacute;nimo de Interfaz de programaci&oacute;n de aplicaciones, es un intermediario de software que permite que dos aplicaciones se comuniquen entre s&iacute;.&nbsp;Eso podr&iacute;a ser un servidor, un cliente o una aplicaci&oacute;n hablando con un servidor.&nbsp;<\/p><p>La siguiente l&iacute;nea de tiempo ilustra c&oacute;mo ha evolucionado a lo largo de los a&ntilde;os y sienta una gran base sobre c&oacute;mo se puede construir una API.&nbsp;REST sigue siendo una herramienta popular para crear API.&nbsp;<\/p><p>Sin embargo, en 2012, Facebook quer&iacute;a algo diferente a REST, y fue entonces cuando se introdujo GraphQL (Graph Query Language).&nbsp;<\/p><h2 class=\"wp-block-heading\" id=\"h-que-es-rest\"><strong>&iquest;Qu&eacute; es REST?<\/strong><\/h2><p>REST significa Transferencia de estado representacional, lo que significa que cada recurso tiene su propio punto final.&nbsp;Inicialmente, fue una disertaci&oacute;n publicada por Roy Fielding en 2000 y popularizada por compa&ntilde;&iacute;as como Twitter en 2006. REST es un concepto arquitect&oacute;nico para software basado en red.&nbsp;No tiene un conjunto oficial de herramientas, ninguna especificaci&oacute;n, no le importa particularmente si usas HTTP, AMQP, etc., y est&aacute; dise&ntilde;ado para desacoplar las API de los clientes.&nbsp;<\/p><h2 class=\"wp-block-heading\" id=\"h-principales-desafios-de-api-rest\"><strong>Principales desaf&iacute;os de API REST<\/strong><\/h2><p><strong>La API REST a veces requiere viajes de ida y vuelta m&uacute;ltiples.&nbsp;<\/strong>Esto se aplica cuando necesitamos mostrar algunos datos que deben consumirse desde diferentes puntos finales, y consumir datos de un solo punto final no es suficiente.&nbsp;La siguiente tabla ilustra tres endpoints:<\/p><figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>GET \/users<\/td><td>Lista todos los usuarios<\/td><\/tr><tr><td>GET \/users\/:id<\/td><td>Obtiene el usuario &uacute;nico con id: id<\/td><\/tr><tr><td>GET \/users\/:id\/projects<\/td><td>Obtiene todos los proyectos de un usuario<\/td><\/tr><\/tbody><\/table><\/figure><p>&iquest;Qu&eacute; pasa si en una aplicaci&oacute;n de cliente necesitamos buscar proyectos relacionados con ese usuario espec&iacute;fico y algunas tareas que tambi&eacute;n pueden estar relacionadas con el proyecto en s&iacute;?&nbsp;&iquest;Deber&iacute;a el equipo de back-end desarrollar algo extra?&nbsp;Existen las siguientes formas posibles de hacerlo:<\/p><ol class=\"wp-block-list\">\n<li>Para incluir una consulta y luego devolver las tareas a cada proyecto: GET \/users\/:id\/projects?include=tasks<\/li>\n\n\n\n<li>Para tener un punto final separado, proyectos de recursos y solicitar a una aplicaci&oacute;n cliente un filtrado de consultas basado en la identificaci&oacute;n del usuario: GET \/projects?userid=:id&amp;include=tasks<\/li>\n\n\n\n<li>Para incluir todos los datos posibles asociados con el usuario en un punto final: GET \/tasks?userid=:id<\/li>\n<\/ol><p><strong>Sobre-buscar y sub-buscar.&nbsp;<\/strong>Cuando es necesario devolver demasiados datos, la aplicaci&oacute;n cliente no los necesita todos.&nbsp;Los clientes no estar&aacute;n contentos si se les pide que descarguen informaci&oacute;n adicional que en realidad no necesitan.&nbsp;Por otro lado, al reducir el nivel de informaci&oacute;n en un servidor, se puede experimentar el problema de la obtenci&oacute;n insuficiente y se necesitar&aacute; otro extremo y recurso adicional en un servidor para obtener esos datos.&nbsp;La soluci&oacute;n es: GET \/users?fields=firstname,lastname.&nbsp;<\/p><p><strong>Dificultad para crear versiones y descartar campos que no son necesarios para nuevas versiones<\/strong>.&nbsp;Es dif&iacute;cil mantener las API REST cuando crecen con el tiempo y se solicitan diferentes requisitos para admitir diferentes versiones de aplicaciones y m&uacute;ltiples clientes.&nbsp;Entonces, por lo general, v1 se deja como est&aacute; y v2 se genera con una estructura de datos m&aacute;s nueva.&nbsp;Con GraphQL, podr&iacute;a hacerse sin control de versiones.&nbsp;GraphQL solo devuelve los datos solicitados expl&iacute;citamente, por lo que se pueden agregar nuevas capacidades a trav&eacute;s de nuevos tipos y nuevos campos en esos tipos sin generar un cambio importante.&nbsp;Esto ha llevado a una pr&aacute;ctica com&uacute;n de evitar continuamente cambios relevantes y servir una API sin versi&oacute;n.<\/p><p><strong>Datos no predecibles<\/strong>.&nbsp;Con REST, no se sabe qu&eacute; datos devolver&aacute; un servidor: qu&eacute; campos, cu&aacute;ntos de ellos, etc. Con GraphQL, el cliente solicita que se devuelvan campos espec&iacute;ficos.&nbsp;No importa si se trata de una consulta o una mutaci&oacute;n: t&uacute; tienes el control de lo que se devolver&aacute;.<\/p><h2 class=\"wp-block-heading\" id=\"h-que-es-graphql\"><strong>&iquest;Qu&eacute; es GraphQL?<\/strong><\/h2><p>GraphQL es un concepto m&aacute;s nuevo, lanzado p&uacute;blicamente por Facebook en 2015. Como una nueva forma de solicitar datos de un servidor, es un lenguaje de consulta, especificaci&oacute;n y colecci&oacute;n de herramientas dise&ntilde;adas para operar en un &uacute;nico punto final a trav&eacute;s de HTTP, optimizadas para el rendimiento y flexibilidad.<\/p><p>Esta tabla compara GraphQL y REST como dos enfoques para crear una API.&nbsp;Hablando en t&eacute;rminos generales, no se puede considerar una comparaci&oacute;n de manzana a manzana, sino m&aacute;s bien un paralelo de naranja a manzana, ya que REST es un est&aacute;ndar convencional para la planificaci&oacute;n de API y GraphQL es un lenguaje de consulta que ayuda a resolver problemas con las API.&nbsp;Sin embargo, ambos siguen siendo frutas. ?&nbsp;<\/p><p>La principal diferencia aqu&iacute; es que GraphQL es un lenguaje orientado al cliente.&nbsp;Tiene una arquitectura en la que la aplicaci&oacute;n front-end decide qu&eacute; datos obtener y cu&aacute;nto debe devolver el servidor.&nbsp;Mientras tanto, al usar REST, todo est&aacute; dise&ntilde;ado en el servidor, por lo que el servidor impulsa la arquitectura.&nbsp;<\/p><figure tabindex=\"0\" class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>GraphQL<\/strong><\/td><td><strong>REST<\/strong><\/td><\/tr><tr><td>Un lenguaje de consulta que ofrece eficiencia y flexibilidad para resolver problemas comunes al integrar API<\/td><td>Un estilo arquitect&oacute;nico visto en gran medida como un est&aacute;ndar convencional para el dise&ntilde;o de API.<\/td><\/tr><tr><td>Implementado a trav&eacute;s de HTTP usando un &uacute;nico punto final que proporcion&oacute; todas las capacidades del servicio expuesto<\/td><td>Implementado sobre un conjunto de URL donde cada uno de ellos expone un solo recurso<\/td><\/tr><tr><td>Utiliza una arquitectura impulsada por el cliente<\/td><td>Usuario una arquitectura basada en servidor<\/td><\/tr><tr><td>Carece de mecanismo de almacenamiento en cach&eacute; autom&aacute;tico<\/td><td>Utiliza el almacenamiento en cach&eacute; autom&aacute;ticamente<\/td><\/tr><tr><td>SIN versiones API<\/td><td>Soporta m&uacute;ltiples versiones API<\/td><\/tr><tr><td>Solo representaci&oacute;n JSON<\/td><td>Soporta m&uacute;ltiples formatos de datos<\/td><\/tr><tr><td>Solo una herramienta se utiliza predominantemente para la documentaci&oacute;n: GraphiQL<\/td><td>Amplia gama de opciones para la documentaci&oacute;n automatizada, como OpenAPI y API Blueprint<\/td><\/tr><tr><td>Complica el manejo de c&oacute;digos de estado HTTP para identificar errores<\/td><td>Utiliza c&oacute;digos de estado HTTP para identificar errores f&aacute;cilmente<\/td><\/tr><\/tbody><\/table><\/figure><h2 class=\"wp-block-heading\" id=\"h-razones-para-usar-graphql\"><strong>Razones para usar GraphQL<\/strong><\/h2><p>Hay tres razones principales por las que podr&iacute;amos querer considerar el uso de GraphQL en lugar de REST:<\/p><ul class=\"wp-block-list\">\n<li><strong>Rendimiento de la red.&nbsp;<\/strong>Si queremos aumentar el rendimiento de la red enviando menos datos o enviando solo la informaci&oacute;n que necesitamos para los clientes.&nbsp;<\/li>\n\n\n\n<li><strong>La elecci&oacute;n de dise&ntilde;o &ldquo;Incluir vs. Endpoint&rdquo;.&nbsp;<\/strong>Existe una elecci&oacute;n complicada entre&nbsp;<em>incluir la solicitud<\/em>&nbsp;o&nbsp;<em>crear un punto final adicional.&nbsp;<\/em>Con GraphQL, ese problema se resuelve gracias a las funciones de&nbsp;<em>esquema<\/em>&nbsp;y&nbsp;<em>resoluci&oacute;n<\/em>.&nbsp;Entonces, el cliente tiene el control de qu&eacute; datos deben devolverse.<\/li>\n\n\n\n<li><strong>Manejo de diferentes tipos de clientes.&nbsp;<\/strong>Imagina que tienes una API y todos los clientes (aplicaci&oacute;n de iOS, aplicaci&oacute;n de Android, aplicaci&oacute;n web, etc.) son completamente diferentes entre s&iacute;: necesitan una estructura o cantidad de datos completamente diferente que devuelve el servidor.&nbsp;Con el enfoque REST, es posible que debas generar una API separada.&nbsp;Por el contrario, con GraphQL, no necesitar&aacute;s hacerlo porque puedes hacer que todo se devuelva desde un &uacute;nico punto final.&nbsp;<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-como-empezar\"><strong>&iquest;C&oacute;mo empezar<\/strong>?<\/h2><p>Este es un desglose de c&oacute;mo se crea una consulta.&nbsp;Se consideran tres partes principales: 1) tipo de operaci&oacute;n, 2) punto final de la operaci&oacute;n, 3) campos solicitados.<\/p><h2 class=\"wp-block-heading\" id=\"h-terminos-a-aprender\"><strong>T&eacute;rminos a aprender<\/strong><\/h2><p>Independientemente de la implementaci&oacute;n que elijas, ya que hay muchos lenguajes, GraphQL no solo est&aacute; disponible en JavaScript o Node: puedes usar PHP, Python, JAVA, Go y otros.&nbsp;Cada idioma tiene su propia implementaci&oacute;n de GraphQL, por lo que no necesitas crear todo desde cero.&nbsp;Hay herramientas y paquetes que puedes emplear, y esos t&eacute;rminos son casi los mismos en todos ellos, por lo que podr&iacute;a valer la pena aprenderlos si quieres crear una API usando GraphQL:<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Types.png\" alt=\"C&oacute;digo\" class=\"wp-image-1863\"><\/figure><p><strong>Tipos.&nbsp;<\/strong>El modelo de datos en GraphQL se representa en tipos, que est&aacute;n fuertemente tipados.&nbsp;Debe haber un mapeo 1 a 1 entre tus modelos y los c&oacute;digos GraphQL.&nbsp;Puedes pensar en esto como una tabla de base de datos donde la tabla de usuario tiene campos como id, nombre, apellido, correo electr&oacute;nico, proyectos.&nbsp;Por lo tanto, las cosas para recordar incluyen ese signo de exclamaci&oacute;n que dice que un identificador (id) no puede ser anulable o, en otras palabras, tiene que ser algo all&iacute;, ya que es un campo obligatorio.&nbsp;<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Queries-1024x283.png\" alt=\"C&oacute;digo\" class=\"wp-image-1864\"><\/figure><p><strong>Consultas.&nbsp;<\/strong>Las consultas definen qu&eacute; consultas puedes ejecutar en tu API de GraphQL.&nbsp;Por convenci&oacute;n, debe haber un RootQuery, que contiene todas las consultas existentes.&nbsp;En el ejemplo, el comentario aqu&iacute; muestra c&oacute;mo se ve en una API REST.&nbsp;Entre par&eacute;ntesis entre corchetes, vemos un argumento que tiene que ser un identificador &uacute;nico, y despu&eacute;s de dos puntos est&aacute; el tipo de usuario.&nbsp;Muestra lo que se debe devolver cuando realizamos esta consulta, por lo que devuelve el usuario.&nbsp;La consulta del proyecto devolver&aacute; el proyecto, la consulta de la tarea cambiar&aacute; la lista de tareas, etc.&nbsp;<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Mutations-1024x137.png\" alt=\"C&oacute;digo\" class=\"wp-image-1866\"><\/figure><p><strong>Mutaciones.&nbsp;<\/strong>Si las consultas son solicitudes GET, las mutaciones se pueden ver como POST |&nbsp;PARCHE |&nbsp;PONER |&nbsp;Solicitudes DELETE que modifican los datos.&nbsp;El ejemplo incluye mutaciones de &ldquo;createUser&rdquo;, &ldquo;updateUser&rdquo;, &ldquo;removeUser&rdquo;.<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Input.png\" alt=\"C&oacute;digo\" class=\"wp-image-1867\"><\/figure><p><strong>Aporte.&nbsp;<\/strong>El tipo de entrada de usuario es un tipo de usuario sin los campos de identificaci&oacute;n y proyectos.&nbsp;Observa la palabra clave&nbsp;<em>input<\/em>&nbsp;en lugar de&nbsp;<em>type<\/em>.&nbsp;Puedes pensar en esto como un formulario en una p&aacute;gina donde necesitas ingresar algunos datos y el tipo de informaci&oacute;n que debe ingresarse para crear ese perfil de usuario.<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Resolvers.png\" alt=\"C&oacute;digo\" class=\"wp-image-1868\"><\/figure><p><strong>Resolutores.&nbsp;<\/strong>La funci&oacute;n de resoluci&oacute;n proporciona un conjunto espec&iacute;fico de instrucciones para convertir las operaciones de GraphQL en datos.&nbsp;Es b&aacute;sicamente una funci&oacute;n de controlador, la l&oacute;gica de lo que debe devolverse (resolutores de consultas) cuando ocurre esa consulta y un usuario solicita datos, y los resolutores de mutaci&oacute;n se utilizan cuando un usuario busca actualizar o eliminar datos.<\/p><figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.hostinger.com\/blog\/wp-content\/uploads\/sites\/4\/2021\/07\/Schema.png\" alt=\"C&oacute;digo\" class=\"wp-image-1869\"><\/figure><p><strong>Esquema.&nbsp;<\/strong>Con tipos, consultas y mutaciones, definimos un esquema GraphQL, que es lo que el extremo de GraphQL expone al mundo.<\/p><h2 class=\"wp-block-heading\" id=\"h-recursos-a-revisar\"><strong>Recursos a revisar<\/strong><\/h2><p>Aqu&iacute; hay dos recursos principales para profundizar en GraphQL:<\/p><ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>GraphQL.org<\/strong><\/a>.&nbsp;Dedicado a aprender todos los conceptos b&aacute;sicos y la especificaci&oacute;n real de GraphQL.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.howtographql.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>&iquest;How to GraphQL?&nbsp;<\/strong><\/a>Dedicado a aprender acerca de las implementaciones.&nbsp;Por ejemplo, si buscas informaci&oacute;n sobre el servidor Apollo, esto te dar&aacute; una idea de qu&eacute; marcos front-end se pueden usar para consumir los datos de esa API.&nbsp;No es necesario usar ninguna de las herramientas o bibliotecas para que el front-end consuma la API; puedes realizar una solicitud XmlHttp regular, pero debes realizar una solicitud POST a ese punto final y proporcionar la consulta en el cuerpo, que es el GraphQL.&nbsp;<\/li>\n<\/ul><p>La API del servidor GraphQL se puede usar como puerta de enlace a otros micro-servicios, hablando directamente con la base de datos u otras API REST.&nbsp;Por lo tanto, podr&iacute;as tener varias API REST, obtener esos datos y convertirlos en una &uacute;nica fuente de informaci&oacute;n.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>API, el acr&oacute;nimo de Interfaz de programaci&oacute;n de aplicaciones, es un intermediario de software que permite que dos aplicaciones se comuniquen entre s&iacute;.&nbsp;Eso podr&iacute;a ser un servidor, un cliente o una aplicaci&oacute;n hablando con un servidor.&nbsp; La siguiente l&iacute;nea de tiempo ilustra c&oacute;mo ha evolucionado a lo largo de los a&ntilde;os y sienta una gran [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/ar\/tutoriales\/graphql-vs-rest\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":353,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"","rank_math_description":"","rank_math_focus_keyword":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-45674","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"hreflangs":[{"locale":"es-ES","link":"https:\/\/www.hostinger.com\/es\/tutoriales\/graphql-vs-rest","default":0},{"locale":"es-AR","link":"https:\/\/www.hostinger.com\/ar\/tutoriales\/graphql-vs-rest","default":0},{"locale":"es-MX","link":"https:\/\/www.hostinger.com\/mx\/tutoriales\/graphql-vs-rest","default":0},{"locale":"es-CO","link":"https:\/\/www.hostinger.com\/co\/tutoriales\/graphql-vs-rest","default":0}],"acf":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/posts\/45674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/users\/353"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/comments?post=45674"}],"version-history":[{"count":0,"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/posts\/45674\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/media?parent=45674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/categories?post=45674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/ar\/tutoriales\/wp-json\/wp\/v2\/tags?post=45674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}