¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Java Spring
  3. Utilización de GraphQL
Extrait - Java Spring La base técnica de las aplicaciones Jakarta EE
Extractos del libro
Java Spring La base técnica de las aplicaciones Jakarta EE Volver a la página de compra del libro

Utilización de GraphQL

Introducción

GraphQL es una alternativa a las API REST. Consiste en un lenguaje de consulta y un entorno de ejecución. Fue creado por Facebook en 2012 y luego abrió el código en 2015.

Como recordatorio, aquí están las evoluciones de las formas de llamar a un proceso remoto:

Año

Protocolo

Explicación

1980

PRC

Remote Procedure Call: llamada al sistema externo con IDL (Interface Definition Language).

1998

XML-RPC

Uso de XML para intercambios.

2005

JSON-RPC

Uso de JSON para intercambios.

19982009

SOAP (sucesor de XML-RPC)

Uso de XML para intercambios con un IDL: WSDL.

2000

REST con verbos HTTP

El servidor elige la representación de los datos en la respuesta, REST sin IDL: Swagger y luego OpenAPI.

2007

FQL

Facebook Query Language: GET /fql?q=<consulta SELECT...>.

2008

YQL

Yahoo Query Language: GET /fql?q= <consulta SELECT… con joins >, API de composición.

2012

GraphQL

Sigue el protocolo RPC más universal: con fetch/mutación/suscription.

GraphQL se basa en consultas POST, que, por lo tanto, se deben almacenar en caché en el lado del cliente. Estas consultas indican el orden y la selección de los campos que se devolverán desde el servidor. El servidor define el contrato de intercambio a través de un esquema. Este contrato especifica cómo leer y escribir datos. GraphQL intercambia los datos a través de un grafo y se puede utilizar...

El esquema

Antes de ver las consultas, necesitamos estudiar el esquema de GraphQL en el que se basan, que tiene un formato específico.

El esquema permite listar los datos que los clientes solicitan a través de tipos de objeto. El desarrollador de la API asocia cada campo de un esquema con una función llamada resolver, que genera un valor en tiempo de ejecución.

El esquema se divide en secciones que se identifican por su tipo. Existen los tipos específicos de las operaciones y los relativos a la descripción de los datos.

Un esquema es un grafo que normalmente se diseña y describe en cuatro pasos: 

  • Type Object

  • Type Scalar

  • Type Query

  • Type Mutation

Comencemos con los nodos del grafo que representan los datos:

type Libro { 
} 
 
type Autor { 
} 

A continuación, agreguemos los tipos escalares (Scalar), utilizando los tipos integrados Int, Float, String, Boolean e ID. A nivel de tipo, podemos indicar que la variable es opcional usando «!».

type Libro { 
 titulo: String! 
 Contenido: String! 
} 
 
type Autor { 
 nombre: String! 
} 

A continuación, añadimos las relaciones entre los objetos:

type Libro { 
 titulo: String! 
 Contenido: String! 
 # necesario para los libros que tienen un autor. 
 tienePorAutor: Autor! 
} 
 
type...

Integración de GraphQL en Spring

Inicialmente, teníamos el proyecto GraphQL Java Spring, creado por los equipos de GraphQL: https://github.com/graphql-java/graphql-java-spring. Este proyecto evolucionó para integrarse en Spring con el nombre de Spring for GraphQL y ahora sirve como proyecto base para cualquier proyecto nuevo. La reciente integración directa de GraphQL en Spring aún no es GA (General Availability). En el momento de escribir este libro, la versión todavía estaba en 1.0.0-M6 PRE. Su ventaja es que simplifica la exposición de la API a través de una adaptación de los controladores REST clásicos Spring.

Los ejemplos de Spring se pueden encontrar en la dirección: https://github.com/spring-projects/spring-graphql

Como mínimo, GraphQL requiere:

  • JDK8

  • Spring Framework 5.3

  • GraphQL Java 17

  • Spring Data 2021.1.0 o más para el QueryDSL y el Query, por ejemplo

La capa de transporte puede utilizar HTTP y los WebSockets. Del mismo modo, podemos usar Spring MVC o Spring WebFlux.

Podemos usar la extensión Spring Data Querydsl con GraphQL.

La extensión Spring Data Querydsl

Querydsl es una librería que permite simplificar la creación de predicados de consultas, generando un metamodelo con ayuda de un preprocesador de anotaciones. La librería es independiente de Spring y está disponible en: http://querydsl.com/

