logo

Extra Block Types (EBT) - Neue Erfahrung im Layout Builder❗

Extra Block Types (EBT) - gestylte, anpassbare Blocktypen: Diashows, Registerkarten, Karten, Akkordeons und viele andere. Eingebaute Einstellungen für Hintergrund, DOM Box, Javascript Plugins. Erleben Sie die Zukunft der Layouterstellung schon heute.

Demo EBT-Module EBT-Module herunterladen

❗Extra Absatztypen (EPT) - Erfahrung mit neuen Absätzen

Extra Paragraph Types (EPT) - analoger, auf Absätzen basierender Satz von Modulen.

Demo EPT-Module EPT-Module herunterladen

Scroll
22/05/2025, by Ivan

TL;DR: Verwenden Sie einen Query-String wie ?include=field_comments.uid, um alle von field_comments referenzierten Entitäten und alle von uid auf diesen Entitäten referenzierten Entitäten einzuschließen!


JSON:API hilft Ihnen, HTTP-Anfragen zu reduzieren, indem Sie Beziehungs-Pfade angeben können, die Sie im Antwort-Dokument enthalten möchten. Wie?

Einzelne Ressourcen abrufen

Artikel abrufen

Nehmen wir an, Sie haben einen Artikel mit zwei Kommentaren und jeder dieser Kommentare hat den gleichen Autor. Um all diese Daten ohne Includes zu erhalten, würden Sie zuerst eine Anfrage an GET /jsonapi/node/article/some-random-uuid stellen:

{
  "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"
          }
        }
      }
    }
  }
}

Kommentar abrufen

Dann würden Sie eine Anfrage an GET /node/article/some-random-uuid/field_comments stellen:

{
  "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"
          }
        }
      }
    }
  }
}

Benutzer abrufen

Und dann müssten Sie noch zwei weitere Anfragen an /comment/one-random-uuid/uid und /comment/two-random-uuid/uid stellen. Wir sehen, dass die zweite Anfrage eigentlich überflüssig ist, weil wir wissen, dass der Autor beider Kommentare im Beispiel der gleiche ist.

Wie können also Includes helfen?

Alles auf einmal mit Include abrufen

Es ist einfach! Indem Sie einfach einen Query-Parameter zur ursprünglichen Anfrage-URL mit den Namen der Beziehungfelder, die Sie einbeziehen möchten, hinzufügen, weiß der Server, dass er alles für Sie nachschlagen und dem ursprünglichen Antwort-Dokument hinzufügen soll.

In unserem Beispiel wäre die URL-Anfrage GET /jsonapi/node/article/some-random-uuid?include=field_comments.uid. Anders ausgedrückt sagen Sie: "Bitte füge die Ressourcenobjekte für das field_comments-Feld am Artikel hinzu, dann auch die Ressourcenobjekte für das uid-Feld bei den referenzierten Kommentaren." Diese "Beziehungspfade" können so lang sein, wie Sie möchten – es gibt kein Limit!

Das Antwortdokument, das Sie vom Server erhalten würden, sieht folgendermaßen aus:

{
  "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"
    }
  }]
}

Ist das nicht cool? Wir haben alle Daten mit einer einzigen Anfrage bekommen! Beachten Sie, dass das Benutzer-Ressourcenobjekt nur einmal enthalten ist, auch wenn es zweimal referenziert wird. Das hält die Antwort klein. Beachten Sie auch, dass es jetzt einen data-Schlüssel in jedem Beziehungsobjekt gibt. Damit können Sie die eingeschlossenen Ressourcenobjekte mit den referenzierenden Ressourcenobjekten korrelieren.

Wann sollte man Include verwenden?

Wenn wir schon von Antwortgröße sprechen ... In diesem Beispiel haben wir uns Zeit gespart, indem wir alle Ressourcen mit einer einzigen Anfrage bekommen haben. Unter bestimmten Umständen kann das Einbeziehen verwandter Ressourcenobjekte die Antwortgröße jedoch stark vergrößern und/oder die Zeit bis zum ersten Byte sehr langsam machen. In diesem Fall ist es eventuell besser, mehrere Anfragen parallel zu stellen.

Include für Sammlungen und Beziehungen

Der include-Query-Parameter wird auch bei Sammlungsressourcen und Beziehungsressourcen unterstützt! Includes bei Sammlungen können Ihnen viele weitere Anfragen ersparen.

Include-Beispiel für eine Sammlung

Includes für Sammlungen könnten so aussehen: GET /jsonapi/node/article?include=uid. Die included sind ähnlich wie zuvor vom data getrennt (Array statt Objekt), wie unten gezeigt.

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

Artikel aus der Drupal Dokumentation.