Blijvende GraphQL-query's persisted-graphql-queries
Persisted query's zijn GraphQL query's die worden gemaakt en opgeslagen op de Adobe Experience Manager (AEM) as a Cloud Service server. Ze kunnen worden aangevraagd met een GET-aanvraag door clienttoepassingen. De reactie van een verzoek van de GET kan bij de verzender en lagen CDN in het voorgeheugen ondergebracht worden, die uiteindelijk de prestaties van de het verzoeken cliënttoepassing verbeteren. Dit verschilt van standaard GraphQL query's, die worden uitgevoerd met behulp van POST-aanvragen waarbij de reactie niet gemakkelijk in cache kan worden geplaatst.
IDE GraphiQLis beschikbaar in AEM voor u om, uw vragen van GraphQL te ontwikkelen te testen en voort te zetten, alvorens over te brengen naar uw productiemilieu. Voor gevallen die aanpassing (bijvoorbeeld, wanneer het geheime voorgeheugenaanpassen) nodig hebben kunt u API gebruiken; zie het cURL voorbeeld dat in wordt verstrekt hoe te om een vraag van GraphQLvoort te zetten.
Blijvende query's en eindpunten persisted-queries-and-endpoints
De aangehouden vragen moeten altijd het eindpunt met betrekking tot de aangewezen configuratie van Plaatsengebruiken; zodat kunnen zij of, of allebei gebruiken:
- De globale configuratie en het eindpunt
De query heeft toegang tot alle modellen van inhoudsfragmenten. - Specifieke configuratie(s) en eindpunt(en) van sites
Creërend een persisted vraag voor een specifieke configuratie van Plaatsen vereist een overeenkomstig plaats-configuratie-specifiek eindpunt (om toegang tot de verwante Modellen van het Fragment van de Inhoud te verlenen).
Bijvoorbeeld, om een voortgeduurde vraag specifiek voor de configuratie van Plaatsen te creëren WKND, moet een overeenkomstige WKND-Specifieke configuratie van Plaatsen, en een WKND-Specifiek eindpunt vooraf worden gecreeerd.
Als er bijvoorbeeld een bepaalde query met de naam my-query
is, die een model my-model
uit de configuratie Sites my-conf
gebruikt:
- U kunt een vraag tot stand brengen gebruikend het
my-conf
specifieke eindpunt, en dan wordt de vraag bewaard als volgt:/conf/my-conf/settings/graphql/persistentQueries/my-query
- U kunt dezelfde query maken met het eindpunt
global
, maar de query wordt als volgt opgeslagen:/conf/global/settings/graphql/persistentQueries/my-query
Een GraphQL-query laten doorgaan how-to-persist-query
Het wordt geadviseerd om vragen over een AEM auteursmilieu aanvankelijk en dan over te zetten de vraagaan uw productie AEM milieu, voor gebruik door toepassingen publiceren.
Er zijn verschillende methoden om query's te blijven uitvoeren, waaronder:
- IDE GraphiQL - zie het Opslaan van Persisted Vragen(aangewezen methode)
- cURL - zie het volgende voorbeeld
- Andere hulpmiddelen, met inbegrip van Postman
IDE GraphiQL is de geprefereerde methode voor het voortduren van vragen. Om een bepaalde vraag voort te zetten gebruikend het cURL hulpmiddel van de bevellijn:
-
Bereid de vraag voor door het aan het nieuwe eindpunt URL
/graphql/persist.json/<config>/<persisted-label>
te PLAATSEN.Maak bijvoorbeeld een doorlopende query:
code language-shell $ curl -X PUT \ -H 'authorization: Basic YWRtaW46YWRtaW4=' \ -H "Content-Type: application/json" \ "http://localhost:4502/graphql/persist.json/wknd/plain-article-query" \ -d \ '{ articleList { items{ _path author main { json } } } }'
-
Controleer nu het antwoord.
Controleer bijvoorbeeld of het programma is gelukt:
code language-json { "action": "create", "configurationName": "wknd", "name": "plain-article-query", "shortPath": "/wknd/plain-article-query", "path": "/conf/wknd/settings/graphql/persistentQueries/plain-article-query" }
-
Vervolgens kunt u de voortgezette query aanvragen door de URL op te halen
/graphql/execute.json/<shortPath>
.Gebruik bijvoorbeeld de voortgezette query:
code language-shell $ curl -X GET \ http://localhost:4502/graphql/execute.json/wknd/plain-article-query
-
Werk een voortgezette vraag door POSTing aan een reeds bestaand vraagweg bij.
Gebruik bijvoorbeeld de voortgezette query:
code language-shell $ curl -X POST \ -H 'authorization: Basic YWRtaW46YWRtaW4=' \ -H "Content-Type: application/json" \ "http://localhost:4502/graphql/persist.json/wknd/plain-article-query" \ -d \ '{ articleList { items{ _path author main { json } referencearticle { _path } } } }'
-
Een onbewerkte query maken.
Bijvoorbeeld:
code language-shell $ curl -X PUT \ -H 'authorization: Basic YWRtaW46YWRtaW4=' \ -H "Content-Type: application/json" \ "http://localhost:4502/graphql/persist.json/wknd/plain-article-query-wrapped" \ -d \ '{ "query": "{articleList { items { _path author main { json } referencearticle { _path } } } }"}'
-
Creeer een verpakte onbewerkte vraag met geheim voorgeheugencontrole.
Bijvoorbeeld:
code language-shell $ curl -X PUT \ -H 'authorization: Basic YWRtaW46YWRtaW4=' \ -H "Content-Type: application/json" \ "http://localhost:4502/graphql/persist.json/wknd/plain-article-query-max-age" \ -d \ '{ "query": "{articleList { items { _path author main { json } referencearticle { _path } } } }", "cache-control": { "max-age": 300 }}'
-
Maak een doorlopende query met parameters:
Bijvoorbeeld:
code language-shell $ curl -X PUT \ -H 'authorization: Basic YWRtaW46YWRtaW4=' \ -H "Content-Type: application/json" \ "http://localhost:4502/graphql/persist.json/wknd/plain-article-query-parameters" \ -d \ 'query GetAsGraphqlModelTestByPath($apath: String!, $withReference: Boolean = true) { articleByPath(_path: $apath) { item { _path author main { plaintext } referencearticle @include(if: $withReference) { _path } } } }'
Hoe te om een Verlengde vraag uit te voeren execute-persisted-query
Een clienttoepassing vraagt een aanvraag tot GET met de volgende syntaxis uit om een query met behoud van waarden uit te voeren:
GET <AEM_HOST>/graphql/execute.json/<PERSISTENT_PATH>
Waar PERSISTENT_PATH
een verkort pad is naar waar de Persisted-query wordt opgeslagen.
-
wknd
is bijvoorbeeld de configuratienaam enplain-article-query
is de naam van de Persisted-query. De query uitvoeren:code language-shell $ curl -X GET \ https://publish-p123-e456.adobeaemcloud.com/graphql/execute.json/wknd/plain-article-query
-
Een query uitvoeren met parameters.
note note NOTE De variabelen en de waarden van de vraag moeten behoorlijk worden gecodeerdwanneer het uitvoeren van een Verlengde vraag. Bijvoorbeeld:
code language-xml $ curl -X GET \ "https://publish-p123-e456.adobeaemcloud.com/graphql/execute.json/wknd/plain-article-query-parameters%3Bapath%3D%2Fcontent%2Fdam%2Fwknd%2Fen%2Fmagazine%2Falaska-adventure%2Falaskan-adventures%3BwithReference%3Dfalse
Zie het gebruiken van vraagvariabelenvoor meer details.
Query-variabelen gebruiken query-variables
De variabelen van de vraag kunnen met Verblijfsde Vragen worden gebruikt. De vraagvariabelen worden toegevoegd aan het verzoek vooraf bepaald met een puntkomma (;
) gebruikend de veranderlijke naam en de waarde. Meerdere variabelen worden gescheiden door puntkomma's.
Het patroon ziet er als volgt uit:
<AEM_HOST>/graphql/execute.json/<PERSISTENT_QUERY_PATH>;variable1=value1;variable2=value2
De volgende query bevat bijvoorbeeld een variabele activity
om een lijst te filteren op basis van een activiteitwaarde:
query getAdventuresByActivity($activity: String!) {
adventureList (filter: {
adventureActivity: {
_expressions: [
{
value: $activity
}
]
}
}){
items {
_path
adventureTitle
adventurePrice
adventureTripLength
}
}
}
Deze query kan worden uitgevoerd onder een pad wknd/adventures-by-activity
. Om de Persisted vraag te roepen waar activity=Camping
het verzoek als dit zou kijken:
<AEM_HOST>/graphql/execute.json/wknd/adventures-by-activity%3Bactivity%3DCamping
De UTF-8-codering %3B
is voor ;
en %3D
is de codering voor =
. De vraagvariabelen en om het even welke speciale karakters moeten behoorlijkvoor de Persisted vraag worden gecodeerd om uit te voeren.
Query-variabelen gebruiken - Aanbevolen werkwijzen query-variables-best-practices
Wanneer het gebruiken van variabelen in uw vragen zijn er een paar beste praktijken die zouden moeten worden gevolgd:
-
Codering
In het algemeen wordt het altijd aanbevolen alle speciale tekens te coderen, bijvoorbeeld;
,=
,?
,&
. -
Puntkomma
De aanhoudende vragen die veelvoudige variabelen gebruiken (die door puntkomma's worden gescheiden) moeten of hebben:- de gecodeerde puntkomma's (
%3B
); het coderen van URL zal dit ook bereiken - of een volgpuntkomma die aan het einde van de query is toegevoegd
- de gecodeerde puntkomma's (
-
CACHE_GRAPHQL_PERSISTED_QUERIES
WanneerCACHE_GRAPHQL_PERSISTED_QUERIES
is ingeschakeld voor de Dispatcher, worden parameters die de/
- of\
-tekens in hun waarde bevatten, twee keer gecodeerd op Dispatcher-niveau.
Om deze situatie te voorkomen:-
Schakel
DispatcherNoCanonURL
in op de Dispatcher.
Hiermee geeft u de Dispatcher de opdracht om de oorspronkelijke URL door te sturen naar AEM, zodat dubbele coderingen worden voorkomen.
Deze instelling werkt momenteel echter alleen opvhost
niveau. Als u Dispatcher-configuraties hebt voor het herschrijven van URL's (bijvoorbeeld wanneer u verkorte URL's gebruikt), hebt u mogelijk een apartevhost
nodig voor doorlopende query-URL's. -
Verzend
/
- of\
-tekens zonder codering.
Wanneer u de URL van de blijvende query aanroept, zorgt u ervoor dat alle/
- of\
-tekens niet-gecodeerd blijven in de waarde van doorlopende queryvariabelen.note note NOTE Deze optie wordt alleen aanbevolen wanneer de DispatcherNoCanonURL
-oplossing om welke reden dan ook niet kan worden geïmplementeerd.
-
-
CACHE_GRAPHQL_PERSISTED_QUERIES
Wanneer
CACHE_GRAPHQL_PERSISTED_QUERIES
is ingeschakeld voor de Dispatcher, kan het teken;
niet worden gebruikt in de waarde van een variabele.
Door uw doorlopende query's in cache te plaatsen caching-persisted-queries
De geadviseerde vragen worden geadviseerd aangezien zij bij de Dispatcheren de lagen van het Netwerk van de Levering van de Inhoud (CDN) in het voorgeheugen kunnen worden ondergebracht, uiteindelijk verbeterend de prestaties van de het vragen cliënttoepassing.
AEM maakt de cache standaard ongeldig op basis van de definitie Tijd tot live (TTL). Deze TTLs kan door de volgende parameters worden bepaald. Deze parameters zijn op verschillende manieren toegankelijk, waarbij de namen variëren volgens het gebruikte mechanisme:
max-age
cache-control : max-age
cacheControlMaxAge
graphqlCacheControl
s-maxage
surrogate-control : max-age
surrogateControlMaxAge
graphqlSurrogateControl
stale-while-revalidate
surrogate-control : stale-while-revalidate
surrogateControlStaleWhileRevalidate
graphqlStaleWhileRevalidate
stale-if-error
surrogate-control : stale-if-error
surrogateControlStaleIfError
graphqlStaleIfError
Auteursinstanties author-instances
Voor auteur-instanties zijn de standaardwaarden:
max-age
: 60s-maxage
: 60stale-while-revalidate
: 86400stale-if-error
: 86400
Hiervoor gold het volgende:
-
kan niet worden overschreven:
- met een OSGi-configuratie
-
kan worden overschreven:
- door een verzoek dat de kopbalmontages van HTTP gebruikend cURL bepaalt; het zou geschikte montages voor
cache-control
en/ofsurrogate-control
moeten omvatten; voor voorbeelden, zie Beheerd Geheime voorgeheugen bij het Gepersisteerde Niveau van de Vraag - als u waarden in de Kopballen dialoog van GraphiQL windespecificeert
- door een verzoek dat de kopbalmontages van HTTP gebruikend cURL bepaalt; het zou geschikte montages voor
Publish-instanties publish-instances
Voor publicatie-instanties zijn de standaardwaarden:
max-age
: 60s-maxage
: 7200stale-while-revalidate
: 86400stale-if-error
: 86400
Deze kunnen worden overschreven:
-
bij het Verblijfsde Niveau van de Vraag; dit impliceert het posten van de vraag aan AEM gebruikend cURL in uw interface van de bevellijn, en het publiceren van de Verlengde Vraag.
Het beheren van de Kopballen van het Geheime voorgeheugen van HTTP in GrahiQL winde http-cache-headers-graphiql-ide
GrahiQL winde - zie het Opslaan van Persisted Vragen
Het beheren van Geheime voorgeheugen op het Aanhoudende Niveau van de Vraag cache-persisted-query-level
Dit omvat het posten van de vraag aan AEM gebruikend cURL in uw interface van de bevellijn.
Een voorbeeld van de methode PUT (create):
curl -u admin:admin -X PUT \
--url "http://localhost:4502/graphql/persist.json/wknd/plain-article-query-max-age" \
--header "Content-Type: application/json" \
--data '{ "query": "{articleList { items { _path author } } }", "cache-control": { "max-age": 300 }, "surrogate-control": {"max-age":600, "stale-while-revalidate":1000, "stale-if-error":1000} }'
Een voorbeeld van de methode POST (update):
curl -u admin:admin -X POST \
--url "http://localhost:4502/graphql/persist.json/wknd/plain-article-query-max-age" \
--header "Content-Type: application/json" \
--data '{ "query": "{articleList { items { _path author } } }", "cache-control": { "max-age": 300 }, "surrogate-control": {"max-age":600, "stale-while-revalidate":1000, "stale-if-error":1000} }'
cache-control
kan op de aanmaaktijd (PUT) of later worden ingesteld (bijvoorbeeld via een verzoek om POST). Het cache-control is optioneel wanneer u de aanhoudend query maakt, omdat AEM de standaardwaarde kan opgeven. Zie hoe te om een vraag van GraphQL, voor een voorbeeld voort te zetten om een vraag te gebruiken cURL.
Cache beheren met Cloud Manager-variabelen cache-cloud-manager-variables
de Variabelen van het Milieu van Cloud Managerkunnen met Cloud Manager worden bepaald om de vereiste waarden te bepalen:
graphqlStaleIfError
graphqlSurrogateControl
Het beheren van Geheime voorgeheugen met een configuratie OSGi cache-osgi-configration
Om het geheime voorgeheugen globaal te beheren, kunt u de montages OSGivoor de Verlengde Configuratie van de Dienst van de Vraag vormen.
De standaard configuratie OSGi voor publiceer instanties:
-
leest de Cloud Manager-variabelen, indien beschikbaar:
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 layout-auto OSGi-configuratieeigenschap leest dit Cloud Manager-variabele cacheControlMaxAge
leest graphqlCacheControl
surrogateControlMaxAge
leest graphqlSurrogateControl
surrogateControlStaleWhileRevalidate
leest graphqlStaleWhileRevalidate
surrogateControlStaleIfError
leest graphqlStaleIfError
-
en als niet beschikbaar, gebruikt de configuratie OSGi de standaardwaarden voor publiceer instanties.
De antwoordcode voor de query configureren configuring-query-response-code
Standaard verzendt PersistedQueryServlet
een 200
-reactie wanneer een query wordt uitgevoerd, ongeacht het werkelijke resultaat.
U kunt de montages OSGivoor de Versiesde Configuratie van de Dienst van de Vraag vormen om te controleren of de meer gedetailleerde statuscodes door het /execute.json/persisted-query
eindpunt zijn teruggekeerd, wanneer er een fout in de gepersisteerde vraag is.
Het veld Respond with application/graphql-response+json
(responseContentTypeGraphQLResponseJson
) kan als vereist worden gedefinieerd:
-
false
(standaardwaarde):
Het maakt niet uit of de voortgezette query succesvol is of niet. DeContent-Type
teruggekeerde kopbal isapplication/json
, en/execute.json/persisted-query
altijd keert de statuscode200
terug. -
true
:
De geretourneerdeContent-Type
isapplication/graphql-response+json
en het eindpunt retourneert de juiste antwoordcode wanneer er een fout optreedt bij het uitvoeren van de voortgezette query:table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 Code Beschrijving 200 Geslaagd antwoord 400 Geeft aan dat er koppen ontbreken of dat er een probleem is met het voortgezette querypad. Configuratienaam niet opgegeven, achtervoegsel niet opgegeven en andere.
zie het Oplossen van problemen - het eindpunt van GraphQL niet gevormd.404 Kan de gewenste bron niet vinden. Bijvoorbeeld, is het eindpunt Graphql niet beschikbaar op de server.
zie het Oplossen van problemen - Ontbrekende weg in GraphQL voortgeduurde vraag URL.500 Interne serverfout. Bijvoorbeeld validatiefouten, persistentiefout en andere. note note NOTE Zie ook https://graphql.github.io/graphql-over-http/draft/#sec-Status-Codes
De URL van de query coderen voor gebruik door een app encoding-query-url
Voor gebruik door een toepassing, moeten om het even welke speciale karakters die wanneer het construeren van vraagvariabelen (namelijk puntkomma's (;
), gelijkteken (=
), schuine strepen /
) worden gebruikt worden omgezet om het overeenkomstige coderen te gebruiken UTF-8.
Bijvoorbeeld:
curl -X GET \ "https://publish-p123-e456.adobeaemcloud.com/graphql/execute.json/wknd/adventure-by-path%3BadventurePath%3D%2Fcontent%2Fdam%2Fwknd%2Fen%2Fadventures%2Fbali-surf-camp%2Fbali-surf-camp"
De URL kan worden opgesplitst in de volgende onderdelen:
/graphql/execute.json
/wknd/adventure-by-path
%3B
;
adventurePath
%3D
=
%2F
/
%2Fcontent%2Fdam...
In onbewerkte tekst ziet de aanvraag-URI er als volgt uit:
/graphql/execute.json/wknd/adventure-by-path;adventurePath=/content/dam/wknd/en/adventures/bali-surf-camp/bali-surf-camp
Om een voortgezette vraag in een cliënttoepassing te gebruiken, zou de AEM headless cliënt SDK voor JavaScript, Java, of NodeJSmoeten worden gebruikt. De Headless Client SDK codeert alle queryvariabelen automatisch naar behoren in de aanvraag.
Het overbrengen van een blijvende vraag aan uw milieu van de Productie transfer-persisted-query-production
De gepersisteerde vragen zouden altijd op de dienst van de Auteur van de AEM moeten worden gecreeerd en dan (herhaald) aan de dienst van AEM Publish gepubliceerd. Vaak, worden de Persisted vragen gecreeerd en op lagere milieu's zoals lokale of milieu's van de Ontwikkeling getest. Het is dan noodzakelijk om Persisted query's naar omgevingen op een hoger niveau te promoten, zodat ze uiteindelijk beschikbaar worden gesteld op een productie AEM Publish-omgeving voor gebruik door clienttoepassingen.
Voorbehouden query's verpakken
De aanhoudende vragen kunnen in AEM Pakkettenworden gebouwd. AEM pakketten kunnen vervolgens worden gedownload en geïnstalleerd in verschillende omgevingen. AEM Pakketten kunnen ook worden gerepliceerd vanuit een AEM Auteur-omgeving naar AEM Publish-omgevingen.
Een pakket maken:
- Navigeer aan Hulpmiddelen > Plaatsing > Pakketten.
- Creeer een nieuw pakket door te tikken creeer Pakket. Hiermee wordt een dialoogvenster geopend waarin het pakket wordt gedefinieerd.
- In de Dialoog van de Definitie van het Pakket, onder Algemene ga a Naam als "wknd-persistente-query's" in.
- Voer een versienummer in, bijvoorbeeld "1.0".
- Onder Filters voeg een nieuwe Filter toe. Gebruik de Finder van het Weg om de
persistentQueries
omslag onder de configuratie te selecteren. Voor dewknd
-configuratie is het volledige pad bijvoorbeeld/conf/wknd/settings/graphql/persistentQueries
. - Selecteer sparen om de nieuwe definitie van het Pakket te bewaren en de dialoog te sluiten.
- Selecteer bouwt knoop in de gecreeerde definitie van het Pakket.
Nadat het pakket is gemaakt, kunt u:
- Download het pakket en herupload op een verschillend milieu.
- Repliceer het pakket door meer te tikken > Repliceer. Hierdoor wordt het pakket gerepliceerd naar de aangesloten AEM Publish-omgeving.