Usando directivas en GraphQL

Escrito por el , actualizado el .
java planeta-codigo programacion
Enlace permanente Comentarios

GraphQL

En GraphQL construyendo la consulta adecuada se recuperan exclusivamente los datos solicitados.

Por ejemplo, si de un libro solo se requieren las propiedades el id, title y date de entre todas las que tienen la consulta sería en este caso la siguiente para una consulta que devuelve los datos de un conjunto de libros.

1
2
3
4
5
6
7
query Books {
  books {
    id
    title
    date
  }
}
query-1.graphql

Si se desea recuperar solo el id y title sin el date la consulta debe ser diferente.

1
2
3
4
5
6
query Books {
  books {
    id
    title
  }
}
query-2.graphql
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
...

type Book {
    id: Long
    title: String
    author: Author
    isbn: String
    date: LocalDate
    
    ...
}

...
library.graphqls

Consulta id, title y date Consulta id y title

Consultas diferentes que devuelven diferentes datos

Esto obliga en principio a tener dos consultas diferentes según los datos recuperar. En principio, ya que las directivas skip e include definidas en la especificación de GraphQL permiten tener la misma consulta y parametrizar si un determinado dato ha de incluirse o no en el resultado.

Las directivas se definen en el lenguaje de consulta de GraphQL con el caracter @ y pueden recibir parámetros. La directiva skip permite omitir un dato según el valor de un booleano, si es true se omite y si es false se incluye, el comportamiento de include es el mismo pero con el valor contrario del booleano, si es true se incluye y si es false se omite.

Esta sería la consulta parametrizada para obtener los datos de los libros omitiendo o incluyendo su fecha en función de una variable utilizando la directiva include. Cuando el valor de la variable es true se incluye el dato fecha, cuando el valor de la variable es false no se incluye.

1
2
3
4
5
6
7
query Books($include: Boolean!) {
  books {
    id
    title
    date @include(if: $include)
  }
}
query-3.graphql
1
2
3
{
 "include": true
}
variables-1.graphql
1
2
3
{
 "include": false
}
variables-2.graphql

Utilizando el editor GraphiQL para construir y ejecutar consultas de una API de GraphQL se obtienen los resultados.

Consulta con directiva include Consulta con directiva include

Misma consulta con directiva include que devuelve diferentes datos

Con un comando curl se realizan las mismas consultas.

1
2
$ curl -XPOST -H "Content-Type: application/json" -d '{"query": "query Books($include: Boolean!) { books { id title date @include(if: $include) }}", "variables": { "include": true }}' http://localhost:8080/graphql

curl-1.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "data": {
    "books": [
      {
        "id": "7",
        "title": "Ojo en el cielo",
        "date": "1957-01-01"
      },
      {
        "id": "8",
        "title": "Muerte de la luz",
        "date": "1977-01-01"
      },
      {
        "id": "9",
        "title": "El nombre de la rosa",
        "date": "1980-01-01"
      },
      {
        "id": "10",
        "title": "Los tejedores de cabellos",
        "date": "1995-01-01"
      },
      {
        "id": "11",
        "title": "Ready Player One",
        "date": "2011-01-01"
      }
    ]
  }
}
data-1.json
1
2
$ curl -XPOST -H "Content-Type: application/json" -d '{"query": "query Books($include: Boolean!) { books { id title date @include(if: $include) }}", "variables": { "include": false }}' http://localhost:8080/graphql

curl-2.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
  "data": {
    "books": [
      {
        "id": "7",
        "title": "Ojo en el cielo"
      },
      {
        "id": "8",
        "title": "Muerte de la luz"
      },
      {
        "id": "9",
        "title": "El nombre de la rosa"
      },
      {
        "id": "10",
        "title": "Los tejedores de cabellos"
      },
      {
        "id": "11",
        "title": "Ready Player One"
      }
    ]
  }
}
data-2.json
Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Comparte el artículo: