Erkunden der AEM-GraphQL-API
Mit der GraphQL-API in AEM können Sie Inhaltsfragmentdaten für nachgelagerte Anwendungen bereitstellen. Im mehrstufigen GraphQL-Einführungs-Tutorial haben Sie den GraphiQL-Explorer zum Testen und Verfeinern von GraphQL-Abfragen verwendet.
In diesem Kapitel verwenden Sie den GraphiQL-Explorer, um erweiterte Abfragen zum Erfassen von Daten der im vorherigen Kapitel erstellten Inhaltsfragmente zu definieren.
Voraussetzungen prerequisites
Dieses Dokument ist Teil eines mehrteiligen Tutorials. Bevor Sie mit diesem Kapitel fortfahren, sollten Sie die vorherigen Kapitel abgeschlossen haben.
Ziele objectives
In diesem Kapitel lernen Sie Folgendes:
- Filtern einer Liste von Inhaltsfragmenten mit Verweisen mithilfe von Abfragevariablen
- Filtern von Inhalten in einem Fragmentverweis
- Abfragen von Inline-Inhalten und Fragmentverweisen über ein mehrzeiliges Textfeld
- Abfragen mithilfe von Anweisungen
- Abfragen nach dem Content-Typ des JSON-Objekts
Verwenden des GraphiQL-Explorers
Der GraphiQL-Explorer ermöglicht es Entwickelnden, Abfragen für Inhalte in der aktuellen AEM-Umgebung zu erstellen und zu testen. Mit dem GraphiQL-Tool können Benutzende auch Abfragen beibehalten oder speichern, die von Client-Anwendungen in einem Produktionsszenario verwendet werden sollen.
Erkunden Sie als Nächstes die Leistungsfähigkeit der AEM-GraphQL-API mit dem integrierten GraphiQL-Explorer.
-
Navigieren Sie im AEM-Startbildschirm zu Tools > Allgemein > GraphQL-Abfrage-Editor.
-
Stellen Sie sicher, dass oben rechts der Endpunkt auf Freigegebener WKND-Endpunkt eingestellt ist. Wenn Sie hier den Dropdown-Wert für den Endpunkt ändern, werden oben links die vorhandenen persistierten Abfragen angezeigt.
Dadurch werden alle Abfragen auf Modelle angewendet, die im freigegebenen WKND-Projekt erstellt wurden.
Filtern einer Liste von Inhaltsfragmenten mithilfe von Abfragevariablen
Im vorherigen mehrstufigen GraphQL-Tutorial haben Sie grundlegende persistierte Abfragen definiert und verwendet, um Inhaltsfragmentdaten abzurufen. Hier erweitern Sie dieses Wissen und filtern Inhaltsfragmentdaten, indem Sie Variablen an die persistierten Abfragen übergeben.
Bei der Entwicklung von Client-Anwendungen müssen Sie normalerweise Inhaltsfragmente basierend auf dynamischen Argumenten filtern. Mit der AEM-GraphQL-API können Sie diese Argumente als Variablen in einer Abfrage übergeben, um die Erstellung von Zeichenfolgen zur Laufzeit auf Client-Seite zu vermeiden. Weitere Informationen zu GraphQL-Variablen finden Sie in der GraphQL-Dokumentation.
In diesem Beispiel wird sämtliches Lehrpersonal abgefragt, das eine bestimmte Fähigkeit besitzt.
-
Fügen Sie in die GraphiQL-IDE die folgende Abfrage in das linke Panel ein:
code language-graphql query listPersonBySkill ($skillFilter: String!){ personList( _locale: "en" filter: {skills: {_expressions: [{value: $skillFilter}]}} ) { items { fullName contactInfo { phone email } profilePicture { ... on ImageRef { _path } } biography { plaintext } instructorExperienceLevel skills } } }
Die oben stehende Abfrage
listPersonBySkill
akzeptiert 1 Variable (skillFilter
), bei der es sich um einen erforderlichenString
handelt. Diese Abfrage führt eine Suche für alle personenbezogenen Inhaltsfragmente durch und filtert sie basierend auf dem Feldskills
und der inskillFilter
übergebenen Zeichenfolge.listPersonBySkill
umfasst die EigenschaftcontactInfo
, die einen Fragmentverweis auf das in den vorherigen Kapiteln definierte contactInfo-Modell darstellt. Das contactInfo-Modell enthält die Felderphone
undemail
. Mindestens eines dieser Felder muss in der Abfrage vorhanden sein, damit diese ordnungsgemäß ausgeführt werden kann.code language-graphql contactInfo { phone email }
-
Als Nächstes definieren wir
skillFilter
und rufen sämtliches Lehrpersonal ab, das Skifahren kann. Fügen Sie die folgende JSON-Zeichenfolge in das Panel „Abfragevariablen“ der GraphiQL-IDE ein:code language-json { "skillFilter": "Skiing" }
-
Führen Sie die Abfrage aus. Das Ergebnis sollte etwa wie folgt aussehen:
code language-json { "data": { "personList": { "items": [ { "fullName": "Stacey Roswells", "contactInfo": { "phone": "209-888-0011", "email": "sroswells@wknd.com" }, "profilePicture": { "_path": "/content/dam/wknd-shared/en/contributors/stacey-roswells.jpg" }, "biography": { "plaintext": "Stacey Roswells is an accomplished rock climber and alpine adventurer. Born in Baltimore, Maryland, Stacey is the youngest of six children. Stacey's father was a lieutenant colonel in the US Navy and mother was a modern dance instructor. Stacey's family moved frequently with father's duty assignments and took the first pictures when father was stationed in Thailand. This is also where Stacey learned to rock climb." }, "instructorExperienceLevel": "Advanced", "skills": [ "Rock Climbing", "Skiing", "Backpacking" ] } ] } } }
Wählen Sie im oberen Menü die Schaltfläche für die Wiedergabe aus, um die Abfrage auszuführen. Sie sollten die Ergebnisse der Inhaltsfragmente aus dem vorherigen Kapitel sehen:
Filtern von Inhalten in einem Fragmentverweis
Mit der AEM GraphQL-API können Sie verschachtelte Inhaltsfragmente abfragen. Im vorherigen Kapitel haben Sie drei neue Fragmentverweise zu einem Adventure-Inhaltsfragment hinzugefügt: location
, instructorTeam
und administrator
. Filtern wir nun alle Adventures nach Administrierenden mit einem bestimmten Namen.
-
Fügen Sie in die GraphiQL-IDE die folgende Abfrage in das linke Panel ein:
code language-graphql query getAdventureAdministratorDetailsByAdministratorName ($name: String!){ adventureList( _locale: "en" filter: {administrator: {fullName: {_expressions: [{value: $name}]}}} ) { items { title administrator { fullName contactInfo { phone email } administratorDetails { json } } } } }
-
Fügen Sie anschließend die folgende JSON-Zeichenfolge in das Panel „Abfragevariablen“ ein:
code language-json { "name": "Jacob Wester" }
Die Abfrage
getAdventureAdministratorDetailsByAdministratorName
filtert alle Adventures für beliebigeadministrator
mitfullName
„Jacob Wester“ und gibt Informationen aus zwei verschachtelten Inhaltsfragmenten zurück: Adventure und Instructor. -
Führen Sie die Abfrage aus. Das Ergebnis sollte etwa wie folgt aussehen:
code language-json { "data": { "adventureList": { "items": [ { "title": "Yosemite Backpacking", "administrator": { "fullName": "Jacob Wester", "contactInfo": { "phone": "209-888-0000", "email": "jwester@wknd.com" }, "administratorDetails": { "json": [ { "nodeType": "paragraph", "content": [ { "nodeType": "text", "value": "Jacob Wester has been coordinating backpacking adventures for three years." } ] } ] } } } ] } } }
Abfrage für Inline-Referenzen aus einem mehrzeiligen Textfeld query-rte-reference
Mit der AEM GraphQL-API können Sie Inhalte und Fragmentreferenzen in mehrzeiligen Textfeldern abfragen. Im vorherigen Kapitel haben Sie beide Referenztypen zum Feld Beschreibung des Inhaltsfrgments „Yosemite Team“ hinzugefügt. Nun rufen wir diese Referenzen ab.
-
Fügen Sie in die GraphiQL-IDE die folgende Abfrage in das linke Panel ein:
code language-graphql query getTeamByAdventurePath ($fragmentPath: String!){ adventureByPath (_path: $fragmentPath) { item { instructorTeam { _metadata { stringMetadata { name value } } teamFoundingDate description { plaintext } } } _references { ... on ImageRef { __typename _path } ... on LocationModel { __typename _path name address { streetAddress city zipCode country } contactInfo { phone email } } } } }
Die Abfrage
getTeamByAdventurePath
filtert alle Adventures nach Pfad und gibt Daten für dieinstructorTeam
-Fragmentreferenz eines bestimmten Adventures zurück._references
ist ein systemgeneriertes Feld, das für die Anzeige von Referenzen verwendet wird, einschließlich derjenigen, die in mehrzeilige Textfelder eingefügt werden.Die Abfrage
getTeamByAdventurePath
ruft mehrere Referenzen ab. Zunächst wird das integrierte ObjektImageRef
zum Abrufen von_path
und__typename
von Bildern verwendet, die als Inhaltsreferenzen in das mehrzeilige Textfeld eingefügt wurden. Als Nächstes verwendet sieLocationModel
, um die Daten des im selben Feld eingefügten Inhaltsfragments „Standort“ abzurufen.Die Abfrage enthält auch das Feld
_metadata
. Auf diese Weise können Sie den Namen des Inhaltsfragments „Team“ abrufen und später in der WKND-App anzeigen. -
Fügen Sie als Nächstes die folgende JSON-Zeichenfolge in das Panel „Abfragevariablen“ ein, um das Yosemite-Backpacker-Adventure zu erhalten:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking" }
-
Führen Sie die Abfrage aus. Das Ergebnis sollte etwa wie folgt aussehen:
code language-json { "data": { "adventureByPath": { "item": { "instructorTeam": { "_metadata": { "stringMetadata": [ { "name": "title", "value": "Yosemite Team" }, { "name": "description", "value": "" } ] }, "teamFoundingDate": "2016-05-24", "description": { "plaintext": "\n\nThe team of professional adventurers and hiking instructors working in Yosemite National Park.\n\nYosemite Valley Lodge" } } }, "_references": [ { "__typename": "LocationModel", "_path": "/content/dam/wknd-shared/en/adventures/locations/yosemite-valley-lodge/yosemite-valley-lodge", "name": "Yosemite Valley Lodge", "address": { "streetAddress": "9006 Yosemite Lodge Drive", "city": "Yosemite National Park", "zipCode": "95389", "country": "United States" }, "contactInfo": { "phone": "209-992-0000", "email": "yosemitelodge@wknd.com" } }, { "__typename": "ImageRef", "_path": "/content/dam/wknd-shared/en/adventures/teams/yosemite-team/team-yosemite-logo.png" } ] } } }
Das Feld
_references
zeigt sowohl das Logo-Bild als auch das Inhaltsfragment „Yosemite Valley Lodge“ an, das in das Feld Beschreibung eingefügt wurde.
Abfragen mithilfe von Anweisungen
Manchmal müssen Sie bei der Entwicklung von Client-Anwendungen die Struktur Ihrer Abfragen beim Vorliegen bestimmter Bedingungen ändern. In diesem Fall können Sie mit der AEM GraphQL-API GraphQL-Anweisungen verwenden, um das Verhalten Ihrer Abfragen anhand der vorliegenden Kriterien zu ändern. Weitere Informationen zu GraphQL-Anweisungen finden Sie in der Dokumentation zu GraphQL.
Im vorherigen Abschnitt haben Sie gelernt, wie Sie Inline-Verweise in mehrzeiligen Textfeldern abfragen können. Der Inhalt wurde aus der description
im plaintext
-Format abgerufen. Als Nächstes erweitern wir diese Abfrage und verwenden eine Anweisung, um die description
mit Bedingungen auch im json
-Format abzurufen.
-
Fügen Sie in die GraphiQL-IDE die folgende Abfrage in das linke Panel ein:
code language-graphql query getTeamByAdventurePath ($fragmentPath: String!, $includeJson: Boolean!){ adventureByPath(_path: $fragmentPath) { item { instructorTeam { _metadata{ stringMetadata{ name value } } teamFoundingDate description { plaintext json @include(if: $includeJson) } } } _references { ... on ImageRef { __typename _path } ... on LocationModel { __typename _path name address { streetAddress city zipCode country } contactInfo { phone email } } } } }
Die oben stehende Abfrage akzeptiert eine weitere Variable (
includeJson
), die vom TypBoolean
sein muss und auch als Abfrageanweisung bezeichnet wird. Basierend auf dem inincludeJson
übergebenen booleschen Wert kann eine Anweisung verwendet werden, um Daten aus dem Felddescription
imjson
-Format einzuschließen. -
Fügen Sie anschließend die folgende JSON-Zeichenfolge in das Panel „Abfragevariablen“ ein:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking", "includeJson": false }
-
Führen Sie die Abfrage aus. Sie sollten dasselbe Ergebnis erhalten wie im vorherigen Abschnitt mit der Anleitung zum Abfragen von Inline-Referenzen in mehrzeiligen Textfeldern.
-
Aktualisieren Sie die
includeJson
-Anweisung auftrue
und führen Sie die Abfrage erneut aus. Das Ergebnis sollte etwa wie folgt aussehen:code language-json { "data": { "adventureByPath": { "item": { "instructorTeam": { "_metadata": { "stringMetadata": [ { "name": "title", "value": "Yosemite Team" }, { "name": "description", "value": "" } ] }, "teamFoundingDate": "2016-05-24", "description": { "plaintext": "\n\nThe team of professional adventurers and hiking instructors working in Yosemite National Park.\n\nYosemite Valley Lodge", "json": [ { "nodeType": "paragraph", "content": [ { "nodeType": "reference", "data": { "path": "/content/dam/wknd-shared/en/adventures/teams/yosemite-team/team-yosemite-logo.png", "mimetype": "image/png" } } ] }, { "nodeType": "paragraph", "content": [ { "nodeType": "text", "value": "The team of professional adventurers and hiking instructors working in Yosemite National Park." } ] }, { "nodeType": "paragraph", "content": [ { "nodeType": "reference", "data": { "href": "/content/dam/wknd-shared/en/adventures/locations/yosemite-valley-lodge/yosemite-valley-lodge", "type": "fragment" }, "value": "Yosemite Valley Lodge" } ] } ] } } }, "_references": [ { "__typename": "LocationModel", "_path": "/content/dam/wknd-shared/en/adventures/locations/yosemite-valley-lodge/yosemite-valley-lodge", "name": "Yosemite Valley Lodge", "address": { "streetAddress": "9006 Yosemite Lodge Drive", "city": "Yosemite National Park", "zipCode": "95389", "country": "United States" }, "contactInfo": { "phone": "209-992-0000", "email": "yosemitelodge@wknd.com" } }, { "__typename": "ImageRef", "_path": "/content/dam/wknd-shared/en/adventures/teams/yosemite-team/team-yosemite-logo.png" } ] } } }
Abfragen nach dem Content-Typ des JSON-Objekts
Im vorherigen Kapitel zur Bearbeitung von Inhaltsfragmenten haben Sie ein JSON-Objekt zum Feld Wetter nach Saison hinzugefügt. Rufen wir diese Daten jetzt im Inhaltsfragment „Standort“ ab.
-
Fügen Sie in die GraphiQL-IDE die folgende Abfrage in das linke Panel ein:
code language-graphql query getLocationDetailsByLocationPath ($fragmentPath: String!) { locationByPath(_path: $fragmentPath) { item { name description { json } contactInfo { phone email } locationImage { ... on ImageRef { _path } } weatherBySeason address { streetAddress city state zipCode country } } } }
-
Fügen Sie anschließend die folgende JSON-Zeichenfolge in das Panel „Abfragevariablen“ ein:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/locations/yosemite-national-park/yosemite-national-park" }
-
Führen Sie die Abfrage aus. Das Ergebnis sollte etwa wie folgt aussehen:
code language-json { "data": { "locationByPath": { "item": { "name": "Yosemite National Park", "description": { "json": [ { "nodeType": "paragraph", "content": [ { "nodeType": "text", "value": "Yosemite National Park is in California's Sierra Nevada mountains. It's famous for its gorgeous waterfalls, giant sequoia trees, and iconic views of El Capitan and Half Dome cliffs." } ] }, { "nodeType": "paragraph", "content": [ { "nodeType": "text", "value": "Hiking and camping are the best ways to experience Yosemite. Numerous trails provide endless opportunities for adventure and exploration." } ] } ] }, "contactInfo": { "phone": "209-999-0000", "email": "yosemite@wknd.com" }, "locationImage": { "_path": "/content/dam/wknd-shared/en/adventures/locations/yosemite-national-park/yosemite-national-park.jpeg" }, "weatherBySeason": { "summer": "81 / 89°F", "fall": "56 / 83°F", "winter": "46 / 51°F", "spring": "57 / 71°F" }, "address": { "streetAddress": "9010 Curry Village Drive", "city": "Yosemite Valley", "state": "CA", "zipCode": "95389", "country": "United States" } } } } }
Das Feld
weatherBySeason
enthält das JSON-Objekt, das im vorherigen Kapitel hinzugefügt wurde.
Alle Inhalte gleichzeitig abfragen
Bisher wurden mehrere Abfragen ausgeführt, um die Funktionen der AEM GraphQL-API zu veranschaulichen.
Dieselben Daten können mit einer einzigen Abfrage abgerufen werden. Diese Abfrage wird später in der Client-Anwendung verwendet, um zusätzliche Informationen wie Ort, Team-Name und Team-Mitglieder eines Abenteuers abzurufen:
query getAdventureDetailsBySlug($slug: String!) {
adventureList(filter: {slug: {_expressions: [{value: $slug}]}}) {
items {
_path
title
activity
adventureType
price
tripLength
groupSize
difficulty
primaryImage {
... on ImageRef {
_path
mimeType
width
height
}
}
description {
html
json
}
itinerary {
html
json
}
location {
_path
name
description {
html
json
}
contactInfo {
phone
email
}
locationImage {
... on ImageRef {
_path
}
}
weatherBySeason
address {
streetAddress
city
state
zipCode
country
}
}
instructorTeam {
_metadata {
stringMetadata {
name
value
}
}
teamFoundingDate
description {
json
}
teamMembers {
fullName
contactInfo {
phone
email
}
profilePicture {
... on ImageRef {
_path
}
}
instructorExperienceLevel
skills
biography {
html
}
}
}
administrator {
fullName
contactInfo {
phone
email
}
biography {
html
}
}
}
_references {
... on ImageRef {
_path
mimeType
}
... on LocationModel {
_path
__typename
}
}
}
}
# in Query Variables
{
"slug": "yosemite-backpacking"
}
Herzlichen Glückwunsch!
Herzlichen Glückwunsch! Sie haben jetzt erweiterte Abfragen zum Erfassen von Daten zu den Inhaltsfragmenten getestet, die Sie im vorherigen Kapitel erstellt haben.
Nächste Schritte
Im nächsten Kapitel erfahren Sie, wie Sie GraphQL-Abfragen persistieren und warum es als Best Practice gilt, persistierte Abfragen in Ihren Anwendungen zu verwenden.