logo

Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll
18/05/2025, by Ivan

TL;DR: Utiliza una cadena de consulta como ?include=field_comments.uid para incluir todas las entidades referenciadas por field_comments y todas las entidades referenciadas por uid en esas entidades.


JSON:API te ayuda a eliminar solicitudes HTTP permitiéndote especificar rutas de relaciones que deseas incluir en el documento de respuesta. ¿Cómo?

Obteniendo recursos individuales

Obtener un artículo

Imagina que tienes un artículo con dos comentarios y cada uno de esos comentarios tiene el mismo autor. Para obtener todos estos datos sin includes, primero harías una solicitud a GET /jsonapi/node/article/some-random-uuid:

{
  "data": {
    "type": "node--article",
    "id": "some-random-uuid",
    "relationships": {
      "field_comments": {
        "links": {
          "related": {
            "href": "https://my.example.com/node/article/some-random-uuid/field_comments"
          }
        }
      }
    }
  }
}

Obtener comentarios

Luego, harías una solicitud a GET /node/article/some-random-uuid/field_comments:

{
  "data": [{
    "type": "comment",
    "id": "one-random-uuid",
    "relationships": {
      "uid": {
        "links": {
          "related": {
            "href": "https://my.example.com/comment/one-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "comment",
    "id": "two-random-uuid",
    "relationships": {
      "uid": {
        "links": {
          "related": {
            "href": "https://my.example.com/comment/two-random-uuid/uid"
          }
        }
      }
    }
  }
]
}

Obtener usuarios

Y de nuevo, necesitarías hacer dos solicitudes más a /comment/one-random-uuid/uid y /comment/two-random-uuid/uid. Podemos ver que la segunda solicitud es completamente innecesaria porque sabemos que el autor de ambos comentarios es el mismo en nuestro ejemplo.

¿Entonces, cómo pueden ayudar los includes?

Obtener todo de una vez usando include

¡Es fácil! Simplemente agregando un parámetro de consulta a la URL original con los nombres de los campos de relación que deseas incluir, el servidor sabrá que debe buscar todo por ti y agregarlo al documento de respuesta original.

En nuestro ejemplo, la URL de la solicitud sería GET /jsonapi/node/article/some-random-uuid?include=field_comments.uid. En otras palabras, estás diciendo: "por favor, agrega los objetos recurso para el campo field_comments en el artículo, luego también agrega los objetos recurso para el campo uid de los comentarios que hace referencia". Estos "caminos de relación" pueden ser tan largos como desees, ¡no hay límite!

El documento de respuesta que recibirías del servidor sería:

{
  "data": {
    "type": "node--article",
    "id": "some-random-uuid",
    "relationships": {
      "field_comments": {
        "data": [{
          "type": "comment",
          "id": "one-random-uuid"
        }, {
          "type": "comment",
          "id": "two-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/node/article/some-random-uuid/field_comments"
          }
        }
      }
    }
  },
  "included": [{
    "type": "comment",
    "id": "one-random-uuid",
    "relationships": {
      "uid": {
        "data": [{
          "type": "user",
          "id": "another-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/comment/one-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "comment",
    "id": "another-random-uuid",
    "relationships": {
      "uid": {
        "data": [{
          "type": "user",
          "id": "one-random-uuid"
        }],
        "links": {
          "related": {
            "href": "https://my.example.com/comment/two-random-uuid/uid"
          }
        }
      }
    }
  }, {
    "type": "user",
    "id": "another-random-uuid",
    "attributes": {
      "name": "c0wb0yC0d3r"
    }
  }]
}

¿No es genial? ¡Obtenemos todos los datos en una sola solicitud! Observa que el objeto recurso de usuario solo se incluye una vez, aunque se referencia dos veces. Esto mantiene bajo el tamaño de la respuesta. También nota cómo ahora hay una clave data en cada objeto de relación. Eso te permite correlacionar los objetos recurso incluidos con los objetos recurso que los referencian.

¿Cuándo usar include?

Hablando del tamaño de la respuesta... en este ejemplo, nos ahorramos tiempo al obtener todos los recursos en una sola solicitud. Sin embargo, en ciertas circunstancias, incluir objetos recurso relacionados hará que el tamaño de la respuesta sea bastante grande y/o el tiempo hasta el primer byte muy lento. En ese caso, podría ser mejor hacer varias solicitudes en paralelo.

Include para colecciones y relaciones

Finalmente, el parámetro de consulta include también está soportado en recursos de colección y relación. Los includes en colecciones pueden ahorrarte muchas solicitudes adicionales.

Ejemplo de include para colección

Obtener includes para una colección podría verse así: GET /jsonapi/node/article?include=uid. Los objetos incluidos están separados de data (array en lugar de objeto) como se muestra a continuación.

{
  "data": [{...}],
  "included": [{
    "type": "user",
    "id": "another-random-uuid",
    "attributes": {
      "name": "c0wb0yC0d3r"
    }
  }]
}

Artículo de la Documentación de Drupal.