AEM GraphQL-API zur Verwendung mit Inhaltsfragmenten

Erfahren Sie, wie Sie Inhaltsfragmente in Adobe Experience Manager (AEM) as a Cloud Service mit der AEM GraphQL-API für die Headless-Bereitstellung von Inhalten verwenden.

Die mit Inhaltsfragmenten verwendete GraphQL-API von AEM as a Cloud Service basiert stark auf der standardmäßigen Open-Source-GraphQL-API.

Die Verwendung der GraphQL-API in AEM ermöglicht die effiziente Bereitstellung von Inhaltsfragmenten an JavaScript-Clients in Headless CMS-Implementierungen:

  • Vermeiden von iterativen API-Anfragen wie bei REST,
  • Sicherstellen, dass die Bereitstellung auf die spezifischen Anforderungen beschränkt ist,
  • Ermöglichen der Massenbereitstellung von genau dem, was zum Rendern als Antwort auf eine einzelne API-Anfrage benötigt wird.
HINWEIS

GraphQL wird derzeit in zwei (separaten) Szenarios in Adobe Experience Manager (AEM) as a Cloud Service verwendet:

Die GraphQL-API

GraphQL ist:

  • …eine Abfragesprache für APIs und eine Laufzeitumgebung zur Erfüllung dieser Abfragen mit Ihren vorhandenen Daten. GraphQL bietet eine vollständige und verständliche Beschreibung der Daten in Ihrer API, gibt Kunden die Möglichkeit, genau das abzufragen, was sie benötigen, und nicht mehr, macht es einfacher, APIs im Laufe der Zeit weiterzuentwickeln, und ermöglicht leistungsstarke Entwicklerwerkzeuge.

    Weitere Informationen finden Sie unter GraphQL.org

  • …eine offene Spezifikation für eine flexible API-Schicht. Legen Sie GraphQL über Ihre bestehenden Backends, um Produkte schneller als je zuvor zu erstellen …

    Weitere Informationen finden Sie unter GraphQL entdecken.

  • „… eine Datenabfragesprache und -spezifikation, die 2012 intern von Facebook entwickelt wurde, bevor sie 2015 öffentlich als Open Source zur Verfügung gestellt wurde. Sie bietet eine Alternative zu REST-basierten Architekturen mit dem Ziel, die Produktivität von Entwicklern zu erhöhen und die Menge der übertragenen Daten zu minimieren. GraphQL wird von Hunderten von Unternehmen aller Größenordnungen in der Produktion eingesetzt …“

    Siehe GraphQL Foundation.

Weitere Informationen zur GraphQL-API finden Sie in den folgenden Abschnitten (neben vielen anderen Ressourcen):

Die Implementierung von GraphQL für AEM basiert auf der standardmäßigen GraphQL-Java-Bibliothek. Siehe:

GraphQL-Terminologie

GraphQL verwendet Folgendes:

  • Abfragen

  • Schemas und Typen:

    • Schemas werden von AEM basierend auf den Inhaltsfragmentmodellen generiert.
    • GraphQL stellt mithilfe Ihrer Schemas die Typen und Vorgänge dar, die für die GraphQL-Implementierung für AEM zulässig sind.
  • Felder

  • GraphQL-Endpunkt

    • Der Pfad in AEM, der auf GraphQL-Abfragen antwortet und Zugriff auf die GraphQL-Schemas bietet.

    • Weitere Informationen finden Sie unter Aktivieren des GraphQL-Endpunkts.

In der (GraphQL.org) Einführung in GraphQL finden Sie ausführliche Informationen, einschließlich der Best Practices.

GraphQL-Abfragetypen

Mit GraphQL können Sie Abfragen für Folgendes durchführen:

Sie können auch Folgendes ausführen:

GraphiQL IDE

Zusätzlich können Sie GraphQL-Abfragen mit der GraphiQL-IDE testen und debuggen.

Anwendungsfälle für Autoren- und Veröffentlichungsumgebungen

