Leer hoe u inhoudsfragmenten in Adobe Experience Manager (AEM) kunt gebruiken met de AEM GraphQL API voor het leveren van inhoud zonder kop.
AEM GraphQL API die wordt gebruikt met Content Fragments is sterk gebaseerd op de standaard, open-source GraphQL API.
Door de GraphQL API in AEM te gebruiken, kunt u inhoudsfragmenten efficiënt aan JavaScript-clients leveren in CMS-implementaties zonder kop:
GraphQL wordt momenteel gebruikt in twee (afzonderlijke) scenario's in Adobe Experience Manager (AEM):
GraphQL is:
"…een querytaal voor API's en een runtime voor het uitvoeren van deze query's met uw bestaande gegevens. GraphQL biedt een volledige en begrijpelijke beschrijving van de gegevens in uw API, geeft clients de mogelijkheid om precies te vragen wat ze nodig hebben en niets meer, maakt het gemakkelijker om API's in de loop der tijd te ontwikkelen en maakt krachtige ontwikkelaarsgereedschappen mogelijk.".
Zie GraphQL.org
"…een open specificatie voor een flexibele API-laag. Plaats GraphQL over uw bestaande achtergronden om producten sneller dan ooit te bouwen…".
Zie GraphQL verkennen.
"…een taal en specificatie voor gegevensquery die in 2012 intern door Facebook zijn ontwikkeld, voordat deze in 2015 openbaar is uitbesteed. Het biedt een alternatief voor op REST gebaseerde architecturen met als doel de productiviteit van ontwikkelaars te verhogen en de hoeveelheden overgedragen gegevens te minimaliseren. GraphQL wordt gebruikt in productie door honderden organisaties van elke omvang…"
Zie GraphQL Foundation.
Raadpleeg de volgende secties (onder andere over veel andere bronnen) voor meer informatie over de GraphQL API:
At graphql.org:
At graphql.com:
De GraphQL for AEM-implementatie is gebaseerd op de standaard GraphQL Java Library. Zie:
GraphQL gebruikt het volgende:
Het pad in AEM dat reageert op GraphQL-query's en toegang biedt tot de GraphQL-schema's.
Zie GraphQL Endpoint inschakelen voor nadere bijzonderheden.
Zie de (GraphQL.org) Inleiding tot GraphQL voor uitvoerige informatie, waaronder Aanbevolen werkwijzen.
Met GraphQL kunt u query's uitvoeren die worden geretourneerd:
A enkel item
AEM biedt mogelijkheden om query's (beide typen) om te zetten in Blijvende query's, die door Dispatcher en CDN in de cache kunnen worden opgeslagen.
De Blijvende query's zijn de aanbevolen methode voor het publiceren van exemplaren als:
Gewoonlijk is er geen verzender/CDN op auteur, zodat is er geen aanwinst in het gebruiken van persisted query's daar; behalve het testen ervan.
GraphQL-query's die gebruikmaken van POST-aanvragen worden niet aanbevolen omdat ze niet in de cache zijn opgeslagen, zodat in een standaardinstantie de Dispatcher is geconfigureerd om dergelijke query's te blokkeren.
Hoewel GraphQL ook GET-aanvragen ondersteunt, kunnen deze limieten bereiken (bijvoorbeeld de lengte van de URL) die kunnen worden vermeden door middel van permanente query's.
De capaciteit om directe vragen uit te voeren kan op een bepaald punt in de toekomst worden verouderd.
Het eindpunt is het pad dat wordt gebruikt om toegang te krijgen tot GraphQL voor AEM. Met dit pad kunt u (of uw app) het volgende doen:
Er zijn twee soorten eindpunten in AEM:
Met de Inhoudsfragmenteditor kan een inhoudsfragment van een siteconfiguratie verwijzen naar een inhoudsfragment van een andere siteconfiguratie (via beleid).
In een dergelijk geval zal niet alle inhoud kunnen terugwinnen gebruikend een de configuratie van Plaatsen specifiek eindpunt.
De inhoudauteur zou dit scenario moeten controleren; Het kan bijvoorbeeld handig zijn om gedeelde modellen van inhoudsfragmenten onder de configuratie Algemene sites te plaatsen.
Het pad naar de opslagplaats van de GraphQL voor AEM globale eindpunt is:
/content/cq:graphql/global/endpoint
Voor welke toepassing uw toepassing het volgende pad in de aanvraag-URL kan gebruiken:
/content/_cq_graphql/global/endpoint.json
Om een eindpunt voor GraphQL voor AEM toe te laten moet u:
Om een Eindpunt van GraphQL toe te laten moet u eerst een aangewezen configuratie hebben. Zie Inhoudsfragmenten - Configuratiebrowser.
Als de gebruik van inhoudsfragmentmodellen is niet ingeschakeldde Maken is niet beschikbaar.
Om het overeenkomstige eindpunt toe te laten:
Navigeren naar Gereedschappen, Activa selecteert u vervolgens GraphQL.
Selecteer Maken.
De Nieuw GraphQL-eindpunt maken wordt geopend. Hier kunt u opgeven:
De volgende waarschuwing wordt weergegeven in het dialoogvenster:
Bevestigen met Maken.
De Volgende stappen de dialoog zal een directe verbinding aan de console van de Veiligheid verstrekken zodat u kunt ervoor zorgen dat het onlangs gecreeerde eindpunt geschikte toestemmingen heeft.
Het eindpunt is toegankelijk voor iedereen. Dit kan - vooral bij publicatieinstanties - een veiligheidszorg veroorzaken, aangezien de vragen van GraphQL een zware lading op de server kunnen opleggen.
U kunt opstelling ACLs, aangewezen aan uw gebruiksgeval, op het eindpunt.
Selecteer het nieuwe eindpunt en Publiceren om het volledig beschikbaar te maken in alle milieu's.
Het eindpunt is toegankelijk voor iedereen.
Bij het publiceren van instanties kan dit een veiligheidszorg veroorzaken, aangezien de vragen van GraphQL een zware lading op de server kunnen opleggen.
U moet opstelling ACLs aangewezen aan uw gebruiksgeval op het eindpunt.
Tenuitvoerlegging van de norm GraphiQL kan worden gebruikt met AEM GraphQL.
GraphiQL is inbegrepen in alle milieu's van AEM (maar zal slechts toegankelijk/zichtbaar zijn wanneer u uw eindpunten vormt).
In vorige versies was een pakket nodig om GraphiQL IDE te installeren. Als u deze installatie hebt, kunt u deze nu verwijderen.
Met deze interface kunt u query's rechtstreeks invoeren en testen.
Bijvoorbeeld:
http://localhost:4502/content/graphiql.html
Dit biedt functies zoals syntaxismarkering, automatisch aanvullen, automatisch voorstellen, samen met een geschiedenis en online documentatie:
Zie voor meer informatie GraphiQL IDE gebruiken.
De gebruiksgevallen kunnen afhankelijk zijn van het type AEM omgeving:
Publicatie-omgeving; gebruikt voor:
Auteursomgeving; gebruikt voor:
De machtigingen zijn vereist voor toegang tot middelen.
GraphQL query's worden uitgevoerd met toestemming van de AEM gebruiker van het onderliggende verzoek. Als de gebruiker geen leestoegang heeft tot bepaalde fragmenten (die als Elementen worden opgeslagen), zullen zij geen deel van de resultaatreeks worden.
Bovendien moet de gebruiker toegang hebben tot een GraphQL-eindpunt om GraphQL-query's uit te kunnen voeren.
GraphQL is een sterk getypeerde API, wat betekent dat de gegevens duidelijk gestructureerd en ingedeeld moeten zijn per type.
De GraphQL-specificatie biedt een aantal richtlijnen voor het maken van een robuuste API voor het ondervragen van gegevens over een bepaalde instantie. Om dit te doen, moet een cliënt halen Schema, die alle typen bevat die nodig zijn voor een query.
Voor inhoudsfragmenten zijn de GraphQL-schema's (structuur en typen) gebaseerd op Ingeschakeld Modellen van inhoudsfragmenten en hun gegevenstypen.
Alle GraphQL-schema's (afgeleid van Content Fragment Models) die zijn Ingeschakeld) zijn leesbaar via het GraphQL-eindpunt.
Dit betekent dat u ervoor moet zorgen dat er geen gevoelige gegevens beschikbaar zijn, aangezien deze op deze manier kunnen worden gelekt; Dit omvat bijvoorbeeld informatie die als veldnamen in de modeldefinitie aanwezig kan zijn.
Als een gebruiker bijvoorbeeld een Content Fragment Model heeft gemaakt, genaamd Article
AEM het object genereren article
van een type ArticleModel
. De velden in dit type komen overeen met de velden en gegevenstypen die in het model zijn gedefinieerd.
A Content Fragment Model:
Het corresponderende GraphQL-schema (uitvoer van de automatische documentatie GraphiQL):
Dit toont aan dat het geproduceerde type ArticleModel
bevat diverse velden.
Drie van hen zijn gecontroleerd door de gebruiker: author
, main
en referencearticle
.
De andere velden zijn automatisch toegevoegd door AEM en zijn nuttige methoden voor het verschaffen van informatie over een bepaald inhoudsfragment. in dit voorbeeld: _path
, _metadata
, _variations
. Deze helpervelden zijn gemarkeerd met een voorgaande _
om onderscheid te maken tussen wat door de gebruiker is gedefinieerd en wat automatisch is gegenereerd.
Nadat een gebruiker een inhoudsfragment heeft gemaakt op basis van het artikelmodel, kan het vervolgens worden ondervraagd via GraphQL. Zie voor voorbeelden de Voorbeeldquery's (op basis van een voorbeeldstructuur van inhoudsfragment voor gebruik met GraphQL).
In GraphQL for AEM is het schema flexibel. Dit betekent dat deze telkens automatisch wordt gegenereerd wanneer een inhoudsfragmentmodel wordt gemaakt, bijgewerkt of verwijderd. De caches voor het gegevensschema worden ook vernieuwd wanneer u een model van het inhoudsfragment bijwerkt.
De service Sites GraphQL luistert (op de achtergrond) naar eventuele wijzigingen die zijn aangebracht in een inhoudsfragmentmodel. Wanneer updates worden ontdekt, slechts wordt dat deel van het schema opnieuw geproduceerd. Deze optimalisatie bespaart tijd en zorgt voor stabiliteit.
Als u bijvoorbeeld:
Een pakket installeren met Content-Fragment-Model-1
en Content-Fragment-Model-2
:
Model-1
en Model-2
wordt gegenereerd.Vervolgens wijzigen Content-Fragment-Model-2
:
Alleen de Model-2
GraphQL-type wordt bijgewerkt.
Overwegende Model-1
blijft hetzelfde.
Dit is belangrijk om op te merken voor het geval u bulkupdates op de Modellen van het Fragment van de Inhoud door REST api, of anders wilt doen.
Het schema wordt gediend door het zelfde eindpunt zoals de vragen van GraphQL, met de cliënt die het feit behandelt dat het schema met de uitbreiding wordt geroepen GQLschema
. U kunt bijvoorbeeld een eenvoudige GET
verzoek op /content/cq:graphql/global/endpoint.GQLschema
resulteert in de uitvoer van het schema met het inhoudstype: text/x-graphql-schema;charset=iso-8859-1
.
Wanneer Inhoudsfragmenten zijn genest, kan een bovenliggend inhoudsfragmentmodel worden gepubliceerd, maar een model waarnaar wordt verwezen, niet.
De AEM UI verhindert dit gebeurt, maar als het publiceren programmatically, of met inhoudspakketten wordt gemaakt, kan het voorkomen.
Wanneer dit gebeurt, genereert AEM een onvolledig Schema voor het bovenliggende inhoudsfragmentmodel. Dit betekent dat de fragmentverwijzing, die afhankelijk is van het niet-gepubliceerde model, uit het schema wordt verwijderd.
Binnen het schema zijn er afzonderlijke velden, van twee basiscategorieën:
Velden die u genereert.
Een selectie van Veldtypen worden gebruikt om velden te maken die zijn gebaseerd op de manier waarop u het inhoudsfragmentmodel configureert. De veldnamen zijn afkomstig uit het Eigenschapnaam van het Gegevenstype.
GraphQL for AEM genereert ook een aantal helpervelden.
Deze worden gebruikt om een inhoudsfragment te identificeren of om meer informatie over een inhoudsfragment te krijgen.
GraphQL for AEM ondersteunt een lijst met typen. Alle ondersteunde gegevenstypen van het inhoudsfragmentmodel en de bijbehorende GraphQL-typen worden weergegeven:
Inhoudsfragmentmodel - Gegevenstype | GraphQL-type | Beschrijving |
---|---|---|
Tekst met één regel | String, [String] | Wordt gebruikt voor eenvoudige tekenreeksen, zoals namen van auteurs, locaties, enzovoort. |
Tekst met meerdere regels | Tekenreeks | Wordt gebruikt voor het uitvoeren van tekst, zoals de hoofdtekst van een artikel |
Getal | Float [Float] | Wordt gebruikt om het zwevende-kommagetal en de reguliere getallen weer te geven |
Boolean | Boolean | Gebruikt om selectievakjes weer te geven → eenvoudige true/false-instructies |
Datum en tijd | Kalender | Wordt gebruikt om datum en tijd weer te geven in de ISO 8086-indeling. Afhankelijk van het geselecteerde type zijn er drie kleuren beschikbaar voor gebruik in AEM GraphQL: onlyDate , onlyTime , dateTime |
Opsomming | Tekenreeks | Wordt gebruikt om een optie weer te geven uit een lijst met opties die bij het maken van het model zijn gedefinieerd |
Tags | [Tekenreeks] | Wordt gebruikt om een lijst weer te geven met tekenreeksen die tags vertegenwoordigen die in AEM worden gebruikt |
Content Reference | Tekenreeks | Wordt gebruikt om het pad naar een ander element in AEM weer te geven |
Fragmentverwijzing | Een modeltype | Wordt gebruikt om te verwijzen naar een ander inhoudsfragment van een bepaald modeltype, dat is gedefinieerd toen het model werd gemaakt. |
Naast de gegevenstypen voor door de gebruiker gegenereerde velden, genereert GraphQL for AEM ook een aantal helper velden voor het herkennen van een inhoudsfragment of voor het verschaffen van aanvullende informatie over een inhoudsfragment.
Het padveld wordt gebruikt als een identifier in GraphQL. Het vertegenwoordigt het pad van het Content Fragment-element in de AEM opslagplaats. Dit is de id van een inhoudsfragment, omdat dit:
De volgende code geeft de paden weer van alle inhoudsfragmenten die zijn gemaakt op basis van het model van het inhoudsfragment Person
.
{
personList {
items {
_path
}
}
}
Als u één inhoudsfragment van een bepaald type wilt ophalen, moet u ook eerst het pad bepalen. bijvoorbeeld:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_path
firstName
name
}
}
}
Zie Voorbeeldquery - één specifiek stedenfragment.
Via GraphQL worden AEM ook de metagegevens van een inhoudsfragment beschikbaar gemaakt. Metagegevens zijn de informatie die een inhoudsfragment beschrijft, zoals de titel van een inhoudsfragment, het miniatuurpad, de beschrijving van een inhoudsfragment en de datum waarop het is gemaakt.
Omdat metagegevens worden gegenereerd via de Schema-editor en als zodanig geen specifieke structuur hebben, TypedMetaData
Het GraphQL-type is geïmplementeerd om de metagegevens van een inhoudsfragment beschikbaar te maken. TypedMetaData
stelt de informatie bloot die door de volgende scalaire types wordt gegroepeerd:
Veld |
---|
stringMetadata:[StringMetadata]! |
stringArrayMetadata:[StringArrayMetadata]! |
intMetadata:[IntMetadata]! |
intArrayMetadata:[IntArrayMetadata]! |
floatMetadata:[FloatMetadata]! |
floatArrayMetadata:[FloatArrayMetadata]! |
booleanMetadata:[BooleanMetadata]! |
booleanArrayMetadata:[booleanArrayMetadata]! |
calendarMetadata:[CalendarMetadata]! |
calendarArrayMetadata:[CalendarArrayMetadata]! |
Elk scalair type vertegenwoordigt of één enkel naam-waarde paar of een serie van naam-waarde paren, waar de waarde van dat paar van het type is het werd gegroepeerd.
Als u bijvoorbeeld de titel van een inhoudsfragment wilt ophalen, weten we dat deze eigenschap een String-eigenschap is, zodat we een query voor alle String-metagegevens uitvoeren:
Ga als volgt te werk om te zoeken naar metagegevens:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_path
_metadata {
stringMetadata {
name
value
}
}
}
}
}
U kunt alle GraphQL-typen voor metagegevens weergeven als u het schema Gegenereerde GraphQL weergeeft. Alle modeltypen hebben dezelfde TypedMetaData
.
Verschil tussen normale metagegevens en arraymetagegevens
Houd er rekening mee dat StringMetadata
en StringArrayMetadata
beide verwijzen naar wat in de bewaarplaats wordt opgeslagen, niet hoe u hen terugwint.
Bijvoorbeeld door de stringMetadata
veld, ontvangt u een array van alle metagegevens die in de repository zijn opgeslagen als een String
en als u stringArrayMetadata
u ontvangt dan een array met alle metagegevens die in de repository zijn opgeslagen als String[]
.
Zie Voorbeeldquery voor metagegevens - Lijst met metagegevens voor onderscheidingen: GB.
De _variations
is geïmplementeerd om het opvragen van variaties in een inhoudsfragment te vereenvoudigen. Bijvoorbeeld:
{
personByPath(_path: "/content/dam/path/to/fragment/john-doe") {
item {
_variations
}
}
}
Zie Voorbeeldquery - Alle steden met een benoemde variatie.
Als de opgegeven variatie niet bestaat voor een inhoudsfragment, wordt de master variatie geretourneerd als standaard (fallback).
GraphQL staat toe dat variabelen in de query worden geplaatst. Voor meer informatie kunt u de GraphQL-documentatie voor variabelen.
Als u bijvoorbeeld alle inhoudsfragmenten van het type wilt ophalen Article
die een specifieke variatie hebben, kunt u de variabele opgeven variation
in GraphiQL.
### query
query GetArticlesByVariation($variation: String!) {
articleList(variation: $variation) {
items {
_path
author
_variations
}
}
}
### in query variables
{
"variation": "uk"
}
In GraphQL bestaat de mogelijkheid om de query te wijzigen op basis van variabelen, de zogenaamde GraphQL-richtlijnen.
U kunt bijvoorbeeld de opdracht adventurePrice
veld in een query voor alle AdventureModels
, gebaseerd op een variabele includePrice
.
### query
query GetAdventureByType($includePrice: Boolean!) {
adventureList {
items {
adventureTitle
adventurePrice @include(if: $includePrice)
}
}
}
### in query variables
{
"includePrice": true
}
U kunt filteren ook gebruiken in uw GraphQL-query's om specifieke gegevens te retourneren.
Bij het filteren wordt een syntaxis gebruikt die is gebaseerd op logische operatoren en expressies.
Met de volgende (basis)query worden bijvoorbeeld alle personen gefilterd die een naam hebben van Jobs
of Smith
:
query {
personList(filter: {
name: {
_logOp: OR
_expressions: [
{
value: "Jobs"
},
{
value: "Smith"
}
]
}
}) {
items {
name
firstName
}
}
}
Zie voor meer voorbeelden:
nadere gegevens over de GraphQL for AEM extensions
Voorbeeldquery's met deze voorbeeldinhoud en -structuur
De basisverrichting van vragen met GraphQL voor AEM voldoet aan de standaardspecificatie van GraphQL. Voor GraphQL-query's met AEM zijn er een paar extensies:
Als u één resultaat nodig hebt:
Als u een lijst met resultaten verwacht:
List
de modelnaam; bijvoorbeeld: cityList
Het filter includeVariations
is opgenomen in de List
querytype. Als u Variaties in inhoudsfragmenten wilt ophalen in de queryresultaten, voert u de opdracht includeVariations
filter moet worden ingesteld op true
.
Het filter includeVariations
kan niet samen met het door het systeem gegenereerde veld worden gebruikt _variation
.
Als u logische OR wilt gebruiken:
_logOp: OR
Logische AND bestaat ook, maar is (vaak) impliciet
U kunt zoeken naar veldnamen die overeenkomen met de velden in het model van het inhoudsfragment
Naast de velden van uw model zijn er velden die door het systeem worden gegenereerd (voorafgegaan door een onderstrepingsteken):
Voor inhoud:
_locale
: de taal te onthullen; gebaseerd op Taalbeheer
_metadata
: om metagegevens voor uw fragment weer te geven
_model
: toestaan dat wordt gezocht naar een inhoudsfragmentmodel (pad en titel)
_path
: het pad naar het inhoudsfragment in de repository
_reference
: verwijzingen zichtbaar te maken; inline-verwijzingen opnemen in de Rich Text Editor
_variation
: om specifieke variaties in het inhoudsfragment weer te geven
Als de opgegeven variatie niet bestaat voor een inhoudsfragment, wordt de master variatie geretourneerd als standaard (fallback).
Het door het systeem gegenereerde veld _variation
kan niet samen met het filter worden gebruikt includeVariations
.
_tags
: om de id's weer te geven van inhoudsfragmenten of variaties die codes bevatten; this is an array of cq:tags
id's.
Tags kunnen ook worden opgevraagd door de metagegevens van een inhoudsfragment weer te geven.
_operator
: specifieke exploitanten toepassen; EQUALS
, EQUALS_NOT
, GREATER_EQUAL
, LOWER
, CONTAINS
, STARTS_WITH
_apply
: specifieke voorwaarden toe te passen; bijvoorbeeld: AT_LEAST_ONCE
_ignoreCase
: om de zaak te negeren bij het vragen
GraphQL-union-typen worden ondersteund:
Extra fallback bij het opvragen van geneste fragmenten:
Voor een gedetailleerd overzicht van het beleid voor het delen van bronnen in AEM zie Werken met het delen van bronnen tussen verschillende bronnen (CORS).
Om tot het eindpunt van GraphQL toegang te hebben, moet een beleid CORS in de bewaarplaats van de Kit van de klant worden gevormd. Dit wordt gedaan door een aangewezen OSGi CORS configuratiedossier voor het gewenste eindpunt (s) toe te voegen.
Deze configuratie moet een vertrouwde website-oorsprong opgeven alloworigin
of alloworiginregexp
waarvoor toegang moet worden verleend.
Bijvoorbeeld, om toegang tot het eindpunt van GraphQL en voortgeduurde vragen te verlenen eindpunt voor https://my.domain
u kunt gebruiken:
{
"supportscredentials":true,
"supportedmethods":[
"GET",
"HEAD",
"POST"
],
"exposedheaders":[
""
],
"alloworigin":[
"https://my.domain"
],
"maxage:Integer":1800,
"alloworiginregexp":[
""
],
"supportedheaders":[
"Origin",
"Accept",
"X-Requested-With",
"Content-Type",
"Access-Control-Request-Method",
"Access-Control-Request-Headers"
],
"allowedpaths":[
"/content/_cq_graphql/global/endpoint.json",
"/graphql/execute.json/.*"
]
}
Als u een ijdelingspad voor het eindpunt hebt gevormd, kunt u het binnen ook gebruiken allowedpaths
.
Naast de configuratie CORS, moet een filter van de Referateur worden gevormd om toegang van derdeshosts toe te staan.
Dit wordt gedaan door een aangewezen OSGi de configuratiedossier van de Filter toe te voegen dat:
allow.hosts
of allow.hosts.regexp
,Bijvoorbeeld om toegang voor verzoeken met de Referiteur te verlenen my.domain
u kunt:
{
"allow.empty":false,
"allow.hosts":[
"my.domain"
],
"allow.hosts.regexp":[
""
],
"filter.methods":[
"POST",
"PUT",
"DELETE",
"COPY",
"MOVE"
],
"exclude.agents.regexp":[
""
]
}
Het blijft de verantwoordelijkheid van de klant om:
Alle GraphQL schema's (afgeleid van Content Fragment Models die Ingeschakeld) zijn leesbaar via het GraphQL-eindpunt.
Dit betekent dat u ervoor moet zorgen dat er geen gevoelige gegevens beschikbaar zijn, aangezien deze op deze manier kunnen worden gelekt; Dit omvat bijvoorbeeld informatie die als veldnamen in de modeldefinitie aanwezig kan zijn.
Zie Verificatie voor externe AEM GraphQL-query's op inhoudsfragmenten.
De gerezen vragen:
Q: "Hoe verschilt de GraphQL API voor AEM van de Query Builder-API?"
Op zoek naar een praktische zelfstudie? Uitchecken Aan de slag met AEM Headless en GraphQL end-to-end zelfstudie waarin wordt geïllustreerd hoe u in een CMS-scenario inhoud kunt ontwikkelen en beschikbaar maken met de GraphQL-API's van AEM en die door een externe toepassing wordt verbruikt.