Cómo incluir campos referenciados con JSON:API en Drupal 8 y Drupal 9

Poder obtener la máxima información con una sola petición es fundamental para lograr un mayor rendimiento. Esto lo conseguimos con los includes con JSON:API.

Ya hemos visto los fundamentos de JSON:API y cómo filtrar pero ahora todavía nos falta una funcionalidad muy importante: cómo obtener los valores de los campos referenciados con la misma consulta.

Con un Rest API tradicional si tenemos un endpoint que nos devuelve un listado de recetas y las recetas tienen categorías lo habitual es que en el endpoint de las recetas esté el id de la categoría. Lo mismo pasaría con el usuario, solo tendríamos el id del usuario y no los campos que realmente nos interesan (nombre, apellidos, etc). Una vez con el id usaríamos el endpoint correspondiente para obtener la información necesaria.

Por lo que sería una petición general a las recetas y luego n por usuarios y m por categorías, dónde n sería el número de usuarios a consultar y m el número de categorías (a no ser que el endpoint soportara poder consultar n items a la vez) Al final salen un montón de consultas y la solución sería hacer un endpoint a medida que devolviera todo eso directamente.

Con JSON:API no es necesario ya que podemos, simplemente poniendo parámetros en la url, incluir las referencias en la misma consulta. El parámetro que hemos de usar es:

Por ejemplo, en nuestro JSON de recetas vemos que tenemos varios campos referenciados: field_recipe_category, field_image y como puedes ver en el json hay un campo «relationships» dentro de cada item que solo contiene dentro de data el type y el id. Y con esa información solo no nos sirve.

Con el código que vimos antes en nuestro caso hemos de poner:

Por lo que quedaría así:
https://drupaldemo.omitsis.com/es/jsonapi/node/recipe?include=field_recipe_category,field_image

Si haces click en el enlace verás que al final del documento hay un nuevo item del json que se llama included, ahí estarán todas las entidades relacionadas incluidas, con todos sus campos.

También podríamos obtener la referencia de una referencia. Por ejemplo, si tuviéramos un campo de comentarios y quisiéramos tener también la información de los usuarios de los comentarios tan solo haría falta añadir esto:

Como ves es muy potente pero también hay que ir con cuidado, que si incluyes demasiadas relaciones tal vez la consultas necesarias sean demasiado pesadas y tarde mucho. Siempre experimenta y mantén un equilibrio.

by Carlos Rincón
Programador Drupal Senior con experiencia en SEO, SEM, analíticas web, aplicaciones móbil y usabilidad.