GraphQL: ¿que es?

Si alguna vez han desarrollado una aplicación que consuma datos de un servicio web lo mas probable es que hayan utilizado REST, en donde cada recurso tiene una URL diferente.

Si la estructura de datos con la que estamos trabajando es simple y no tiene referencias a otros modelos no hay problema. Pero si tenemos mas de un modelo que hace referencia a otros debemos hacer llamadas por cada referencia.

Para ilustrar el caso imaginemos que tenemos un servicio REST que nos permite obtner una serie de Blogs, cada blog tiene un publicaciones y cada publicación tiene un autor y comentarios. La lista de endpoints seria algo como:

  • GET /blogs lista de blogs
  • GET /blogs/{blogID} informacion de un blog
  • GET /blogs/{blogID}/publicaciones publicaciones de un blog
  • GET /blogs/{blogID}/publicaciones/{publicacionID} informacion de una publicacion
  • GET /blogs/{blogID}/publicaciones/{publicacionID}/comentarios comentarios de una publicacion

Ahora supongamos que queremos obtener todos los comentarios de todos los blogs, la cantidad de llamadas al servicio seria igual a la cantidad de blogs por la cantidad de publicaciones. Esas son demasiadas llamadas.

Mientras que si modelamos el mismo servicio web con GraphQL, podríamos obtener toda la información con una sola llamada. Ahora veremos como.

Primero debemos definir el esquema y los tipos de nuestra API

type Query {
  blogs: [Blog]
}

type Blog {
  id: ID
  nombre: String
  publicaciones: [Publicacion]
}

type Publicacion {
  id: ID
  titulo: String
  contenido: String
  autor: String
  fecha: String
  comentarios: [Comentario]
}

type Comentario {
  id: ID
  contenido: String
  fecha: String
}

Este esquema describe la estructura que mencionaba al principio, tenemos los Blogs que tienen publicaciones y a su vez las publicaciones tienen comentarios. Por simplicidad la unica consulta que he definido es para obtener todos los blogs.

El servidor GraphQL expone una URL donde recibira todas las peticiones.

Ahora para obtener todos los comentarios solo debemos enviar la siguiente consulta

query {
  blogs: {
    publicaciones: {
      comentarios: {
        id
        contenido
        fecha
      }
    }
  }
}

Con una esta consulta podemos obtener toda la información en una sola llamada.

Este es solo uno de los problemas que resuelve GraphQL, ya no hay que crear versiones diferente de API ya que cada cliente obtiene solo los datos que necesita y manejo de suscripciones para actualizaciones en tiempo real.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *