Ir al contenido principal

GraphQL, una nueva forma de consumir datos



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 
Query

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

Entradas populares de este blog

Resetear contador almohadillas en Epson L210

Resetear contador almohadillas en Epson L210 ¿Que son las almohadillas de la impresora Epson? las Almohadillas de las impresoras Epson Stylus son bloques de diferentes tamaños (dependiendo del modelo de la impresora) que están fabricadas de un material fibroso y absorbente. Todas las impresoras Epson Stylus las tienen, estas están ubicadas en un contenedor dentro de la impresora, algunos las tienen en la parte baja y otros en la parte posterior de la impresora en el cual se va acumulando la tinta que el cabezal va botando cada vez que se enciende la impresora o cuando realiza una limpieza de sus inyectores o cabezal y cuando va realizando una impresión. Cuando se llenan estas almohadillas, la impresora tienen en su tarjeta principal un contador electrónico llamado memoria EEprom que contabiliza cuanta tinta es acumulada dentro de la impresora. Una vez que la memoria EEProm llega a su cuenta límite establecido simplemente bloquea la impresora evitando que la tinta de des...
Reset de almohadillas  para impresora Canon PIXMA MG3510 Para cuando se produce los siguientes errores 5B02, 5B03, 5B04, 5B05, 5B12, 5B13, 5B14, 5B15. Esto se puede deber a que la impresora haya alcanzado su  límite de impresiones; sucede por varias razones (las hojas a color o impresiones fotográficas: estas pueden contar el triple, según su tamaño en el contador de impresiones).  Y aún más cuando a este modelo de impresoras se le adapto un sistema de tinta continua la vida de las almohadillas suele ser más corto cunado dicho sistema tienen goteos de tinta sin que el usuario se dé cuenta de ello .  Pasos a seguir: 1.- pasos solo en la impresora si el programa aun abierto 1.          Apagar la impresora para entrar en  modo mantenimiento o servicio 2.        Mantenemos pulsado el botón  Stop / Reset 3.        Pulsamos e...

Resetear contador almohadillas en Epson L3150

Resetear contador almohadillas en EpsonL3150 ¿Que son las almohadillas de la impresora Epson? las Almohadillas de las impresoras Epson  son bloques de diferentes tamaños (dependiendo del modelo de la impresora) que están fabricadas de un material fibroso y absorbente. Todas las impresoras Epson las tienen, estas están ubicadas en un contenedor dentro de la impresora, algunos las tienen en la parte baja y otros en la parte posterior de la impresora en el cual se va acumulando la tinta que el cabezal va botando cada vez que se enciende la impresora o cuando realiza una limpieza de sus inyectores o cabezal y cuando va realizando una impresión. Cuando se llenan estas almohadillas, la impresora tienen en su tarjeta principal un contador electrónico llamado memoria EEprom que contabiliza cuanta tinta es acumulada dentro de la impresora. Una vez que la memoria EEProm llega a su cuenta límite establecido simplemente bloquea la impresora evi...