Die Anwendungsfälle können vom Typ der AEM as a Cloud Service-Umgebung abhängig sein:

  • Veröffentlichungsumgebung; wird verwendet, um:

    • Daten für das JS-Programm (Standardanwendungsfall) abzufragen
  • Autorenumgebung; wird verwendet, um:

    • Daten für „Content-Management-Zwecke“ abzufragen:
      • GraphQL in AEM as a Cloud Service ist derzeit eine schreibgeschützte API.
      • Die REST-API kann für CR(u)D-Vorgänge verwendet werden.

Berechtigungen

Die Berechtigungen sind diejenigen, die für den Zugriff auf Assets erforderlich sind.

Schema-Generierung

GraphQL ist eine stark typisierte API, was bedeutet, dass die Daten klar strukturiert und nach Typ geordnet sein müssen.

Die GraphQL-Spezifikation enthält eine Reihe von Richtlinien zum Erstellen einer robusten API zum Abfragen von Daten in einer bestimmten Instanz. Dazu muss ein Client das Schema abrufen, das alle für eine Abfrage erforderlichen Typen enthält.

Bei Inhaltsfragmenten basieren die GraphQL-Schemas (Struktur und Typen) auf aktivierten Inhaltsfragmentmodellen und deren Datentypen.

VORSICHT

Alle GraphQL-Schemas (abgeleitet von Inhaltsfragmentmodellen, die aktiviert wurden) können über den GraphQL-Endpunkt gelesen werden.

Das bedeutet, dass Sie sicherstellen müssen, dass keine vertraulichen Daten verfügbar sind, da sie auf diese Weise an die Öffentlichkeit gelangen könnten. Dazu gehören beispielsweise Informationen, die als Feldnamen in der Modelldefinition vorhanden sein könnten.

Wenn ein Benutzer beispielsweise ein Inhaltsfragmentmodell mit dem Namen Article erstellt hat, generiert AEM das Objekt article, das dem Typ ArticleModel entspricht. Die Felder dieses Typs entsprechen den im Modell definierten Feldern und Datentypen.

  1. Ein Inhaltsfragmentmodell:

    Inhaltsfragmentmodell zur Verwendung mit GraphQL

  2. Das entsprechende GraphQL-Schema (Ausgabe aus der automatischen GraphiQL-Dokumentation):
    GraphQL-Schema basierend auf Inhaltsfragmentmodell

    Dies zeigt, dass der generierte Typ ArticleModel mehrere Felder enthält.

    • Drei davon wurden vom Benutzer kontrolliert: author, main und referencearticle.

    • Die anderen Felder wurden automatisch von AEM hinzugefügt und stellen hilfreiche Methoden dar, um Informationen zu einem bestimmten Inhaltsfragment bereitzustellen. In diesem Beispiel _path, _metadata und _variations. Diese Hilfsfelder sind mit einem vorangestellten _ gekennzeichnet, um zu unterscheiden, was vom Benutzer definiert und was automatisch generiert wurde.

  3. Nachdem ein Benutzer ein Inhaltsfragment basierend auf dem Modell „Article“ erstellt hat, kann es über GraphQL abgefragt werden. Beispiele finden Sie in den Beispielabfragen (basierend auf einer Beispielstruktur für Inhaltsfragmente zur Verwendung mit GraphQL).

In GraphQL für AEM ist das Schema flexibel. Dies bedeutet, dass es jedes Mal automatisch generiert wird, wenn ein Inhaltsfragmentmodell erstellt, aktualisiert oder gelöscht wird. Die Datenschema-Caches werden auch aktualisiert, wenn Sie ein Inhaltsfragmentmodell aktualisieren.

Der Sites GraphQL-Service überwacht (im Hintergrund) alle Änderungen, die an einem Inhaltsfragmentmodell vorgenommen werden. Wenn Aktualisierungen erkannt werden, wird nur dieser Teil des Schemas neu generiert. Diese Optimierung spart Zeit und sorgt für Stabilität.

Wenn Sie zum Beispiel:

  1. ein Paket installieren, das Content-Fragment-Model-1 und Content-Fragment-Model-2 enthält:

    1. Es werden GraphQL-Typen für Model-1 und Model-2 generiert.
  2. anschließend Content-Fragment-Model-2 ändern:

    1. Nur der GraphQL-Typ Model-2 wird aktualisiert.

    2. Model-1 bleibt unverändert.

HINWEIS

Dies ist wichtig, wenn Sie Massenaktualisierungen von Inhaltsfragmentmodellen über die REST-API oder auf andere Weise durchführen möchten.

Das Schema wird über denselben Endpunkt wie die GraphQL-Abfragen bereitgestellt, wobei der Client die Tatsache behandelt, dass das Schema mit der GQLschema-Erweiterung aufgerufen wird. Wenn Sie beispielsweise eine einfache GET-Anfrage an /content/cq:graphql/global/endpoint.GQLschema ausführen, wird das Schema mit dem Inhaltstyp ausgegeben: text/x-graphql-schema;charset=iso-8859-1.

Schemagenerierung – Nicht veröffentlichte Modelle

Wenn Inhaltsfragmente verschachtelt sind, kann es vorkommen, dass ein übergeordnetes Inhaltsfragmentmodell veröffentlicht wird, ein referenziertes Modell jedoch nicht.

HINWEIS

Die AEM-Benutzeroberfläche verhindert dies, aber wenn die Veröffentlichung programmgesteuert oder mit Inhaltspaketen erfolgt, kann es vorkommen.

In diesem Fall generiert AEM ein unvollständiges Schema für das übergeordnete Inhaltsfragmentmodell. Das bedeutet, dass die Fragmentreferenz, die vom nicht veröffentlichten Modell abhängt, aus dem Schema entfernt wird.

Felder

Innerhalb des Schemas gibt es einzelne Felder, die zwei grundlegenden Kategorien angehören:

  • Von Ihnen generierte Felder.

    Eine Auswahl von Feldtypen wird verwendet, um Felder basierend auf der Konfiguration des Inhaltsfragmentmodells zu erstellen. Die Feldnamen werden aus dem Feld Eigenschaftsname des Datentyps entnommen.

    • Es ist auch die Eigenschaft Rendern als zu berücksichtigen, da Benutzer bestimmte Datentypen konfigurieren können, beispielsweise als einzeiligen oder mehrzeiligen Text.
  • GraphQL für AEM generiert auch eine Reihe von Hilfsfeldern.

    Diese werden verwendet, um ein Inhaltsfragment zu identifizieren oder um weitere Informationen zu einem Inhaltsfragment abzurufen.

Feldtypen

GraphQL für AEM unterstützt eine Liste von Typen. Alle unterstützten Datentypen für Inhaltsfragmentmodelle und die entsprechenden GraphQL-Typen werden dargestellt:

Datentyp für Inhaltsfragmentmodelle GraphQL-Typ Beschreibung
Einzeilentext Zeichenfolge, [Zeichenfolge] Wird für einfache Zeichenfolgen wie Autorennamen, Ortsnamen usw. verwendet.
Mehrzeilentext Zeichenfolge Wird für die Ausgabe von Text verwendet, z. B. für den Textkörper eines Artikels
Zahl Gleitkommazahl, [Gleitkommazahl] Wird für die Anzeige von Gleitkommazahlen und regulären Zahlen verwendet
Boolesch Boolesch Wird für die Anzeige von Kontrollkästchen → einfachen Wahr/Falsch-Aussagen verwendet
Datum und Uhrzeit Kalender Wird verwendet, um Datum und Uhrzeit in einem ISO 8086-Format anzuzeigen. Je nach ausgewähltem Typ gibt es drei Varianten, die in AEM-GraphQL verwendet werden können: onlyDate, onlyTime, dateTime
Aufzählung Zeichenfolge Wird verwendet, um eine Option aus einer Liste von Optionen anzuzeigen, die bei der Modellerstellung definiert wurde
Tags [Zeichenfolge] Wird verwendet, um eine Liste von Zeichenfolgen anzuzeigen, die in AEM verwendete Tags darstellen
Inhaltsreferenz Zeichenfolge Wird verwendet, um den Pfad zu einem anderen Asset in AEM anzuzeigen
Fragmentreferenz Ein Modelltyp Wird verwendet, um auf ein anderes Inhaltsfragment eines bestimmten Modelltyps zu verweisen, das beim Erstellen des Modells definiert wurde

Hilfsfelder

Zusätzlich zu den Datentypen für benutzergenerierte Felder generiert GraphQL für AEM eine Reihe von Hilfsfeldern, um ein Inhaltsfragment zu identifizieren oder zusätzliche Informationen zu einem Inhaltsfragment bereitzustellen.

Pfad

Das Feld „path“ (Pfad) wird in GraphQL als Bezeichner verwendet. Es stellt den Pfad des Inhaltsfragment-Assets im AEM Repository dar. Wir haben es als Bezeichner für ein Inhaltsfragment ausgewählt, da es:

  • innerhalb von AEM eindeutig ist,
  • leicht abgerufen werden kann.

Der folgende Code zeigt die Pfade aller Inhaltsfragmente an, die auf der Grundlage des Inhaltsfragmentmodells Person erstellt wurden.

{
  personList {
    items {
      _path
    }
  }
}

Um ein einzelnes Inhaltsfragment eines bestimmten Typs abzurufen, müssen Sie auch zuerst dessen Pfad bestimmen. Beispiel:

{
  personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
    item {
      _path
      firstName
      name
    }
  }
}

Siehe Beispielabfrage – ein Einzelstadtfragment.

Metadaten

Mit GraphQL stellt AEM auch die Metadaten eines Inhaltsfragments zur Verfügung. Metadaten sind die Informationen, die ein Inhaltsfragment beschreiben, z. B. der Titel eines Inhaltsfragments, der Pfad der Miniatur, die Beschreibung eines Inhaltsfragments, das Erstellungsdatum usw.

Da Metadaten über den Schema-Editor generiert werden und daher keine bestimmte Struktur haben, wurde der GraphQL-Typ TypedMetaData implementiert, um die Metadaten eines Inhaltsfragments anzuzeigen. TypedMetaData stellt die Informationen gruppiert nach den folgenden Skalartypen bereit:

Feld
stringMetadata:[StringMetadata]!
stringArrayMetadata:[StringArrayMetadata]!
intMetadata:[IntMetadata]!
intArrayMetadata:[IntArrayMetadata]!
floatMetadata:[FloatMetadata]!
floatArrayMetadata:[FloatArrayMetadata]!
booleanMetadata:[BooleanMetadata]!
booleanArrayMetadata:[booleanArrayMetadata]!
calendarMetadata:[CalendarMetadata]!
calendarArrayMetadata:[CalendarArrayMetadata]!

Jeder Skalartyp repräsentiert entweder ein einzelnes Name-Wert-Paar oder ein Array von Name-Wert-Paaren, wobei der Wert dieses Paares dem Typ entspricht, in dem er gruppiert wurde.

Wenn Sie beispielsweise den Titel eines Inhaltsfragments abrufen möchten, wissen wir, dass diese Eigenschaft eine Zeichenfolgeneigenschaft ist. Daher würden wir eine Abfrage für alle Zeichenfolgenmetadaten durchführen:

Abfragen von Metadaten:

{
  personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
    item {
      _path
      _metadata {
        stringMetadata {
          name
          value
        }
      }
    }
  }
}

Sie können alle GraphQL-Typen für Metadaten anzeigen, wenn Sie das generierte GraphQL-Schema anzeigen. Alle Modelltypen haben dieselben TypedMetaData.

HINWEIS

Unterschied zwischen normalen und Array-Metadaten
Beachten Sie, dass sich StringMetadata und StringArrayMetadata beide auf das beziehen, was im Repository gespeichert ist, und nicht darauf, wie Sie sie abrufen.

Wenn Sie beispielsweise das Feld stringMetadata aufrufen, erhalten Sie ein Array aller im Repository gespeicherten Metadaten als String und wenn Sie stringArrayMetadata aufrufen, erhalten Sie ein Array aller Metadaten, die im Repository als String[] gespeichert wurden.

Weitere Informationen finden Sie unter Beispielabfrage für Metadaten – Liste der Metadaten für Auszeichnungen mit dem Titel „GB“.

Varianten

Das Feld _variations wurde implementiert, um die Abfrage der Varianten eines Inhaltsfragments zu vereinfachen. Beispiel:

{
  personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
    item {
      _variations
    }
  }
}

Weitere Informationen finden Sie unter Beispielabfrage – Alle Städte mit einer gegebenen Variante.

GraphQL-Variablen

Mit GraphQL können Variablen in die Abfrage eingefügt werden. Weitere Informationen finden Sie in der GraphQL-Dokumentation zu Variablen.

Um beispielsweise alle Inhaltsfragmente vom Typ Article abzurufen, die eine bestimmte Variante aufweisen, können Sie die Variable variation in GraphiQL angeben.

GraphQL-Variablen

### query
query GetArticlesByVariation($variation: String!) {
    articleList(variation: $variation) {
        items {
            _path
            author
        }
    }
}

### in query variables
{
    "variation": "Introduction"
}

GraphQL-Anweisungen

In GraphQL besteht die Möglichkeit, die Abfrage basierend auf Variablen zu ändern, die als GraphQL-Anweisungen bezeichnet werden.

Sie können beispielsweise das Feld adventurePrice basierend auf einer Variablen includePrice in eine Abfrage für alle AdventureModels einfügen.

GraphQL-Anweisungen

### query
query GetAdventureByType($includePrice: Boolean!) {
  adventureList {
    items {
      adventureTitle
      adventurePrice @include(if: $includePrice)
    }
  }
}

### in query variables
{
    "includePrice": true
}

Filtern

Sie können auch Filterung in Ihren GraphQL-Abfragen verwenden, um bestimmte Daten zurückzugeben.

Beim Filtern wird eine Syntax verwendet, die auf logischen Operatoren und Ausdrücken basiert.

Beispielsweise werden mit der folgenden (einfachen) Abfrage alle Personen mit dem Namen Jobs oder Smith gefiltert:

query {
  personList(filter: {
    name: {
      _logOp: OR
      _expressions: [
        {
          value: "Jobs"
        },
        {
          value: "Smith"
        }
      ]
    }
  }) {
    items {
      name
      firstName
    }
  }
}

Weitere Beispiele finden Sie unter:

GraphQL für AEM – Zusammenfassung der Erweiterungen

Die grundlegende Funktionsweise von Abfragen mit GraphQL für AEM entspricht der Standard-GraphQL-Spezifikation. Für GraphQL-Abfragen mit AEM gibt es einige Erweiterungen:

Abfragen des GraphQL-Endpunkts von einer externen Website

Für den Zugriff auf den GraphQL-Endpunkt über eine externe Website müssen Sie Folgendes konfigurieren:

Authentifizierung

Siehe Authentifizierung für AEM-GraphQL-Remote-Abfragen in Inhaltsfragmenten.

Häufig gestellte Fragen

Es wurden folgende Fragen aufgeworfen:

  1. F: „Wie unterscheidet sich die GraphQL-API für AEM von der Query Builder-API?

    • A:
      Die AEM-GraphQL-API bietet vollständige Kontrolle über die JSON-Ausgabe und ist ein Industriestandard für die Abfrage von Inhalten.
      Für die Zukunft plant AEM, in die AEM GraphQL-API zu investieren.

Tutorial – Erste Schritte mit AEM Headless und GraphQL

Suchen Sie nach einem praktischen Tutorial? Lesen Sie das umfassende Tutorial Erste Schritte mit AEM Headless und GraphQL, in dem veranschaulicht wird, wie Inhalte mithilfe der GraphQL-APIs von AEM erstellt und verfügbar gemacht und von einem externen Programm in einem Headless CMS-Szenario verwendet werden.

Auf dieser Seite