De AEM GraphQL API verkennen
Met de GraphQL API in AEM kunt u gegevens van inhoudsfragmenten toegankelijk maken voor downstreamtoepassingen. In het basisleerprogramma multi-step zelfstudie van GraphQL, gebruikte u de Ontdekkingsreiziger GraphiQL om de vragen van GraphQL te testen en te raffineren.
In dit hoofdstuk, gebruikt u de Ontdekkingsreiziger GraphiQL om geavanceerdere vragen te bepalen om gegevens van de Fragmenten van de Inhoud te verzamelen die u in het vorige hoofdstukcreeerde.
Vereisten prerequisites
Dit document is onderdeel van een zelfstudie met meerdere onderdelen. Controleer of de vorige hoofdstukken zijn voltooid voordat u verdergaat met dit hoofdstuk.
Doelstellingen objectives
In dit hoofdstuk leert u hoe te:
- Een lijst met inhoudsfragmenten filteren met verwijzingen met behulp van queryvariabelen
- Filter voor inhoud binnen een fragmentverwijzing
- Query voor inline-inhoud en fragmentverwijzingen vanuit een tekstveld met meerdere regels
- Query uitvoeren met instructies
- Query voor het inhoudstype JSON-object
De GraphiQL Explorer gebruiken
Het 🔗 hulpmiddel van de Ontdekkingsreiziger 0} GraphiQL laat ontwikkelaars toe om, en testvragen tegen inhoud op het huidige milieu van AEM tot stand te brengen. Het hulpmiddel GraphiQL laat ook gebruikers toe om voort te zetten of vragen te bewaren die door cliënttoepassingen in een productie het plaatsen moeten worden gebruikt.
Verken vervolgens de kracht van de AEM GraphQL API met behulp van de ingebouwde GraphiQL Explorer.
-
Van het scherm van het Begin van AEM, navigeer aan Hulpmiddelen > Algemeen > de Redacteur van de Vraag van GraphQL.
-
In de hoger-juiste hoek, zorg ervoor dat het Eindpunt aan WKND Gedeeld Eindpunt wordt geplaatst. Het veranderen van de drop-down waarde van het Eindpunt toont hier de bestaande Gepersisteerde Vragen in de top-left hoek.
Dit zal werkingsgebied alle vragen aan modellen die in het Gedeelde WKND project worden gecreeerd.
Een lijst met inhoudsfragmenten filteren met behulp van queryvariabelen
In het vorige multi-step GraphQL leerprogramma, bepaalde u, en gebruikte, fundamentele voortgeduurde vragen om de gegevens van Fragments van de Inhoud te krijgen. Hier, breidt u deze kennis uit en de gegevens van de Fragmenten van de filterinhoud door variabelen tot de persisted query over te gaan.
Wanneer het ontwikkelen van cliënttoepassingen, gewoonlijk moet u de Fragmenten van de Inhoud filtreren die op dynamische argumenten worden gebaseerd. Met de AEM GraphQL-API kunt u deze argumenten doorgeven als variabelen in een query om te voorkomen dat tekenreeksconstructies op de client worden uitgevoerd. Voor meer informatie over de variabelen van GraphQL, zie de documentatie van GraphQL.
Voor dit voorbeeld, vraag alle Instructeurs die een bepaalde vaardigheid hebben.
-
In GrahiQL winde, kleef de volgende vraag in het linkerpaneel:
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 } } }
De bovenstaande
listPersonBySkill
query accepteert één variabele (skillFilter
) die een vereisteString
is. Deze query voert een zoekopdracht uit tegen alle Person Content Fragments en filtert deze op basis van hetskills
-veld en de tekenreeks die wordt doorgegeven inskillFilter
.De eigenschap
listPersonBySkill
bevat de eigenschapcontactInfo
. Dit is een fragmentverwijzing naar het model Contactinfo dat in de vorige hoofdstukken is gedefinieerd. Het model Contactinfo bevatphone
- enemail
-velden. Ten minste een van deze velden in de query moet aanwezig zijn om correct te kunnen functioneren.code language-graphql contactInfo { phone email }
-
Vervolgens definiëren we
skillFilter
en krijgen we alle instructeurs die deskundig zijn op het gebied van skiën. Plak de volgende JSON-tekenreeks in het deelvenster Query-variabelen in de GraphiQL IDE:code language-json { "skillFilter": "Skiing" }
-
Voer de vraag uit. Het resultaat moet er ongeveer als volgt uitzien:
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" ] } ] } } }
Druk de knoop van het Spel in het hoogste menu om de vraag uit te voeren. De resultaten van de inhoudsfragmenten uit het vorige hoofdstuk worden weergegeven:
Filter voor inhoud binnen een fragmentverwijzing
Met de AEM GraphQL API kunt u zoeken naar geneste inhoudsfragmenten. In het vorige hoofdstuk hebt u drie nieuwe fragmentverwijzingen toegevoegd aan een Adventure Content-fragment: location
, instructorTeam
en administrator
. Nu, filter alle avonturen voor om het even welke Beheerder die een bepaalde naam heeft.
-
In GrahiQL winde, kleef de volgende vraag in het linkerpaneel:
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 } } } } }
-
Vervolgens plakt u de volgende JSON-tekenreeks in het deelvenster Query-variabelen:
code language-json { "name": "Jacob Wester" }
De query van
getAdventureAdministratorDetailsByAdministratorName
filtert alle avonturen op eenadministrator
vanfullName
"Jacob Wester", waarbij informatie uit twee geneste inhoudsfragmenten wordt geretourneerd: avontuur en instructeur. -
Voer de vraag uit. Het resultaat moet er ongeveer als volgt uitzien:
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." } ] } ] } } } ] } } }
Query voor inline-verwijzingen vanuit een tekstveld met meerdere regels query-rte-reference
Met de AEM GraphQL API kunt u zoeken naar inhoud en fragmentverwijzingen binnen tekstvelden met meerdere regels. In het vorige hoofdstuk, voegde u beide verwijzingstypes in het gebied van de Beschrijving van het Fragment van de Inhoud van het Team Yosemite toe. Laten we deze referenties nu ophalen.
-
In GrahiQL winde, kleef de volgende vraag in het linkerpaneel:
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 } } } } }
De query van
getTeamByAdventurePath
filtert alle avonturen per pad en retourneert gegevens voor de fragmentverwijzing van een specifiek avontuur vaninstructorTeam
._references
is een door het systeem gegenereerd veld dat wordt gebruikt om verwijzingen weer te geven, inclusief die welke in tekstvelden met meerdere regels zijn ingevoegd.Met de query
getTeamByAdventurePath
worden meerdere referenties opgehaald. Eerst wordt het ingebouwdeImageRef
-object gebruikt om de_path
en__typename
afbeeldingen op te halen die als inhoudsverwijzingen zijn ingevoegd in het tekstveld met meerdere regels. Vervolgens wordtLocationModel
gebruikt om de gegevens op te halen van het Locatie-inhoudfragment dat in hetzelfde veld wordt ingevoegd.De query bevat ook het veld
_metadata
. Hierdoor kunt u de naam van het Team Content Fragment ophalen en later in de WKND-app weergeven. -
Vervolgens plakt u de volgende JSON-tekenreeks in het deelvenster Query-variabelen om het Yosemite Backpackaging Adventure op te halen:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking" }
-
Voer de vraag uit. Het resultaat moet er ongeveer als volgt uitzien:
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" } ] } } }
Het
_references
gebied onthult zowel het embleembeeld als het Fragment van de Inhoud van de Inhoud van de Bodge van de Vallei Yosemite dat in het 2} gebied van de Beschrijving werd opgenomen.
Query uitvoeren met instructies
Soms moet u bij het ontwikkelen van clienttoepassingen de structuur van uw query's voorwaardelijk wijzigen. In dit geval kunt u met de AEM GraphQL API GraphQL-instructies gebruiken om het gedrag van uw query's te wijzigen op basis van de opgegeven criteria. Voor meer informatie over de richtlijnen van GraphQL, zie de documentatie van GraphQL.
In de vorige sectie, leerde u hoe te voor gealigneerde verwijzingen binnen multi-line tekstgebieden vragen. De inhoud is opgehaald uit het description
-veld in de plaintext
-indeling. Vervolgens vouwen we die query uit en gebruiken we een instructie om description
ook voorwaardelijk op te halen in de json
-indeling.
-
In GrahiQL winde, kleef de volgende vraag in het linkerpaneel:
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 } } } } }
De vraag hierboven keurt één meer variabele (
includeJson
) goed die vereistBoolean
is, die ook als richtlijn van de vraag wordt bekend. Een instructie kan worden gebruikt om gegevens van het velddescription
voorwaardelijk op te nemen in dejson
-indeling op basis van de Booleaanse waarde die wordt doorgegeven inincludeJson
. -
Vervolgens plakt u de volgende JSON-tekenreeks in het deelvenster Query-variabelen:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/yosemite-backpacking/yosemite-backpacking", "includeJson": false }
-
Voer de vraag uit. U zou het zelfde resultaat zoals in de vorige sectie op moeten krijgen hoe te om voor gealigneerde verwijzingen binnen multi-line tekstgebiedente vragen.
-
Werk de aanwijzing
includeJson
bij naartrue
en voer de query opnieuw uit. Het resultaat moet er ongeveer als volgt uitzien: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" } ] } } }
Query voor het inhoudstype JSON-object
Herinner dat in het vorige hoofdstuk op het ontwerpen van de Fragmenten van de Inhoud, u een voorwerp JSON in het Weather door het 1} gebied van de Verraad {toevoegde. Laten we die gegevens nu ophalen in het locatieinhoudsfragment.
-
In GrahiQL winde, kleef de volgende vraag in het linkerpaneel:
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 } } } }
-
Vervolgens plakt u de volgende JSON-tekenreeks in het deelvenster Query-variabelen:
code language-json { "fragmentPath": "/content/dam/wknd-shared/en/adventures/locations/yosemite-national-park/yosemite-national-park" }
-
Voer de vraag uit. Het resultaat moet er ongeveer als volgt uitzien:
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" } } } } }
Het veld
weatherBySeason
bevat het JSON-object dat in het vorige hoofdstuk is toegevoegd.
Query uitvoeren voor alle inhoud tegelijk
Tot dusver zijn meerdere query's uitgevoerd om de mogelijkheden van de AEM GraphQL API te illustreren.
De zelfde gegevens konden met slechts één enkele vraag worden teruggewonnen en deze vraag wordt later gebruikt in de cliënttoepassing om extra informatie zoals plaats, teamnaam, teamleden van een avontuur terug te winnen:
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"
}
Gefeliciteerd!
Gefeliciteerd! U hebt nu geavanceerde query's getest om gegevens te verzamelen van de inhoudsfragmenten die u in het vorige hoofdstuk hebt gemaakt.
Volgende stappen
In het volgende hoofdstuk, zult u leren hoe te om de vragen van GraphQL voort te zetten en waarom het beste praktijken is om voortgeduurde vragen in uw toepassingen te gebruiken.