GraphQL, ¿es el fin de las API’s REST?
En 2015, Facebook hizo pública una más de sus tecnologías que,
junto con React Js, mantienen a su sitio web tan visitado y lleno de publicaciones
día a día.
En el momento en que lo liberaron no tuvo demasiado auge,
pero últimamente GraphQL se ha vuelto muy popular.
¿Qué es GraphQL?
GraphQL es un lenguaje de consultas (queries) ejecutado del
lado del servidor, este no funciona como un framework o librería, en realidad asigna la forma de hacer las cosas y marca una guía definitiva para obtener nuestros datos; una especificación de cómo implementarlo ya existe
en distintos lenguajes, desde JavaScript, PHP, Python, Java, .NET etc.
¿Cómo funciona GraphQL?
Normalmente en una API de tipo REST, realizamos peticiones y
la consumimos mediante métodos tradicionales (usando GET, POST, PUT, DELETE) de
ésta forma, cuando necesitamos algún recurso, hacemos algo cómo: /api/accounts/
para obtener las cuentas asociadas, utilizamos POST para agregar una nueva
cuenta, PUT para actualizarla y DELETE para borrarla.
Con GraphQL sólo tenemos un punto de acceso que de manera
predeterminada es /graphql y sólo interactuamos con él con el método POST, para
obtener, modificar o crear los datos necesarios de la aplicación debemos
agregar al cuerpo de nuestra petición alguna de las siguientes palabras claves:
- Query
- Mutation
- Subscription
Este concepto representa una consulta que contiene los datos pedidos a la aplicación que se vería de está forma:
query {
getAccount("id": 1){
id
avatar
name
keys: {
keyValidation,
keySession
}
}
}
ésta representación equivaldría al método GET con el que obtendríamos los datos de nuestra aplicación.
Al final obtendríamos algo así:
{
"data": {
"id": 1,
"avatar": "https://soluccionessore.com/src/images/avatart/joan_avt.png",
"name": "Joan Andrés Lara Mora",
"keys": {
...
}
}
}
Como podrás ver obtenemos un objeto con nuestros datos, especifícamente con los datos que le solicitamos, sin agregar otros que no son requeridos.
Mutation
Una vez resuelto el problema de la obtención de los datos debemos proveer al cliente de un mecanismo para actualizar o eliminar su cuenta, para eso necesitamos las mutaciones. Esta trabaja como una función, recibe algunos parámetros y devuelve una respuesta, con los datos necesarios para la actualización del lado del cliente.
mutation {
changeName("id": 1, "newName": "Mi nuevo nombre"){
newName
validate
}
}
Por ejemplo está mutación cambia el nombre a nuestro cliente y nos devuelve el nuevo nombre con una propiedad de validación del nombre para saber si lo quiere dejar o cancelar y la respuesta se vería algo así:
{
"data":{
"changeName": {
"newName": "Mi nuevo nombre",
"validate": false
}
}
}
Subscription
Otra parte importante de GraphQL son las suscripciones, aunque estás son relativamente nuevas en las librerías para los servidores, ya que no hace mucho se han agregado a la especifícación estándar y aún no se incluyen del todo en su código fuente.
Estás simplemente agregan un manejador que notifica a quién se haya suscrito a nuestro servidor (a través de conexiones WebSockets) y mantener una interacción RealTime.
subscription {
notificationOf("type": "like"){
id
type
data {
photo {
id
name
}
user {
id
avatar
name
}
date
}
}
}
De esta forma podemos saber quién le ha dado like a una de nuestra fotos y esto es lo que nos devolvería:
{
"data":{
"id": 45,
"type": "like",
"data": {
"photo": {
"id": 76376482,
"name": "photos_news"
},
"user": {
"id": 767,
"name": "Fernando Rívera Alarcón"
},
"date": "2017-12-05T16:40:46"
}
}
}
Schema
En las aplicaciones basadas en GraphQL son necesarios los esquemas de datos. Cuando estructuramos alguno de estos esquemas les decimos la forma de obtener e interactuar con los mismo. Un ejemplo de estos sería para las cuentas.
type Account {
id: Int!
name: String!
avatar: String,
keys: [Keys]
}
En donde obtenemos un objeto Account que contiene los siguientes datos:
- id un número, párametro obligatorio
- name un string, párametro obligatorio
- avatar un string, párametro opcional
- keys una lista de objetos de tipo Keys, que son opcionales
La propiedad Keys es una relación de llaves para validación de un cliente. Es un objeto dentro del mismo esquema de la aplicacion.
Ahora necesitamos una manera de obtener los datos del esquema para eso definiremos un Objeto con las siguientes especifícaciones.
type Query {
getAccount(id: Int!): Account
getAccounts(): [Account]
}
Este nos permite ejecutar una función para obtener un cliente pasándole un id o obtener todos los clientes, después definiremos las mutaciones, que son las formas de interactuar con los datos:
type Mutation {
changeName(id: Int! newName: String): Account
deleteAccount(id: Int!): Account
}
También podemos definir a que datos podemos suscribirnos:
type Subscription {
changeName(type: String!): Notificacion
}
Aquí la estructura es demasiado parecida a las mutaciones: recibe unos parámetros y le especifícamos que devuelve. Y por último hay que definir el esquema final:
type Schema {
query: Query,
mutation: Mutation
Subscription: Subscription
}
En donde simplemente hay que decir que nuestro esquema tiene un query, mutation y suscription asociados y corresponden a los definidos anteriormente.
Resolvers
Al definir los esquemas simplemente estamos sabiendo qué hacer en nuestra API, pero necesitamos que respondan a los posibles queries, mutaciones o suscripciones, para eso son los resolvers, funciones que se encargan de procesar la petición a nuestra API y responder solamente con los datos necesarios:
Por ejemplo:
const getAccount = async (id) => Account.find(id)
Esto equivale a encontrar un cliente con un id especificado como párametro.
GraphiQL
GraphQL tiene su propio IDE (Entorno de Desarrollo Integrado), se llamada GraphiQL funciona mediante web y se conecta a nuestro esquema de datos para probar las distintas mutaciones, suscripciones y peticiones hechas a nuestra API, además de mostrar la documentación de la misma, la cual puedes checar desde aquí.
GraphQL, ¿suplantará a las API´s RestFul?
Se suele pensar comúnmente que una tecnología en aumento eventualmente suplantará a una establecida, pero es que a veces por la rapidez que ésta alcanzó y la poca eficiencia por multiples usuario a la hora de escalar las aplicaciones, que no puede derrumbar a su competencia, es por tanto necesario ser precavidos a la hora de elegir qué usar para nuestros proyectos, es cierto, GraphQL funciona, de otra manera Facebook no la utilizaría para su gran plataforma, pero antes de empezar a escribir código como un loco, cabe pensar si ésta es en verdad la opción más favorable, desde mi punto de vista, la tecnología suena prometedora, pero pasarán un par de años más para que la mayoría de los sitios web y plataformas se decidan a utilizarla, GraphQL es una propuesta simple, en etapa de aceptación, y por tanto, hay que tomar mucho en cuenta si queremos unirnos a la corriente o navegar en nuestro establecido que le tomará un tiempo llegar, pero que sin duda, algún día lo hará.
Comentarios
Publicar un comentario