Cómo filtrar con JSON:API en DRUPAL 8

Ya no hay que esperar a que el backend haga cambios en un endpoint para filtrar resultados. Con JSON:API lo hacemos nosotros directamente alterando la url.

En el anterior artículo sobre JSON:API ya vimos los fundamentos y sus ventajas. En este artículo nos vamos centrar en una cosa muy concreta: cómo usar filtros con JSON:API.

Es muy normal tener un listado de elementos proporcionados a través de un endpoint y que nuestra aplicación (sea web o móvil) necesite solo un subconjunto de estos elementos. Tal como mencioné en el anterior artículo con JSON:API podemos filtrar los resultados sin necesidad de pedirselo a nadie, simplemente añadiendo parámetros a la url del endpoint.

Lo mejor es que lo veamos con un ejemplo, un listado de recetas:

https://drupaldemo.omitsis.com/es/jsonapi/node/recipe

Un pequeño apunte: Para ver bien un json o bien desde Firefox que lo hace de serie o bien te has de instalar una extensión en Chrome. Hay unas cuantas, yo tengo JSONView. Para otros navegadores ya no sé como está el tema.

En las recetas vemos que hay un campo que representa la dificultat (field_difficulty) y queremos poder filtrar por ese campo. Con JSON:API es tan fácil como añadir este parámetro a la url:

Que en nuestro caso para obtener solo los de dificultat easy sería:

https://drupaldemo.omitsis.com/es/jsonapi/node/recipe?filter[field_difficulty]=easy

Ahora pongamoslo un poco más complejo, recetas de dificultat easy con un ingrediente que tenga la palabra «cebollas»:

https://drupaldemo.omitsis.com/es/jsonapi/node/recipe?filter[field_difficulty]=easy&filter[field_ingredients][operator]=CONTAINS&filter[field_ingredients][value]=cebollas

Grupos y condiciones

Cuando ponemos un filtro detrás de otro se comporta por defecto como un AND’s pero podemos poner condiciones y grupos. Estas condiciones y grupos pueden estar anidadas, así que permiten cualquier tipo que condición.

Para crear un filtro la forma básica es la siguiente:

Si queremos crear los grupos que comentaba antes primero especificamos un grupo y luego lo asignamos a la condición:

Los grupos pueden tener la propiedad memberOf por lo que puedes crear grupos de grupos.

Operadores disponibles en los filtros de JSON:API

Los operadores que podemos usar en las condiciones son los siguientes:
‘=’, ‘<>’, ‘>’, ‘>=’, ‘<‘, ‘<=’,
‘STARTS_WITH’, ‘CONTAINS’, ‘ENDS_WITH’,
‘IN’, ‘NOT IN’,
‘BETWEEN’, ‘NOT BETWEEN’,
‘IS NULL’, ‘IS NOT NULL’,

Abreviaturas

Cuando el operador que queremos usar es el igual se puede obviar y no ponerlo, por lo que quedaría así:

Además si no queremos usar este filtro como grupo lo podemos acortar aún más a la siguiente forma, que si recuerdas, es la primera que usamos:

Filtros y control de acceso

Es importante recordar que los filtros no van a impedir que el usuario tenga acceso al contenido filtrado, ya que estamos filtrando por frontend. Será trabajo del backend de realizar un control de acceso sobre el contenido y campos que puedan o no puedan ver los usuarios según sus permisos.

Pero para mejorar el rendimiento, y al parecer es una mejora bastante demandada, es bueno filtrar por aquello que sabemos que el usuario no va a poder ver. Un ejemplo típico es filtrar solo por los nodos publicados:

Y con esto tenemos un buen resumen de los filtros del JSON:API. El siguiente post será ver como incluir referencias (taxonomías, usuarios, otros nodos, etc) y entonces ya pasaremos a ver los primeros pasos de Drupal con REACT usando JSON:API.

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