Renombrar campos del esquema en las consultas GraphQL

Escrito por picodotdev el .
planeta-codigo programacion
Enlace permanente Comentarios

GraphQL

Las APIs devuelven información habitualmente en formato JSON si es reciente y si la API es algo más antigua quizá en XML. En cualquiera de los formatos la información está estructurada en propiedades con un nombre del campo y su valor. El nombre del campo es el que le asignó el diseñador de la API en el momento de crearla. En el momento de consumir la API quizá por adaptarla a su uso, para añadirle más semántica al caso de uso específico o por mayor claridad interese cambiar el nombre de los campos.

En una API que está siendo usada cambir el nombre a un campo devuelto o recibido implica cambios incompatibles con versiones anteriores y hace que los consumidores de la API deban modificarse para tener en cuenta el nuevo nombre del campo. En una API REST un cambio de nombre a un campo implica modificar las clases DTO o el código para tener en cuenta el nuevo nombre de campo en la respuesta o en la petición.

GraphQL ofrece soporte para crear sinónimos o aliases de los nombres de los campos, es decir, usar un nombre aunque en la API el nombre del campo sea distinto. Esta funcionalidad de alias hacen que un campo con un nuevo nombre solo implique cambiar únicamente las consultas sin que el resto del código requiera cambios, esto es mucho más simple, rápido y seguro que en REST. Los alias también pueden aplicarse al nombre de la consulta.

La siguiente API de GraphQL define la siguiente entidad Book que posee los campos id, title, author e isbn. En este caso hay varias versiones del mismo campo ISBN obtenido de diferentes formas, de forma individual en cada entidad de Book con isbn y de forma batched más eficientemente con batchedIsbn y de forma batched con un DataLoader con dataLoaderIsbn.

 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
    comments(after: String, limit: Long): CommentsConnection

    batchedIsbn: String
    batchedComments(after: String, limit: Long): CommentsConnection

    dataLoaderIsbn: String
}
library.graphqls

Esta es una consulta con el campo dataLoaderIsbn.

 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
32
$ curl -s -XPOST -H "Content-Type: application/json" -d '{"query": "query Books{books{title date dataLoaderIsbn}}"}' http://localhost:8080/graphql
{
  "data": {
    "books": [
      {
        "title": "Ojo en el cielo",
        "date": "1957-01-01",
        "dataLoaderIsbn": "87c1342a-f46e-41ad-ad9a-dda88bb9d0dc"
      },
      {
        "title": "Muerte de la luz",
        "date": "1977-01-01",
        "dataLoaderIsbn": "0e10de64-4b6e-403a-9cf0-082907525c7a"
      },
      {
        "title": "El nombre de la rosa",
        "date": "1980-01-01",
        "dataLoaderIsbn": "ea04f2a6-3f1d-4e1a-a2ee-cd370cd2a222"
      },
      {
        "title": "Los tejedores de cabellos",
        "date": "1995-01-01",
        "dataLoaderIsbn": "c7a83503-fcbd-477e-862b-ab72575f72a7"
      },
      {
        "title": "Ready Player One",
        "date": "2011-01-01",
        "dataLoaderIsbn": "0fee8cbb-8c0f-4fef-b89d-e6ac236fc31c"
      }
    ]
  }
}
curl-1.sh

Con la siguiente consulta el campo dataLoaderIsbn es renombrado a isbn entre los datos de la respuesta. Para realizar los renombrados hay que seguir el formato alias:name como nombre de campo en la consulta. Con esta funcionalidad variando la consulta se puede pedir cualquiera de los campos isbn sin tener que modificar el código que procesa el JSON de respuesta. Si cambia un nombre de campo en la API hay que modificar las consultas pero no el código que procesa las respuestas.

 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
32
$ curl -s -XPOST -H "Content-Type: application/json" -d '{"query": "query Books{books{title date isbn:dataLoaderIsbn}}"}' http://localhost:8080/graphql
{
  "data": {
    "books": [
      {
        "title": "Ojo en el cielo",
        "date": "1957-01-01",
        "isbn": "87c1342a-f46e-41ad-ad9a-dda88bb9d0dc"
      },
      {
        "title": "Muerte de la luz",
        "date": "1977-01-01",
        "isbn": "0e10de64-4b6e-403a-9cf0-082907525c7a"
      },
      {
        "title": "El nombre de la rosa",
        "date": "1980-01-01",
        "isbn": "ea04f2a6-3f1d-4e1a-a2ee-cd370cd2a222"
      },
      {
        "title": "Los tejedores de cabellos",
        "date": "1995-01-01",
        "isbn": "c7a83503-fcbd-477e-862b-ab72575f72a7"
      },
      {
        "title": "Ready Player One",
        "date": "2011-01-01",
        "isbn": "0fee8cbb-8c0f-4fef-b89d-e6ac236fc31c"
      }
    ]
  }
}
curl-2.sh
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: