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:
GraphQL wird derzeit in zwei (separaten) Szenarios in Adobe Experience Manager (AEM) as a Cloud Service verwendet:
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):
Unter graphql.org:
Unter graphql.com:
Die Implementierung von GraphQL für AEM basiert auf der standardmäßigen GraphQL-Java-Bibliothek. Siehe:
GraphQL verwendet Folgendes:
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.
Mit GraphQL können Sie Abfragen für Folgendes durchführen:
Einen einzelnen Eintrag
Eine Liste von Einträgen
Sie können auch Folgendes ausführen:
Zusätzlich können Sie GraphQL-Abfragen mit der GraphiQL-IDE testen und debuggen.
Die Anwendungsfälle können vom Typ der AEM as a Cloud Service-Umgebung abhängig sein:
Veröffentlichungsumgebung; wird verwendet, um:
Autorenumgebung; wird verwendet, um:
Die Berechtigungen sind diejenigen, die für den Zugriff auf Assets erforderlich sind.
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.
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.
Ein Inhaltsfragmentmodell:
Das entsprechende GraphQL-Schema (Ausgabe aus der automatischen GraphiQL-Dokumentation):
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.
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:
ein Paket installieren, das Content-Fragment-Model-1
und Content-Fragment-Model-2
enthält:
Model-1
und Model-2
generiert.anschließend Content-Fragment-Model-2
ändern:
Nur der GraphQL-Typ Model-2
wird aktualisiert.
Model-1
bleibt unverändert.
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
.
Wenn Inhaltsfragmente verschachtelt sind, kann es vorkommen, dass ein übergeordnetes Inhaltsfragmentmodell veröffentlicht wird, ein referenziertes Modell jedoch nicht.
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.
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.
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.
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 |
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.
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:
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.
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
.
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“.
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.
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.
### query
query GetArticlesByVariation($variation: String!) {
articleList(variation: $variation) {
items {
_path
author
}
}
}
### in query variables
{
"variation": "Introduction"
}
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.
### query
query GetAdventureByType($includePrice: Boolean!) {
adventureList {
items {
adventureTitle
adventurePrice @include(if: $includePrice)
}
}
}
### in query variables
{
"includePrice": true
}
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:
Details zu den Erweiterungen von GraphQL für AEM
Beispielabfragen unter Verwendung dieses Beispielinhalts und dieser Beispielstruktur
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:
Wenn Sie ein einzelnes Ergebnis benötigen:
Wenn Sie eine Ergebnisliste erwarten:
List
zum Modellnamen hinzu, z. B. cityList
Wenn Sie ein logisches ODER verwenden möchten:
_logOp: OR
Es gibt ebenfalls ein logisches UND, es ist aber (oft) implizit.
Sie können Feldnamen abfragen, die den Feldern im Inhaltsfragmentmodell entsprechen.
Zusätzlich zu den Feldern aus Ihrem Modell gibt es einige vom System generierte Felder (denen ein Unterstrich vorangestellt ist):
Für Inhalte:
_locale
: Anzeigen der Sprache; basierend auf Language Manager
_metadata
: Anzeigen von Metadaten für Ihr Fragment
_model
: Zulassen von Abfragen nach einem Inhaltsfragmentmodell (Pfad und Titel)
_path
: Der Pfad zu Ihrem Inhaltsfragment im Repository
_reference
: Anzeigen von Verweisen; einschließlich Inline-Verweisen im Rich-Text-Editor
_variation
: Anzeige bestimmter Varianten in Ihrem Inhaltsfragment
Und Operationen:
_operator
: bestimmte Operatoren anwenden; EQUALS
, EQUALS_NOT
, GREATER_EQUAL
, LOWER
, CONTAINS
, STARTS_WITH
_apply
: bestimmte Bedingungen anwenden; zum Beispiel AT_LEAST_ONCE
_ignoreCase
: Groß-/Kleinschreibung bei der Abfrage ignorieren
GraphQL-Vereinigungstypen werden unterstützt:
... on
Fallback bei der Abfrage verschachtelter Fragmente:
Für den Zugriff auf den GraphQL-Endpunkt über eine externe Website müssen Sie Folgendes konfigurieren:
Siehe Authentifizierung für AEM-GraphQL-Remote-Abfragen in Inhaltsfragmenten.
Es wurden folgende Fragen aufgeworfen:
F: „Wie unterscheidet sich die GraphQL-API für AEM von der Query Builder-API?“
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.