Utforska AEM GraphQL API
Med GraphQL API i AEM kan du visa Content Fragment-data för program längre fram i kedjan. I den grundläggande självstudiekursen om flera steg i GraphQL använde du GraphiQL Explorer för att testa och förfina GraphQL-frågorna.
I det här kapitlet använder du GraphiQL Explorer för att definiera mer avancerade frågor för att samla in data om de innehållsfragment som du skapade i det föregående kapitlet.
Förutsättningar prerequisites
Det här dokumentet är en del av en självstudiekurs i flera delar. Se till att föregående kapitel har fyllts i innan du fortsätter med det här kapitlet.
Mål objectives
I det här kapitlet får du lära dig att:
- Filtrera en lista med innehållsfragment med referenser som använder frågevariabler
- Filter för innehåll i en fragmentreferens
- Fråga efter textbundet innehåll och fragmentreferenser från ett textfält med flera rader
- Fråga med direktiv
- Fråga efter JSON-objektets innehållstyp
Använda GraphiQL Explorer
Med verktyget GraphiQL Explorer kan utvecklare skapa och testa frågor mot innehåll i den aktuella AEM-miljön. Med GraphiQL-verktyget kan användare även spara-frågor som ska användas av klientprogram i en produktionsinställning.
Utforska sedan kraften i AEM GraphQL API med den inbyggda GraphiQL Explorer.
-
På startskärmen i AEM går du till Verktyg > Allmänt > GraphQL Query Editor.
-
Kontrollera att slutpunkten är inställd på WKND-delad slutpunkt i det övre högra hörnet. Om du ändrar listrutan Slutpunkt här visas de befintliga beständiga frågorna i det övre vänstra hörnet.
Detta omfattar alla frågor till modeller som skapats i projektet WKND Shared .
Filtrera en lista med innehållsfragment med frågevariabler
I den tidigare flerstegssjälvstudiekursen för GraphQL definierade och använde du grundläggande beständiga frågor för att hämta information om innehållsfragment. Här utökar du kunskapen och filtrerar Content Fragments-data genom att skicka variabler till de beständiga frågorna.
När du utvecklar klientprogram behöver du vanligtvis filtrera innehållsfragment baserat på dynamiska argument. Med AEM GraphQL API kan du skicka dessa argument som variabler i en fråga för att undvika strängkonstruktion på klientsidan vid körning. Mer information om GraphQL-variabler finns i GraphQL-dokumentationen.
I det här exemplet frågar du alla instruktörer som har en viss kompetens.
-
Klistra in följande fråga i den vänstra panelen i GraphiQL IDE:
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 } } }listPersonBySkill-frågan ovan accepterar en variabel (skillFilter) som är en obligatoriskString. Den här frågan utför en sökning mot alla personinnehållsfragment och filtrerar dem baserat på fältetskillsoch strängen som skickas iskillFilter.listPersonBySkillinnehåller egenskapencontactInfo, som är en fragmentreferens till kontaktinformationsmodellen som definierats i föregående kapitel. Kontaktinformationsmodellen innehåller fältenphoneochemail. Minst ett av dessa fält i frågan måste finnas för att den ska fungera korrekt.code language-graphql contactInfo { phone email } -
Sedan definierar vi
skillFilteroch hämtar alla instruktörer som har kompetens för att skidåkning. Klistra in följande JSON-sträng på panelen Frågevariabler i GraphiQL IDE:code language-json { "skillFilter": "Skiing" } -
Kör frågan. Resultatet ska se ut ungefär så här:
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" ] } ] } } }
Tryck på knappen Spela upp på den översta menyn för att köra frågan. Du bör se resultatet av innehållsfragmenten från det föregående kapitlet:
Filter för innehåll i en fragmentreferens
Med AEM GraphQL API kan du söka efter kapslade innehållsfragment. I det föregående kapitlet lade du till tre nya fragmentreferenser till ett Adventure Content Fragment: location, instructorTeam och administrator. Nu ska vi filtrera alla annonser för alla administratörer som har ett visst namn.
-
Klistra in följande fråga i den vänstra panelen i GraphiQL IDE:
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 } } } } } -
Klistra sedan in följande JSON-sträng på panelen Frågevariabler:
code language-json { "name": "Jacob Wester" }Frågan
getAdventureAdministratorDetailsByAdministratorNamefiltrerar alla tillägg föradministratoravfullName"Jacob Wester" och returnerar information från två kapslade innehållsfragment: Adventure och Instructor. -
Kör frågan. Resultatet ska se ut ungefär så här:
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." } ] } ] } } } ] } } }
Fråga efter textbundna referenser från ett textfält med flera rader query-rte-reference
Med AEM GraphQL API kan du söka efter innehålls- och fragmentreferenser i textfält med flera rader. I föregående kapitel lade du till båda referenstyperna i fältet Beskrivning i Yosemite Team Content Fragment. Nu hämtar vi referenserna.
-
Klistra in följande fråga i den vänstra panelen i GraphiQL IDE:
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 } } } } }Frågan
getTeamByAdventurePathfiltrerar alla annonser efter sökväg och returnerar data för fragmentreferenseninstructorTeamför en specifik Adventure._referencesär ett systemgenererat fält som används för att visa referenser, inklusive de som infogas i flerradiga textfält.getTeamByAdventurePath-frågan hämtar flera referenser. Först används det inbyggdaImageRef-objektet för att hämta_pathoch__typenameför bilder som infogats som innehållsreferenser i textfältet med flera rader. Därefter användsLocationModelför att hämta data från det platsinnehållsfragment som infogats i samma fält.Frågan innehåller även fältet
_metadata. På så sätt kan du hämta namnet på teaminnehållsfragmentet och visa det senare i WKND-appen. -
Klistra sedan in följande JSON-sträng på panelen Frågevariabler för att hämta Yosemite Backpackaging Adventure:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking" } -
Kör frågan. Resultatet ska se ut ungefär så här:
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" } ] } } }Fältet
_referencesvisar både logotypbilden och Yosemite Valley Lodge Content Fragment som infogades i fältet Beskrivning.
Fråga med direktiv
När du utvecklar klientprogram måste du ibland ändra strukturen för dina frågor på ett villkor. I det här fallet kan du med AEM GraphQL API använda GraphQL-direktiv för att ändra beteendet på dina frågor baserat på de angivna villkoren. Mer information om GraphQL-direktiv finns i GraphQL-dokumentationen.
I det föregående avsnittet fick du lära dig att fråga efter textbundna referenser i textfält med flera rader. Innehållet hämtades från fältet description i formatet plaintext. Låt oss sedan utöka frågan och använda ett direktiv för att hämta description villkorligt i formatet json.
-
Klistra in följande fråga i den vänstra panelen i GraphiQL IDE:
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 } } } } }Frågan ovan accepterar ytterligare en variabel (
includeJson) som är en obligatoriskBoolean, som också kallas frågans direktiv. Ett direktiv kan användas för att villkorligt inkludera data från fältetdescriptioni formatetjsonbaserat på det booleska värde som skickas iincludeJson. -
Klistra sedan in följande JSON-sträng på panelen Frågevariabler:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking", "includeJson": false } -
Kör frågan. Du bör få samma resultat som i föregående avsnitt om hur du frågar efter textbundna referenser i textfält med flera rader.
-
Uppdatera direktivet
includeJsontilltrueoch kör frågan igen. Resultatet ska se ut ungefär så här: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" } ] } } }
Fråga efter JSON-objektets innehållstyp
Kom ihåg att du i det föregående kapitlet om utveckling av innehållsfragment lade till ett JSON-objekt i fältet Väder efter säsong. Nu hämtar vi dessa data i Location Content Fragment.
-
Klistra in följande fråga i den vänstra panelen i GraphiQL IDE:
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 } } } } -
Klistra sedan in följande JSON-sträng på panelen Frågevariabler:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/locations/yosemite-national-park/yosemite-national-park" } -
Kör frågan. Resultatet ska se ut ungefär så här:
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" } } } } }Fältet
weatherBySeasoninnehåller det JSON-objekt som lagts till i föregående kapitel.
Fråga om allt innehåll samtidigt
Hittills har flera frågor genomförts för att illustrera funktionerna i AEM GraphQL API.
Samma data kunde bara hämtas med en enda fråga och den här frågan används senare i klientprogrammet för att hämta ytterligare information som plats, teamnamn, teammedlemmar i ett äventyr:
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"
}
Grattis!
Grattis! Du har nu testat avancerade frågor för att samla in data om de innehållsfragment som du skapade i föregående kapitel.
Nästa steg
I nästa kapitel får du lära dig hur du behåller GraphQL-frågor och varför det är bäst att använda beständiga frågor i dina program.