Beruflich Dokumente
Kultur Dokumente
Cochabamba – Bolivia
2018
Dedicado a mis padres,
ejemplo de virtudes y
perseverancia.
Índice de Contenidos
Resumen .........................................................................................................................................................1
Introducción ...................................................................................................................................................2
1. Generalidades ........................................................................................................................................4
1.1. Antecedentes Generales ................................................................................................................4
1.2. Antecedentes Específicos ...............................................................................................................4
2. Metodología ...........................................................................................................................................6
3. Desarrollo de Aplicaciones Web con API REST .......................................................................................6
3.1. REST ................................................................................................................................................6
3.2. Recursos, Representaciones y Solicitudes .....................................................................................6
3.3. Restricciones ..................................................................................................................................7
3.3.1. Cliente - Servidor ....................................................................................................................7
3.3.2. Sin Estado (Stateless) .............................................................................................................7
3.3.3. Cacheable ...............................................................................................................................8
3.3.4. Interfaz Uniforme ...................................................................................................................8
3.3.5. Sistema de Capas....................................................................................................................8
3.3.6. HATEOAS ................................................................................................................................9
3.4. Establecer cómo desarrollar un servicio web con REST .................................................................9
3.4.1. Diseñando un Servicio Web RESTful ....................................................................................10
3.4.2. Jersey: JAX-RS .......................................................................................................................18
3.4.3. Arquitectura de Servicios Web .............................................................................................25
3.4.4. Capa de Persistencia.............................................................................................................26
4. Desarrollo de Aplicaciones Web Usando GraphQL ..............................................................................28
4.1. Que es GraphQL ...........................................................................................................................28
4.2. Historia de GraphQL .....................................................................................................................28
4.3. Consultas y Resultados Precisos...................................................................................................29
4.4. Muchos recursos con una solicitud ..............................................................................................30
4.4.1. Alias ......................................................................................................................................31
4.4.2. Fragmentación......................................................................................................................31
4.4.3. Variables ...............................................................................................................................32
4.4.4. Directivas ..............................................................................................................................33
4.4.5. Mutaciones ...........................................................................................................................34
4.5. El Sistema de Tipo ........................................................................................................................34
4.5.1. Tipos de Objetos...................................................................................................................34
4.5.2. Tipos Escalares .....................................................................................................................35
4.5.3. Tipos de Consulta y Mutaciones...........................................................................................35
4.5.4. Tipos de Suscripción .............................................................................................................35
4.5.5. Tipos de Interfaz y Unión .....................................................................................................35
4.5.6. Tipos de Entrada...................................................................................................................36
5. REST vs. GraphQL .................................................................................................................................36
5.1. Consultas ......................................................................................................................................36
5.2. Uso de la API.................................................................................................................................37
5.3. Caché ............................................................................................................................................38
5.4. Evolución de la API .......................................................................................................................38
5.5. GraphQL o REST............................................................................................................................39
6. Conclusiones.........................................................................................................................................40
7. Bibliografía ...........................................................................................................................................41
Índice de Figuras
Figura 1: Arquitectura del Servicio web .......................................................................................................25
Figura 2: Consulta de GraphQL ....................................................................................................................30
Figura 3: Consulta GraphQL con sub-campo Friends ...................................................................................30
Figura 4: Consulta GraphQL con Argumentos ..............................................................................................30
Figura 5: Consulta GraphQL con Alias ..........................................................................................................31
Figura 6: Consulta GraphQL con Fragmentos ..............................................................................................32
Figura 7: Consulta GraphQL con Variables ...................................................................................................33
Figura 8: Consulta GraphQL con Directivas ..................................................................................................33
Figura 9: Consulta GraphQL con Mutaciones ...............................................................................................34
Índice de Tablas
Tabla 1: Representación XML de un usuario ................................................................................................12
Tabla 2: Representación XML de una lista de usuarios ................................................................................13
Tabla 3: Representación XML de un mensaje ..............................................................................................13
Tabla 4: Representación de una lista de mensajes ......................................................................................14
Tabla 5: Representación JSON de un usuario...............................................................................................15
Tabla 6: Representación JSON de una lista de usuarios...............................................................................15
Tabla 7: Representación JSON de un mensaje .............................................................................................16
Tabla 8: Representación JSON de una lista de mensajes .............................................................................17
Tabla 9: Ejemplo anotación @Path ..............................................................................................................19
Tabla 10: Ejemplo anotación @Path con variable .......................................................................................19
Tabla 11: Ejemplo anotación @GET .............................................................................................................19
Tabla 12: Ejemplo anotación @POST ...........................................................................................................20
Tabla 13: Ejemplo anotación @PUT .............................................................................................................20
Tabla 14: Ejemplo anotación @DELETE .......................................................................................................20
Tabla 15: Ejemplo @GET lista de usuarios ...................................................................................................21
Tabla 16: Ejemplo @GET lista de mensajes .................................................................................................21
Tabla 17: Ejemplo de variables.....................................................................................................................22
Tabla 18: Ejemplo de multiples variables .....................................................................................................22
Tabla 19: Ejemplo anotación @Consumes ...................................................................................................23
Tabla 20: Ejemplo anotación @Produces ....................................................................................................24
Tabla 21: Formulario para crear Nuevo Usuario ..........................................................................................24
Tabla 22: Ejemplo anotación @FormParam ................................................................................................25
Tabla 23: Funciones Básicas CRUD para Db4 ...............................................................................................27
Resumen
En la actualidad la mayoría de las aplicaciones disponen de una API REST para la creación de
servicios profesionales. Hay cientos de empresas que generan negocio gracias a REST y las
APIs REST. Sin ellas todo este crecimiento sería prácticamente imposible. Esto es así porque
REST es el estándar más lógico, eficiente y habitual en la creación de APIs para servicios de
internet.
Por lo tanto, la presente monografía pretende explicar cómo desarrollar aplicaciones web usando
API REST y GraphQL para comprender de forma más sencilla las diferencias entre ambas
tecnologías y de esta forma tener conocimientos más sólidos a la hora de decidir usar una de
estas tecnologías.
1
Introducción
La relación entre internet y sus usuarios ha crecido y evolucionado significativamente con el paso
del tiempo. En sus inicios el internet solo proveía contenido estático: páginas HTML que
solamente mostraban texto estructurado, imágenes y enlaces. Pero ahora los usuarios pueden
interactuar con las páginas, por medios como el chat, foros, email, redes sociales, etc.
Desde los años 90 el internet ha tenido una masiva expansión originado por un constante
incremento de usuarios. El gran incremento de usuarios también atrajo la atención de las
compañías, quienes han intentado crear servicios o mover sus negocios al internet. Debido a la
necesidad de consumir y manipular la información, algunas compañías como los ISPs, crearon
portales para integrar y clasificar su información, de esta manera los usuarios podrían usarlos
como un solo punto de acceso.
Junto con la evolución del internet, la tecnología también tuvo un gran avance, hoy en día vivimos
en un mundo lleno de tecnología. Casi todo el mundo es miembro de una red social como
Facebook, Twitter o LinkedIn y tiene un perfil público en internet. Además, con la aparición de los
teléfonos inteligentes, la forma de comunicación en la sociedad sufrió un cambio significativo. Los
primeros dispositivos portátiles han iniciado una gran popularidad, desde bandas inteligentes
(smartbands) hasta joyas inteligentes (Smart Jewellery), sin olvidar relojes y gafas. Cada
dispositivo ha empezado a interconectarse y conectarse al internet. La gran mayoría de las
compañías y expertos en tecnología están de acuerdo que de aquí a un tiempo millones de
dispositivos estarán conectados a internet lo que se denomina como el IoT (The Internet of Things
– El Internet de las Cosas).
Debido a esta evolución del internet, las redes sociales, la aparición de dispositivos inteligentes
móviles y del creciente número de usuarios, se vio la necesidad de contar con una arquitectura
simple y sencilla que permita a las compañías mostrar sus productos en diferentes dispositivos e
interactuar con otras páginas y usuarios, esa arquitectura es la denominada API.
2
Un API, entonces es en esencia un contrato. Una vez que dicho contrato es implementado, los
desarrolladores son tentados a usar la API porque saben que pueden confiar en ella. El contrato
incrementa la confidencialidad, el cual incrementa el uso. El contrato también hace la conexión
entre proveedor y consumidor mucho más eficiente ya que las interfaces son documentadas,
consistentes y predecibles. (Jacobson, Brail, & Woods, 2012)
Una de las arquitecturas preferidas para crear APIs y que ha ganado mucha popularidad es REST
por lo simple y fácil que es crear un API, pero recientemente se vieron algunas limitaciones en el
uso de REST, especialmente en dispositivos móviles y es ahí donde entra lo que se conoce como
GraphQL que es un lenguaje de consultas para los APIs. Al ser una tecnología casi nueva no se
tiene mucha información al respecto, por lo que la presente monografía pretende ayudar al lector
con esto.
El resultado de la siguiente monografía ayudará a las personas que quieren implementar un API
o aplicación web, a tener más conocimiento sobre lo que es el desarrollo de un API con REST
API y GraphQL.
Se dará una explicación de lo que es REST API y GraphQL, las características de REST,
GraphQL y una explicación con ejemplos de código de cómo desarrollar servicios web usando
ambas arquitecturas.
El lenguaje de programación que se usará será Java, no será necesario una interfaz de usuario
porque lo que se pretende mostrar es el desarrollo del API.
3
1. Generalidades
API viene del inglés que significa Application Programming Interface (Interfaz de
Programación de Aplicaciones). Un API ayuda a exponer un servicio empresarial o un activo
empresarial a los desarrolladores que están construyendo una aplicación. Aplicaciones
pueden ser instalados y accedidos desde una variedad de dispositivos, tales como teléfonos
inteligentes, tablets, kiosks, consolas de juegos, autos, y de más dispositivos. La API de
Google Maps usada para localizar lugares en un mapa, la API de Facebook para juegos o
compartir contenido, y el API de Amazon para tener información de productos son algunos
ejemplos de APIs. Los desarrolladores usan estas APIs para crear aplicaciones innovadoras
y geniales, que pueden enriquecer la experiencia de usuario. Por ejemplo, los desarrolladores
pueden usar las APIs de diferentes compañías de turismo para construir una aplicación que
compare y muestre los precios de los mismos hoteles de las diferentes compañías de turismo.
De esta forma el usuario podrá tomar una buena decisión y registrarse en el hotel a través de
la compañía que provee la mejor oferta.
Un API es una interfaz de software a software que define un contrato para las aplicaciones
para comunicarse unos a otros sobre una red sin la necesidad de la interacción del usuario.
El termino REST viene de la disertación PhD de Roy Fielding, publicado en 2000, y significa
Representational State Transfer - Transferencia de Estado Representacional. REST por sí
mismo no es una arquitectura, REST es un conjunto de restricciones que, al ser aplicados al
diseño de un sistema, crea un estilo arquitectónico de software. Al implementar todas las
pautas de REST definidas en el trabajo de Fielding, se termina con un sistema que tiene roles
específicos para los datos, componentes, hipervínculos, protocolos de comunicación y datos
de los consumidores.
Fielding llego a REST evaluando todos los recursos de redes y tecnologías disponibles para
crear aplicaciones distribuidas. Sin restricciones todo y nada vale, lo que nos lleva a
desarrollar aplicaciones que son difíciles de mantener y extender. Con esto en mente él
observó en un documento de estilos arquitectónicos de aplicaciones distribuidas que
empezaba con lo que él llama el null space – el espacio nulo, el cual representa la
disponibilidad de cada tecnología y cada estilo de desarrollo de aplicaciones sin reglas o
límites – y termina con las siguientes restricciones que definen un sistema RESTful.
• Tiene que ser uniformemente accesible, cada recurso debe tener una dirección única
y un punto de acceso válido.
• Debe proporcionar código a pedido, aunque ésta es una restricción opcional, las
aplicaciones pueden ser extensibles en tiempo de ejecución al permitir la descarga de
código bajo demanda, por ejemplo, Applets de Java.
(Sandoval, 2009)
GraphQL proporciona una interfaz común entre aplicaciones cliente – servidor para
obtener y manipular datos, GraphQL es definido como un lenguaje de consulta de datos
en tiempo de ejecución, es un lenguaje que se puede enseñar a un cliente de software, el
cliente o la aplicación puede entonces comunicarse con el servicio de back-end que
también entiende GraphQL para pedir datos, y es en tiempo de ejecución, porque
GraphQL es una capa de ejecución que una aplicación de servidor puede usar para
comprender y responder a cualquier solicitud realizada con GraphQL. Esta capa actúa
como un simple traductor del lenguaje GraphQL.
(Buna, 2016)
GraphQL surge con la idea de resolver algunos problemas que tienen los Servicios REST.
La idea original era permitir que los clientes de los servicios REST pudieran decidir qué
información le interesa a un particular end-point. Quienes han trabajado desarrollando
servicios REST, sabrán que muchas veces la cantidad de información que termina
devolviendo un end-point particular es enorme, y no todos los casos de uso la consumen
en su totalidad.
5
• Con REST, se consulta o muchas o muy poca información. Con GraphQL se
consulta exactamente lo que se necesita
2. Metodología
Los aspectos más importantes de REST son: está basada en un conjunto de restricciones que al
ser aplicadas correctamente da como resultado una arquitectura REST bien estructurada, que
facilita la creación de un API REST
3.1. REST
REST viene del inglés Representational State Transfer que significa Transferencia de Estado
Representacional, fue por primera vez introducido al mundo en el año 2000 por Roy Fielding
en su disertación doctoral (Doglio, 2015). En los últimos años REST ha sido el modelo de
diseño de servicios web dominante debido a su simplicidad sobre otros diseños disponibles
en ese entonces. REST es un concepto arquitectónico que tiene como objetivo, ayudar a crear
y organizar sistemas, lo que significa que no es un estándar con reglas escritas en piedra,
sino un estilo para mostrar cómo se comporta un buen sistema (Doglio, 2015). La arquitectura
tiene como objetivo crear sistemas de rendimiento, transformables y duraderos.
Como su nombre sugiere REST transfiere una representación de sus recursos. Los recursos
definen el tipo de información transferida, las acciones y servicios de un sistema. Puede ser
cualquier elemento conceptualizado, un texto o una imagen, por ejemplo. El cliente envía un
encabezado específico (header) que solicita un recurso al servidor. La API es responsable de
encontrar la mejor representación de ese recurso en el lado del servidor. Los recursos se
pueden representar de muchas formas. Los datos se pueden representar, por ejemplo, como
6
un archivo JSON o XML, y un recurso puede tener múltiples representaciones. El cliente leerá
y analizará la información y solicitará la forma más adecuada del recurso. (Doglio, 2015)
Un recurso tiene un identificador en forma de una URL (Doglio, 2015). Las URLs utilizadas
deben ser lógicas y accesibles por otras partes del sistema, así como también ser únicas para
un recurso específico. Los recursos también tienen metadatos para describirlos, por ejemplo,
un tipo de contenido. Los recursos se consultan con el identificador URL y una solicitud
(Request). La solicitud GET se utilizará para consultas con fines de solo lectura y para
consultas más complejas que alteran la etapa de los datos (Crear, Actualizar y Borrar) a
menudo se usa POST. (Uzayr, 2016).
• GET /api/resource.json
• GET /api/resource.xml
Además de los verbos mencionados anteriores, PUT se usa para crear-editar y DELETE para
eliminar un recurso. Algunas acciones, como buscar y filtrar recursos, no se realizan
directamente con ninguna de las solicitudes mencionadas. Estas acciones complejas se
realizan con un signo "?" Que se puede aplicar a todos los verbos. (Doglio, 2015)
3.3. Restricciones
REST define un sistema con restricciones. Estas restricciones se discuten en los siguientes
subcapítulos. Al agregar las siguientes restricciones una a una, desde la primera hasta la
última, a todos los componentes, se alcanzará la armonía en las interacciones del sistema.
(Doglio, 2015).
Esta restricción describe la naturaleza básica de las APIs. El servidor está a cargo de los
servicios, y la solicitud de sus servicios. El cliente realiza las solicitudes al servidor con
respecto a sus servicios. Esto separa el código del front-end (Código del lado del cliente)
y el código del lado del servidor que almacena y procesa los datos. Permitiendo así un
desarrollo independiente y una evolución para ambos. (Doglio, 2015)
Las solicitudes provenientes del cliente deben incluir toda la información necesaria para
que el servidor entienda completamente esa solicitud. Esto mejorará la supervisión y
7
confiabilidad del sistema. También significa que los datos no se almacenarán entre
solicitudes, lo que se traduce en una liberación de recursos mucho más rápida y una
implementación más sencilla. (Doglio, 2015).
3.3.3. Cacheable
Las respuestas a las solicitudes deben almacenarse en caché. Todos los datos solicitados
ya listos o consultadas anteriormente se pueden obtener desde la capa de caché que se
encuentra en el cliente o en el servidor. Esto resulta en un rendimiento más rápido. La
desventaja de esto puede ser que, si el almacenamiento en caché está mal diseñado,
posiblemente los datos devueltos pueden dejar de estar actualizados. (Doglio, 2015).
Establecer una interfaz uniforme para los componentes de un sistema simplificará las
interacciones entre el cliente y el servidor. Deben utilizarse identificadores únicos para los
recursos y acciones CRUD (create, retrieve, update, delete - crear, recuperar, actualizar,
eliminar) proporcionadas para las solicitudes, dando a los clientes independientes un
conjunto claro de reglas a seguir al implementar la aplicación (Doglio, 2015). Teniendo en
cuenta que HTTP no es el único protocolo para REST, esto se puede hacer con rutas
HTTP únicas para cada recurso (/api/resource), así como también usando verbos HTTP
(GET, PUT, POST, DELETE) para las interacciones.
Esta restricción puede tener su lado negativo. La interfaz uniforme estandarizará todas las
comunicaciones, incluso si una forma más adecuada estaría disponible para una
determinada pieza de software. Cuando se usa REST con mayor frecuencia y se aleja de
los sistemas basados en web, donde se optimiza REST, el rendimiento puede
perjudicarse. (Doglio, 2015).
Separar los componentes del sistema en múltiples capas puede simplificar el sistema,
mejorar la seguridad y nivelar las cargas de tráfico. También permite añadir nuevas capas
y eliminar las existentes o modificarlas sin alterar con todo el sistema.
8
3.3.6. HATEOAS
El end-point raíz expone enlaces que se utilizan a lo largo de la transición del cliente en
el sistema. No todos los enlaces son accesibles desde todo end-point. La API solo
devuelve los enlaces necesarios para ese caso de uso particular. El cliente aún tendrá
acceso a todo lo expuesto en el end-point raíz para mostrar información al usuario final.
(Doglio, 2015).
9
3.4.1. Diseñando un Servicio Web RESTful
Los principios de diseño de Servicios Web RESTful se pueden resumir en los siguientes
cuatro pasos:
Este proceso de diseño no es estático. Estos son pasos iterativos que gravitan alrededor
de los recursos. Por ejemplo: durante el paso de definición de la URI se descubre que una
de las respuestas de la URI no está cubierta en uno de los recursos que se han
identificado. Luego se vuelve a definir un recurso adecuado, sin embargo, en la mayoría
de los casos, se encuentra que los recursos que ya se tienen cubren la mayoría de las
necesidades, y solo se tiene que combinar los recursos existentes en un meta-recurso
para atender el nuevo requisito. (Sandoval, 2009)
El Servicio Web RESTful que se diseñará en esta monografía es una red social similar a
Twitter, este ejemplo y el código fueron obtenidos del libro RESTful Java Web Servicies
de Jose Sandoval.
10
3.4.1.1. Requisitos del Servicio Web de Ejemplo
• Un usuario web crea una cuenta con un nombre de usuario y contraseña (crear
una cuenta significa que el usuario ya está registrado).
• Los usuarios registrados y no registrados ven todas las entradas del blog.
Fuera de los casos de uso mencionados anteriormente, ahora se necesita definir los
recursos del servicio. De la lectura de los requisitos se ve que se necesitan usuarios
y mensajes. Los usuarios aparecen de dos maneras: un solo usuario y una lista de
usuarios. Además, los usuarios pueden publicar entradas de Blog en forma de
mensajes de no más de 140 caracteres. Esto significa que se necesita recursos para
un solo mensaje y una lista de mensajes. En resumen, se identifican los siguientes
recursos:
• Usuario
• Lista de Usuarios
• Mensaje
• Lista de Mensajes
11
de HTTP. Debido a la flexibilidad de HTTP, cualquier flujo binario puede ser
transferido, pero se recomienda usar estructuras como XML y JSON.
Usuarios
<user>
<username></username>
<password></password>
<link></link>
</user>
Tabla 1: Representación XML de un usuario
Fuente: (Sandoval, 2009)
12
Como parte de un recurso de usuario, se almacena solo un nombre de usuario y
una contraseña. El nombre de usuario es único en el contexto del sistema y se
utiliza para identificar de forma única a cada usuario. El elemento de enlace, que
apunta al servicio web, se asigna cuando se crea el recurso o cuando se crea una
representación para el transporte (para el servicio de muestra, se permite que el
back-end cree el enlace).
<users>
<count></count>
<link></link>
<user>
<username></username>
<password></password>
<link></link>
</user>
...
<user>
<username></username>
<password></password>
<link></link>
</user>
</users>
Tabla 2: Representación XML de una lista de usuarios
Fuente: (Sandoval, 2009)
Mensajes
<message>
<messageID></messageID>
<content></content>
<link></link>
<user>
<username></username>
<password></password>
<link></link>
</user>
</message>
Tabla 3: Representación XML de un mensaje
Fuente: (Sandoval, 2009)
13
Un mensaje necesita un ID de mensaje, el cuerpo del mensaje (el elemento de
contenido) y el usuario que publicó el mensaje. Tenga en cuenta que, dependiendo
de lo que se esté haciendo con el mensaje, no pasamos toda la información del
recurso de un lado a otro. Por ejemplo, cuando se está creando un mensaje en la
capa del cliente, no se sabe cuál es el valor para messageID. Por lo tanto, todavía
se debe pasar la estructura del mensaje al servicio, pero el servicio web sabrá que
cualquier valor de ID de mensaje debe ignorarse, porque, en este caso, lo creará
la capa de almacenamiento.
<messages>
<count></count>
<link></link>
<message>
<messageID></messageID>
<content></content>
<link></link>
<user>
<username></username>
<password></password>
<link></link>
</user>
</message>
...
<message>
<messageID></messageID>
<content></content>
<link></link>
<user>
<username></username>
<password></password>
<link></link>
</user>
</message>
</messages>
Tabla 4: Representación de una lista de mensajes
Fuente: (Sandoval, 2009)
14
3.4.1.3.2. Representaciones en JSON
Usuarios
{
"user":{
"username":"john",
"password":"password",
"link":"/users/john"
}
}
Tabla 5: Representación JSON de un usuario
Fuente: (Sandoval, 2009)
{
"users-result":{
"count":"6",
"users":[
{
"username":"john",
"password":"password",
"link":"/users/john"
},
...,
{
"username":"jane",
"password":"password",
"link":"/users/jane"
}
]
}
}
Tabla 6: Representación JSON de una lista de usuarios
Fuente: (Sandoval, 2009)
Mensajes
15
{
"message":{
"messageID":"some-id",
"content":"some content",
"link":"/messages/some-id",
"user":{
"user":{
"username":"john",
"password":"password",
"link":"/users/john"
}
}
}
}
Tabla 7: Representación JSON de un mensaje
Fuente: (Sandoval, 2009)
{
"messages-result":{
"count":"6",
"link":"/messages",
"messages":[
{
"messageID":"some-id",
"content":"some content",
"link":"/messages/some-id",
"user":{
"username":"john",
"password":"password",
"link":"/users/john"
}
},
...,
{
"messageID":"someid2",
"content":"some content",
"link":"/messages/some-id2",
"user":{
"username":"jane",
"password":"password",
"link":"/users/jane"
}
}
]
}
16
}
Tabla 8: Representación JSON de una lista de mensajes
Fuente: (Sandoval, 2009)
El siguiente paso implica la definición de URIs. Este es un paso crucial, ya que las
URIs definen la API y es probable que se quiera que el servicio web sea público.
Lo primero que se necesita es una dirección web. En este caso se asume que se
utilizará la máquina de desarrollo que se ejecuta en http://localhost:8080/
La nomenclatura de URI RESTful cae bajo el tema de las plantillas URI y las siguientes
convenciones son ampliamente utilizadas. Primero, para los elementos o
identificadores que no cambian, se encuentra que la palabra clave es parte del URI
real; por ejemplo, se usa users como el URI para una lista de todos los usuarios. En
segundo lugar, se usa claves o palabras clave dinámicas para ser encerrados en { y
}. Aplicando estas convenciones, la lista de URIs para usuarios tiene el siguiente
aspecto: (Sandoval, 2009)
17
• http://localhost:8080/messages/users/{username}: con el método GET, esta
URI devuelve una lista de todos los mensajes para un usuario con un nombre
de usuario identificador; no se admiten los métodos POST, PUT o DELETE
(Sandoval, 2009)
En el mundo de los servicios web RESTful, se tienen algunos Frameworks puros de Java
RESTful disponibles. Entre ellos se tiene Jersey, la implementación de referencia de la
API de Java Sun para servicios web RESTful, más conocida comúnmente como JAX-RS.
Para el ejemplo que se está diseñando se usará Jersey para implementar el servicio web.
3.4.2.1. JAX-RS
La tecnología Java siempre fue parte de las soluciones de servicios web, pero se limitó
a WSDL y SOPA. Con la llegada de REST, el proceso de la comunidad de Java (JCP)
inicio el proyecto JAX-RS con el objetivo de crear una API para servicios web RESTful
de Java. La API también se conoce como JAX-311 o JAX-RS. Esta especificación es
utilizada por cualquier persona que desee crear un Framework Java que se adhiera a
todas las restricciones REST que se han analizado.
El uso de anotaciones permite crear recursos de Jersey con la misma facilidad con
que se desarrolla POJOs (Plain Old Java Objects – Objetos de Java Antiguos y
Simples). En otras palabras, se deja la interceptación de las solicitudes HTTP y las
negociaciones al Framework y así concentrarse en las reglas del negocio necesarias
para resolver el problema. (Sandoval, 2009)
3.4.2.2. Anotaciones
Un recurso de Jersey es una simple clase de Java dentro del contexto de una
aplicación web que usa la anotación @Path para definir una URI. El valor de la
anotación es el URI relativo al contexto de la aplicación web, tal como se
implementa en el servidor web. (Sandoval, 2009)
18
3.4.2.2.2. URIs
Cada recurso de Jersey tiene una URI que lo señala. Un recurso se identifica con
la anotación @Path.
@Path
Uno de los URI que se definió en la especificación de servicio web es /users (este
URI apunta a la representación de una lista de usuarios). En el código, el uso de
esta anotación se ve de la siguiente manera:
@Path("/users")
public class UsersResource {
}
Tabla 9: Ejemplo anotación @Path
Fuente: (Sandoval, 2009)
Esta anotación también se utiliza para definir variables en una URI. Si recuerda,
se dijo que una URI para un usuario específico se parece a /users/{username}, así
que en el código esto se ve de la siguiente manera:
@Path("/users/{username}")
public class UserResource {
}
Tabla 10: Ejemplo anotación @Path con variable
Fuente: (Sandoval, 2009)
Cada solicitud HTTP hecha a un servicio web es manejada por un método anotado
apropiadamente en una clase de recurso, siempre que la clase de recurso tenga
la anotación @Path definida. Jersey admite las siguientes anotaciones para cada
una de las solicitudes de métodos HTTP. (Sandoval, 2009)
@GET
Una solicitud GET se maneja mediante un método anotado que tiene el siguiente
aspecto:
@Path("/users")
public class UserResource {
@GET
public String handleGETRequest() {
}
}
Tabla 11: Ejemplo anotación @GET
Fuente: (Sandoval, 2009)
19
@POST
Una solicitud POST se maneja mediante un método anotado que tiene el siguiente
aspecto:
@Path("/users")
public class UserResource {
@POST
public String handlePOSTRequest(String payload) {
}
}
Tabla 12: Ejemplo anotación @POST
Fuente: (Sandoval, 2009)
La solicitud POST tiene un payload que el Framework intercepta y se entrega en
el parámetro payload. El valor del payload podría ser una estructura XML por lo
que se usa un objeto String. Sin embargo, el payload también podría ser un flujo
binario de, por ejemplo, un MIME type image/jpg, por lo que el tipo de objeto para
nuestro payload debe cambiar en consecuencia (por ejemplo, InputStream).
@PUT
Una solicitud PUT se maneja mediante un método anotado que tiene el siguiente
aspecto:
@Path("/users")
public class UserResource {
@PUT
public String handlePUTRequest(String payload) {
}
}
Tabla 13: Ejemplo anotación @PUT
Fuente: (Sandoval, 2009)
@DELETE
Una solicitud DELETE se maneja mediante un método anotado que tiene el
siguiente aspecto:
@Path("/users")
public class UserResource {
@DELETE
public void handleDELETERequest() {
}
}
Tabla 14: Ejemplo anotación @DELETE
Fuente: (Sandoval, 2009)
20
Rutas Relativas en los Métodos
También se puede tener rutas relativas para cada método desde la ruta raíz
anotada en la definición de la clase. Por ejemplo, esta clase sirve una URI para
/users
@Path("/users")
public class UserResource {
@GET
public String handleGETRequest() {
}
}
Tabla 15: Ejemplo @GET lista de usuarios
Fuente: (Sandoval, 2009)
@Path("/users")
public class UserResource {
@GET
public String handleGETRequest() {
}
@GET @Path("/messages")
public String handleGETRequestMessages() {
}
}
Tabla 16: Ejemplo @GET lista de mensajes
Fuente: (Sandoval, 2009)
Ahora se tiene una clase de recurso que maneja solicitudes para /users y
/users/messages/. (Sandoval, 2009)
@PathParam
Esta anotación es usada junto con @Path y junto con @GET, @POST, @PUT y
@DELETE. En la especificación, se tiene el URI /users/{username}. Se dijo que el
nombre de usuario es una variable, y para obtener su valor de la URI se usa el
@PathParam de esta manera:
21
@Path("/users/{username}")
public class UserResource {
@GET
public String handleGET(
@PathParam("username") String username) {
// We can use username however we like...
}
@POST
public String handlePOST(
@PathParam("username") String username) {
}
@PUT
public String handlePUT(
@PathParam("username") String username) {
}
@DELETE
public String handleDELETE(
@PathParam("username") String username) {
}
}
Tabla 17: Ejemplo de variables
Fuente: (Sandoval, 2009)
También se puede usar múltiples variables en las URIs. Por ejemplo, se puede
tener una URI para consultar una lista de usuarios que limite los resultados por
género, edad y dirección, que se parece a /users/{gender}/{age}/{address}.
Entonces la definición del método se vería como sigue: (Sandoval, 2009)
@Path("/users/{gender}/{age}/{address}")
public class UsersResource {
@GET
public String handleGET(
@PathParam("gender") String gender,
@PathParam("age") int age,
@PathParam("address") String address) {
}
}
Tabla 18: Ejemplo de multiples variables
Fuente: (Sandoval, 2009)
Antes se vio cómo manejar las solicitudes realizadas a un servicio web, ahora se
verá como intercambiar representaciones entrantes y salientes entre clientes y
servidores. Para esto, se tiene las siguientes anotaciones.
22
@Consumes
Esta anotación funciona junto con @POST y @PUT. Le dice al Framework a que
método delegar la solicitud entrante. Específicamente, el cliente establece el
encabezado (header) Content-Type HTTP y el Framework delega la solicitud al
método de manejo correspondiente.
Path("/users")
public class UserResource {
@PUT
@Consumes("application/xml")
public void updateXML(String representation) {
}
@PUT
@Consumes("application/json")
public void updateJSON(String representation) {
}
}
Tabla 19: Ejemplo anotación @Consumes
Fuente: (Sandoval, 2009)
@Produces
Esta anotación funciona con @GET, @POST y @PUT. Le permite al Framework
saber qué tipo de representación enviar al cliente.
23
application/xml. Esta anotación también se puede utilizar con varios métodos en la
misma clase de recurso. Un ejemplo que devuelve las representaciones XML y
JSON es el siguiente: (Sandoval, 2009)
@Path("/users")
public class UserResource {
@GET
@Produces("application/xml")
public String getXML(String representation) {
}
@GET
@Produces("application/json")
public String getJSON(String representation) {
}
}
Tabla 20: Ejemplo anotación @Produces
Fuente: (Sandoval, 2009)
3.4.2.2.6. Parámetros
@FormParam
Esta anotación permite leer los valores de los pares nombre/valor pasados como
parte de una solicitud POST o PUT. Por ejemplo, se tiene un formulario HTML que
contiene los elementos nombre, edad y dirección de la siguiente manera:
24
Luego, se usa la anotación @FormParam de la siguiente manera.
@Path("/users")
public class UserResource {
@POST
@Consumes("application/x-www-form-urlencoded")
public void addUser(
@FormParam("name") String name,
@FormParam("age") int age,
@FormParam("address") String address) {
}
}
Tabla 22: Ejemplo anotación @FormParam
Fuente: (Sandoval, 2009)
El cliente se conecta a nuestra URI a través de una solicitud POST (o PUT) con el
payload que contiene el conjunto nombre/valor definido en el formulario. Cuando
el Framework maneja la solicitud, se tiene acceso a todos los valores que se
definieron en el método addUser(), tal como se hizo con la anotación
@PathParam. (Sandoval, 2009)
El código de este servicio web se divide en tres capas de abstracción, con cada capa
correspondiente a un paquete en el código. Se tendrá una capa web, que contiene las
clases de recursos de Jersey; una capa de negocios, que contiene clases que manejan el
almacenamiento real y la recuperación de recursos; y una capa modelo, que contiene las
clases que se almacenan en nuestra base de datos. Finalmente, para facilitar la
implementación, se usará Db4o para almacenar usuarios y mensajes. La arquitectura
completa se ve como sigue:
25
Descomponer la implementacion de la aplicación en capas es una práctica común de
ingenieria de software. Con capas de código completamente separadas, las clases se
convierten en componentes que intercambian mensajes entre sí. Por ejemplo, las clases
de recursos en la capa web no hacen mas que manejar la comunicación entre el cliente y
el servidor utilizando el protocolo HTTP y luego delegan el trabajo a la capa de negocios.
La capa de negocios toma las representaciones XML enviadas por los clientes, valida
estas representaciones y las convierte en objetos de valor para lamacenar en una base
de datos. (Sandoval, 2009)
27
4. Desarrollo de Aplicaciones Web Usando GraphQL
Los aspectos de GraphQL más importantes son ofrecer una forma más directa, sencilla y eficiente
para obtener exactamente los datos que se requieren utilizando una única solicitud, y al ser un
lenguaje de consulta puede ser utilizado indistintamente en diferentes códigos de programación,
todo esto para facilitar la creación de un API usando GraphQL.
Diseñado y utilizado por Facebook desde 2012 (publicado y abierto en 2015) para sus
aplicaciones web y móviles, GraphQL fue creado para resolver los problemas de tiempos de
las APIs, especialmente con la sobrecarga. Esto fue causado por la estructura básica de las
consultas, causando una serie de solicitudes con exceso de datos. Esto es especialmente un
28
problema con las aplicaciones móviles que se usan con dispositivos y condiciones de red que
no pueden manejar grandes cantidades de datos y cargas útiles (payloads). Hoy GraphQL es
mantenido por una vasta comunidad en todo el mundo que consiste en compañías y personas.
(howtographql.com, s.f.)
Facebook necesitaba una API lo suficientemente fuerte para describir todos los datos de
Facebook y, al mismo tiempo, fácil de usar y aprender para sus desarrolladores de productos.
Las aplicaciones móviles de Facebook se volvían más complejas, lo que provocaba
problemas de rendimiento y fallas. El suministro de noticias se había entregado como HTML
y se veía que era necesaria una versión API de sus datos. Facebook probo RESTful como
servidor de recursos y tablas FQL para resolver sus problemas, pero se sintieron frustrados
con la diferencia de datos utilizados en las aplicaciones y en las consultas del servidor.
Querían un gráfico de objetos con modelos usados como JSON en lugar de URL de recursos,
claves secundarias y unión de tablas. También había un montón de código para el servidor al
preparar los datos y para que el cliente los analizara. (Byron, 2015)
Facebook no fue el único que busco hacer las interacciones con el API más eficientes, pero
una vez que GraphQL fue de código abierto, muchos programas como Coursera fueron
cancelados cuando ingresaron a GraphQL. (howtographql.com, s.f.)
Aquí se consulta un campo name de un objeto hero. El resultado de una consulta tendrá la
misma estructura que la consulta en si, como se ve en la Figura 2. No queremos recibir todos
los campos de un objeto hero, solo el name.
29
Figura 2: Consulta de GraphQL
Fuente: (graphql.org, s.f.)
El sub-campo friends dará como resultado los nombres de los amigos del objeto hero.
Un argumento “id” especifica un objeto human y un argumento unit transformará el campo height
en la forma deseada.
30
4.4.1. Alias
Los campos del objeto de los resultados de las consultas coinciden con los nombres de
los campos de la consulta en sí. Sin embargo, para algunos propósitos, los nombres que
usa la interfaz de usuario pueden ser diferentes de los del servidor. En GraphQL, cualquier
nombre de campo se puede personalizar con alias. Estos alias deben ser descriptivos
para la consulta en particular o para el propósito de uso en la Interfaz de Usuario. La
consulta seguirá solicitando los mismos datos, pero la declaración utilizará los nombres
especificados en las respuestas. Por lo tanto, el cliente no necesitará un procesamiento
adicional de datos antes de usarlo. Los alias también permiten que se solicite el mismo
campo varias veces si es necesario. (Buna, 2016, pág. 2)
4.4.2. Fragmentación
Los fragmentos no se pueden usar solos ya que son solo operaciones parciales. Deben
estar prefijados con un operador extendido (tres puntos) para ser usado dentro de una
operación completa. Cuando el servidor de GraphQL ve los tres puntos seguido de un
nombre dentro de una consulta, buscará un fragmento con el mismo nombre. El contenido
del fragmento se colocará en el operador de difusión. El fragmento debe encajar en el
lugar donde se usa y, por lo tanto, solo se puede usar dentro de la selección. (Buna, 2016,
pág. 2)
31
Figura 6: Consulta GraphQL con Fragmentos
Fuente: (graphql.org, s.f.)
4.4.3. Variables
Usar variables como entradas hará que las consultas de GraphQL sean dinámicas y
reutilizables. Reemplazando un valor estático en una consulta con $nombreDeVariable
seguido por su tipo, declarándolo como una variable aceptada de la consulta y pasando
un valor (nombreDeVariable: valor) en un diccionario separado para transferir variables
(generalmente JSON). Después de que la variable se define en la parte superior de la
consulta, se puede usar en cualquier lugar dentro de esa operación de la consulta. (Buna,
32
2016, pág. 2). Mismos nombres de variables pueden ser usados en diferentes
operaciones, pero tienen que ser únicos dentro de cada operación. (Buna, 2016, pág. 2).
Las variables pueden ser requeridas para una consulta utilizando el signo “!” después del
tipo ($nombreDeVariable: tipo!). Los valores predeterminados también pueden asignarse
para las consultas después de la declaración del tipo. Si se pasa una variable para la
consulta, anulara la predeterminada.
4.4.4. Directivas
33
4.4.5. Mutaciones
Aunque los resultados de las consultas GraphQL dan como resultado resultados predecibles,
se debe definir un esquema. El esquema explica las capacidades del servidor de GraphQL.
Este se puede ver como un contrato entre el cliente y el servidor que define como el cliente
podrá acceder a los datos (howtographql.com, s.f.). GraphQL tiene un sistema de tipos para
describir los datos que son posibles para consultar. Cada servicio define este conjunto de
tipos los cuales las consultas ejecutan y validan. (graphql.org, s.f., pág. Schemas and Types)
Los tipos de objetos son el núcleo de las consultas y representan que tipo de objetos se
pueden recuperar y que campos tienen. Cada uno de los campos puede tener ninguno o
más argumentos que pueden ser necesarios o no. Si un argumento es opcional, puede
tener un valor predeterminado. Todos los argumentos son pasados por un nombre y por
lo tanto tienen que ser siempre nombrados. (graphql.org, s.f., pág. Schemas and Types)
34
4.5.2. Tipos Escalares
Para que los campos resuelvan datos reales GraphQL tiene tipos escalares. Además de
los tipos escalares personalizados, existen los siguientes tipos escalares
predeterminados: (graphql.org, s.f., pág. Schemas and Types)
Los valores también se pueden establecer a partir de un cierto conjunto de valores, esto
se puede hacer con un tipo de enumeración. Las listas y valores no nulos se pueden usar
en objetos externos, escalares, enums y declaraciones agregando modificadores de tipos
adicionales, el símbolo “!” para valores no nulos (non-null) y “[ ]“ para listas.
Además de los tipos de objetos, cada servicio de GraphQL tendrá un tipo de consulta y
puede tener tipos de mutación. Ambos sirven como punto de entrada al esquema, pero
siguen siendo exactamente como tipos de objetos y sus campos funcionan de la misma
manera. (graphql.org, s.f., pág. Schemas and Types)
Algunas aplicaciones pueden requerir una conexión en tiempo real al servidor para
obtener información inmediata sobre algunos eventos, esto se puede hacer con
suscripciones en GraphQL. Cuando un evento es suscrito por un cliente, se abre una
conexión estable al servidor. Cada vez que ocurre es suscrito por un cliente, se abre una
conexión estable al servidor. Cada vez que ocurre un evento, los datos se envían al cliente
desde el servidor. Esto significa que, aunque están escritos con la misma sintaxis que las
consultas y mutaciones, las suscripciones representan una secuencia de datos en lugar
de un ciclo de solicitud y respuesta. (howtographql.com, s.f., pág. Core Concepts)
Las interfaces y las uniones son ambos tipos abstractos usados para agrupar otros tipos.
Si los tipos tienen campos comunes, la interfaz puede ser usada para devolver ese grupo
de tipos como un todo. La interfaz definirá los campos que la implementación debe
35
contener y, por lo tanto, garantiza que esos campos siempre sean compatibles con esa
interfaz. Los tipos utilizados tendrán todos los campos de la interfaz, pero también pueden
traer campos adicionales propios. Los fragmentos en línea se pueden usar para solicitar
estos campos adicionales fuera de la interfaz. (Buna, 2016, pág. 3)
Las uniones se pueden usar cuando los tipos no tienen campos comunes, pero aún así
se desean agrupar. Los tipos tienen que ser concretos, no otras uniones o fragmentos. La
unión definirá una lista de diferentes implementaciones. Los fragmentos en línea se
utilizan para solicitar los campos de los tipos representados por una unión. (graphql.org,
s.f., pág. Schemas and Types)
Los tipos de entrada tienen el mismo aspecto que los tipos de objeto en el esquema de
GraphQL, solo tiene la palabra clave “input” en lugar de “type”. Las entradas permiten
pasar objetos complejos a los campos. Esto es útil en mutaciones donde se crean nuevos
objetos. Los campos del objeto de entrada no pueden tener argumentos y no pueden
mezclarse con los tipos de salida. (graphql.org, s.f., pág. Schemas and Types)
5.1. Consultas
Tanto GraphQL como REST funcionan en torno a la idea de recursos especificados por IDs.
En REST, la identidad de un objeto, así como la forma y el tamaño se llaman en el punto final
de la consulta, mientras que en GraphQL, la identidad es independiente de la obtención y el
formato será determinado por el cliente. Ambas APIs tendrán una lista de posibles acciones
con separación de operaciones de lectura y escritura. REST tiene una lista de end-points que
comienzan con GET o POST, mientras que GraphQL tiene un esquema de consultas y
mutaciones.
Los verbos HTTP usados por REST se pueden ver más fáciles de entender para los humanos.
GET recuperará datos, DELETE eliminará. Los verbos son bastante obvios para el
consumidor. Uno sabe para qué están tabulados, que sucederá y que son seguros de usar
36
sin siquiera leer la documentación. GraphQL podría no ser tan claro. La única forma segura
de saber a qué se llama una mutación para eliminar un elemento es mirarlo desde la
documentación. Los proveedores de API tendrán sus propias formas de nombrar las
operaciones y no se garantiza que todo sea coherente incluso dentro de una misma API. El
protocolo HTTP puede proporcionar más consistencia y predictibilidad. Lo mismo ocurre con
los códigos de estado HTTP, ambos son legibles por máquina y por humanos. Al utilizar
REST, podemos saber que ocurre simplemente desde el estado de HTTP. Las consultas
GraphQL estarán “OK” incluso si la consulta no hubiera tenido éxito.
Usar métodos y respuestas HTTP trae limitaciones. REST accede a múltiples end-points para
recopilar datos. Por ejemplo, primero un punto final para buscar a un usuario, otro para
obtener todas las publicaciones de ese usuario y otro para obtener una lista de seguidores. A
menudo, los desarrolladores se ven obligados a una gran personalización e interpretación
para mantener las cargas útiles (payload) al mínimo. Sin embargo, los clientes no tendrán
ningún control sobre la personalización, a menos que tengan los derechos para hacerlo. De
lo contrario, depende del desarrollador proporcionar las consultas y respuestas necesarias.
Aun así, los dos se pueden ver como lenguajes completamente diferentes. Casi como
preguntar algo en inglés y obtener una respuesta en japonés. (Buna, 2016)
GraphQL se creó a partir de las necesidades de hoy, especialmente las necesidades de los
clientes móviles. Los dispositivos de baja potencia transfieren datos con redes no ideales. Los
clientes móviles necesitan potencia y capacidad para elegir que datos consumir. Las
aplicaciones móviles también evolucionan rápidamente y sus versiones no se pueden
controlar bien. Por lo tanto, GraphQL minimiza la cantidad de datos transferidos y permite
agregar nuevas características sin eliminar las antiguas. (Buna, 2016)
37
GraphQL fuerza a tener consultas más eficientes y elimina muchas preguntas de diseño. Con
GraphQL, los clientes pueden escribir sus propias consultas y usar el lenguaje de su elección
en lugar de forzar a los desarrolladores a crear end-points personalizados, o APIs para
resolver problemas con diferentes clientes y sus necesidades. El lenguaje declarativo para
los requisitos de datos en GraphQL se asemeja a la forma de pensar los requisitos de datos
en ingles aliviando el trabajo de pensamiento que entra en él. (Buna, 2016)
5.3. Caché
REST puede confiar fácilmente en el almacenamiento en cache HTTP y evitar volver a buscar
los mismos datos porque está basado en end-points. Con GraphQL, el cliente debe manejar
el almacenamiento en caché. Un cliente como Relay puede proporcionar un sistema de caché.
Estos sistemas son complejos y dado que es posible que no proporcionen información sobre
cuánto tiempo son válidos los datos, actualizar la caché depende del consumidor.
Aunque GraphQL no tiene identificadores únicos a nivel global, como las URLs para cada
solicitud, los identificadores similares pueden exponerse para que los clientes los utilicen con
fines de almacenamiento en caché. Además, a medida que las solicitudes se personalizan,
es probable que se produzcan menos visitas de caché, lo que significa que REST se verá
forzado a seguir la misma ruta de manejo del almacenamiento en caché que GraphQL.
REST y GraphQL pueden versionar y evolucionar, pero las deprecaciones son el punto fuerte
de GraphQL. Dado que el uso del campo de monitoreo es fácil en GraphQL, los
desarrolladores pueden rastrear y llegar a los clientes a los que afectarán las nuevas
versiones. A diferencia de GraphQL, donde los clientes se ven obligados a especificar que
campos desean que se devuelvan, en REST saber esto es muy difícil. Esto dará como
resultado nuevas versiones completas y la anterior no se podrá descartar hasta que todos los
clientes hayan realizado el cambio, incluso si los cambios solo afectan el uso de algunos de
ellos.
38
cuando cambien las necesidades de diseño o datos de la interfaz de usuario. El desarrollo y
las iteraciones de productos pueden ser extremadamente rápidos. (howtographql.com, s.f.)
Las API REST tienden a crearse simples al principio y luego tiene características similares al
lenguaje de consulta. GraphQL, por otro lado, proporcionará una sintaxis de lenguaje de
consulta y kits de desarrollo de software. Se pueden obtener los mismos resultados con
REST, pero sigue siendo un concepto sin reglas escritas. “Con GraphQL, los clientes y
servidores son independientes y se pueden modificar sin afectarse entre sí”. (Buna, 2016)
Con las aplicaciones web, es más fácil controlar las versiones de API simplemente subiendo
nuevo código. Las aplicaciones móviles son otra historia, ya que las versiones no se pueden
controlar fácilmente. Un usuario puede descargar una aplicación y seguir usando la versión
instalada sin actualizarla. GraphQL permite que las API crezcan sin versionar. Se pueden
agregar nuevos campos sin eliminar los antiguos, ya que el gráfico puede crecer de manera
flexible dejando rutas para las antiguas API. (Buna, 2016)
• ¿Qué tipos de clientes tienes y si son diferentes el uno del otro? Si la aplicación tendrá
una versión web y móvil, o incluso si solo es una aplicación móvil, las fortalezas de
GraphQL podrían ser el lugar donde basas tu decisión.
• ¿Quieres darle poder al cliente o mantenerlo “tonto”? Con GraphQL, los clientes
estarán a cargo de una gran cantidad de tareas realizadas por el desarrollador.
Si una API REST sigue buenas prácticas, los beneficios de GraphQL pueden ser insuficientes.
Sin embargo, si un vasto campo de clientes con diferentes necesidades requiere datos
limitados, con consultas de bajo costo, GraphQL API podría ser lo que estás buscando. Dicho
esto, en la vida real de las arquitecturas orientadas a servicios, a menudo se usan múltiples
servicios diferentes con múltiples APIs. Algunos podrían ser REST, algunos GraphQL.
39
6. Conclusiones
Se mencionó los aspectos más importantes de REST tales como que es un modelo Cliente-
Servidor, las solicitudes tienen que contener toda la información necesaria para hacer la consulta
(Stateless), las respuesta a las solicitudes deben ser almacenadas en caché, se debe establecer
una interfaz uniforme utilizando identificadores únicos, separar los componentes del sistema en
múltiples capas y por ultimo usar HATEOAS que permite al cliente interactuar completamente
con nuestra aplicación a través de enlaces de hipermedia sin conocimiento previo de como
interactuar con la aplicación, todo lo mencionado son las restricciones de REST las cuales deben
seguirse a la hora de crear un API REST bien definido.
Y por último también se mencionó las principales diferencias entre REST y GraphQL:
• Ambos funcionan con la idea de recursos especificados por IDs, pero REST ya tiene
definida la forma en cambio en GraphQL el formato es especificado por el cliente, dando
acceso a la información que ellos necesitan.
• Ambas APIs tendrán una lista de posibles acciones con separación de operaciones de
lectura y escritura. REST tiene una lista de end-points que comienzan con GET o POST,
mientras que GraphQL tiene un esquema de consultas y mutaciones.
• Los verbos HTTP usados por REST se pueden ver más fáciles de entender para los
humanos. GraphQL podría no ser tan claro.
• REST accede a múltiples end-points para recopilar datos. La manera de GraphQL es usar
la menor cantidad posible de solicitudes
Conocer estas diferencias ayudará mucho a decidir cuál de estas dos tecnologías o posiblemente
ambas, podrían ser utilizadas a la hora de crear un API.
40
7. Bibliografía
Libros:
Buna, S. (2016). Learning GraphQL and Relay. Birmingham: Packt Publishing Ltd.
Jacobson, D., Brail, G., & Woods, D. (2012). APIs: A Strategy Guide. En D. Jacobson, G. Brail, &
D. Woods, APIs: A Strategy Guide (pág. 4). O'Reilly Media.
Sandoval, J. (2009). RESTful Java Web Services. Birmingham: Packt Publishing Ltd.
Uzayr, S. b. (2016). Learning Wordpress REST API. Birmingham: Packt Publishing Ltd.
Páginas Web:
41