A continuación, se muestra un ejemplo simple para ilustrar su uso:

List<Person> persons = queryFactory.selectFrom(person) 
 .where( 
   person.firstName.eq("John"), 
   person.lastName.eq("Doe")) 
 .fetch(); 

Usarlo con GraphQL y Spring simplifica el código. Creamos un Bean Repository de tipo QuerydslPredicateExecutor que manipula DataFetcher. Spring Data cubre JPA, MongoDB y LDAP para el uso de QuerydslPredicateExecutor.

Por ejemplo:

Para un resultado único:

// For single result queries 
DataFetcher<Account> dataFetcher = 
       QuerydslDataFetcher.builder(repository).single(); 

Para obtener un resultado en forma de lista:

// For multi-result queries 
DataFetcher<Iterable<Account>> dataFetcher = 
       QuerydslDataFetcher.builder(repository).many(); 

DataFetcher construye un Querydsl Predicate a partir de los argumentos de consulta GraphQL. Posteriormente, lo utiliza para procesar el acceso a los datos. Su uso es hasta cierto punto delicado, porque es necesario...

Controladores GraphQL

Los controladores GraphQL son controladores REST clásicos que se personalizan. AnnotatedControllerConfigurer detecta estos controladores. Especificamos que un método de controlador se corresponde con un campo de consulta usando la anotación @QueryMapping. La consulta se determina a partir del nombre del método si el método no se especifica como argumento de la anotación.

@Controller 
public class HolaController { 
 
       @QueryMapping 
       public String hola() { 
           return "Hola a ti"; 
       } 
} 

RuntimeWiring.Builder se utiliza para registrar la consulta llamada «hola» como graphql.schema.DataFetcher.

@SchemaMapping

Es posible personalizar el nombre del tipo padre y el nombre del campo en la anotación @SchemaMapping:

@Controller 
public class LibroController { 
 
   @SchemaMapping(typeName="Libro", field="autor ") 
   public Autor getAutor(Libro libro) { 
       // ... 
   } 
} 

La anotación se puede declarar a nivel de la clase, para especificar un nombre de tipo predeterminado para todos los métodos...

Autoconfiguración

Solo detallamos la versión HTTP a título ilustrativo. Un ejemplo adicional basado en WebFlux está disponible en los ejemplos descargables. La configuración automática se realiza a través de GraphQlWebMvcAutoConfiguration. Hay un equivalente para WebFlux: GraphQlWebFluxAutoConfiguration.

1. Versión HTTP

De la misma manera que sucede con las aplicaciones RESTful web services, los servicios GraphQL se basan en un Controlador REST que llama a un servicio DAO o a un Repository, que permite acceder a los datos de una base de datos. Hay Beans Spring especializados en simplificar el código.

El handler GraphQlHttpHandler gestiona las consultas GraphQL para las consultas HTTP a través de interceptores de consultas web. Las consultas web pasan por el verbo POST, con el detalle solicitado especificado en el body con un formato JSON que cumple con la especificación GraphQL por HTTP.

Hay dos niveles de control. El primer nivel verifica que la consulta HTTP esté bien formada y que el body JSON sea decodificable. En caso de éxito, tenemos el estado de la respuesta HTTP a OK (200). El segundo nivel se posiciona por el solicitante GraphQL, que sitúa los eventuales errores en el campo «errors» de la respuesta. Se utiliza un bean RouterFunction para crear un endpoint que utiliza el handler GraphQlHttpHandler.

2. El Service GraphQlService

La interfaz GraphQlService...

Conclusión

GraphQL permite crear un API para administrar las consultas con mayor precisión a través de un servicio de discovery, que indica lo que el API puede hacer. En el futuro, seguramente tendremos servidores GraphQL responsivos junto con Server Site Event, que satisfarán una amplia gama de necesidades.

Sin embargo, como cualquier "tecnología emergente", llevará algún tiempo ver si su adopción será amplia o no.

Puntos clave

  • GraphQL evita tener datos con contenido insuficiente: sub-fetching.

  • GraphQL evita tener datos con contenido excesivo: over-fetching.

  • Spring hace que GraphQL sea fácil de usar.

  • GraphQL permite administrar una suscripción a un flujo de datos.

  • GraphQL es fácil de emparejar con JPA mediante el uso de Spring Data Querydsl. 

  • GraphQL permite llegar más lejos que los servidores RESTful tradicionales.