Beständiga GraphQL-frågor persisted-graphql-queries
Beständiga frågor är GraphQL-frågor som skapas och lagras på Adobe Experience Manager (AEM) as a Cloud Service server. De kan begäras med en GET-begäran från klientprogram. Svaret på en GET-begäran kan cachas i skikten dispatcher och CDN, vilket i slutänden förbättrar prestanda för det begärande klientprogrammet. Detta skiljer sig från vanliga GraphQL-frågor, som körs med förfrågningar från POSTER där svaret inte enkelt kan cachas.
GraphiQL IDE är tillgänglig i AEM så att du kan utveckla, testa och behålla dina GraphQL-frågor innan du överför till produktionsmiljön. Om du behöver anpassa (till exempel när du anpassar cachen) kan du använda API:t, se exemplet på cURL i Så här gör du för att behålla en GraphQL-fråga.
Beständiga frågor och slutpunkter persisted-queries-and-endpoints
Beständiga frågor måste alltid använda den slutpunkt som är relaterad till lämplig platskonfiguration, så att de kan använda antingen eller båda:
- Den globala konfigurationen och slutpunkten
Frågan har åtkomst till alla modeller för innehållsfragment. - Specifika platskonfigurationer och slutpunkter
För att skapa en beständig fråga för en specifik platskonfiguration krävs en motsvarande platskonfigurationsspecifik slutpunkt (för att ge åtkomst till relaterade modeller för innehållsfragment).
Om du till exempel vill skapa en beständig fråga specifikt för WKND-platskonfigurationen, måste en motsvarande WKND-specifik platskonfiguration och en WKND-specifik slutpunkt skapas i förväg.
Om det till exempel finns en viss fråga med namnet my-query
som använder modellen my-model
från platskonfigurationen my-conf
:
- Du kan skapa en fråga med den
my-conf
specifika slutpunkten och sedan sparas frågan så här:/conf/my-conf/settings/graphql/persistentQueries/my-query
- Du kan skapa samma fråga med
global
-slutpunkten, men sedan sparas frågan så här:/conf/global/settings/graphql/persistentQueries/my-query
Så här behåller du en GraphQL-fråga how-to-persist-query
Vi rekommenderar att du till att börja med behåller frågor i en AEM redigeringsmiljö och sedan överför frågan till din AEM publiceringsmiljö, som kan användas av program.
Det finns olika metoder för beständiga frågor, bland annat:
- GraphiQL IDE - se Spara beständiga frågor (föredragen metod)
- cURL - se följande exempel
- Andra verktyg, inklusive Postman
GraphiQL IDE är den föredragna metoden för beständiga frågor. Så här behåller du en given fråga med kommandoradsverktyget cURL:
-
Förbered frågan genom att PUTing den till den nya slutpunkts-URL:en
/graphql/persist.json/<config>/<persisted-label>
.Skapa till exempel en beständig fråga:
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 } } } }'
-
Kontrollera svaret nu.
Kontrollera till exempel om åtgärden lyckades:
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" }
-
Du kan sedan begära den beständiga frågan genom att GETing anger URL:en
/graphql/execute.json/<shortPath>
.Använd till exempel den beständiga frågan:
code language-shell $ curl -X GET \ http://localhost:4502/graphql/execute.json/wknd/plain-article-query
-
Uppdatera en beständig fråga genom POSTing till en redan befintlig frågesökväg.
Använd till exempel den beständiga frågan:
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 } } } }'
-
Skapa en omsluten vanlig fråga.
Till exempel:
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 } } } }"}'
-
Skapa en omsluten oformaterad fråga med cachekontroll.
Till exempel:
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 }}'
-
Skapa en beständig fråga med parametrar:
Till exempel:
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 } } } }'
Så här kör du en fråga som är sparad execute-persisted-query
För att köra en Persistent-fråga gör ett klientprogram en GET-begäran med följande syntax:
GET <AEM_HOST>/graphql/execute.json/<PERSISTENT_PATH>
Där PERSISTENT_PATH
är en förkortad sökväg till den plats där den beständiga frågan sparas.
-
wknd
är till exempel konfigurationsnamnet ochplain-article-query
är namnet på den beständiga frågan. Så här kör du frågan:code language-shell $ curl -X GET \ https://publish-p123-e456.adobeaemcloud.com/graphql/execute.json/wknd/plain-article-query
-
Kör en fråga med parametrar.
note note NOTE Frågevariabler och -värden måste vara korrekt kodade när en Persisted-fråga körs. Till exempel:
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
Mer information finns i Använda frågevariabler.
Använda frågevariabler query-variables
Frågevariabler kan användas med beständiga frågor. Frågevariablerna läggs till i begäran med prefixet semikolon (;
) med variabelnamnet och variabelvärdet. Flera variabler avgränsas med semikolon.
Mönstret ser ut så här:
<AEM_HOST>/graphql/execute.json/<PERSISTENT_QUERY_PATH>;variable1=value1;variable2=value2
Följande fråga innehåller till exempel variabeln activity
för att filtrera en lista baserat på ett aktivitetsvärde:
query getAdventuresByActivity($activity: String!) {
adventureList (filter: {
adventureActivity: {
_expressions: [
{
value: $activity
}
]
}
}){
items {
_path
adventureTitle
adventurePrice
adventureTripLength
}
}
}
Den här frågan kan sparas under sökvägen wknd/adventures-by-activity
. Så här anropar du den beständiga frågan där activity=Camping
begäran skulle se ut:
<AEM_HOST>/graphql/execute.json/wknd/adventures-by-activity%3Bactivity%3DCamping
UTF-8-kodningen %3B
är för ;
och %3D
är kodningen för =
. Frågevariablerna och eventuella specialtecken måste vara kodade korrekt för att den beständiga frågan ska kunna köras.
Använda frågevariabler - Bästa praxis query-variables-best-practices
När du använder variabler i dina frågor finns det några metodtips som du bör följa:
-
Kodning
Som en allmän metod bör du alltid koda alla specialtecken, till exempel;
,=
,?
,&
. -
Semikolon
Beständiga frågor som använder flera variabler (som avgränsas med semikolon) måste ha antingen:- semikolon kodade (
%3B
). Om URL:en kodas kommer även detta att uppnås - eller ett avslutande semikolon som lagts till i slutet av frågan
- semikolon kodade (
-
CACHE_GRAPHQL_PERSISTED_QUERIES
NärCACHE_GRAPHQL_PERSISTED_QUERIES
är aktiverat för Dispatcher kodas parametrar som innehåller/
- eller\
-tecknen i deras värde två gånger på Dispatcher-nivå.
För att undvika denna situation:-
Aktivera
DispatcherNoCanonURL
på Dispatcher.
Detta instruerar Dispatcher att vidarebefordra den ursprungliga URL-adressen till AEM, så att dubblerade kodningar förhindras.
Den här inställningen fungerar för närvarande bara på nivånvhost
, så om du redan har Dispatcher-konfigurationer för att skriva om URL:er (t.ex. när du använder förkortade URL:er) kan du behöva en separatvhost
för beständiga fråge-URL:er. -
Skicka
/
eller\
tecken utan kodning.
När du anropar den beständiga fråge-URL:en måste du se till att alla/
- eller\
-tecken förblir okodade i värdet för beständiga frågevariabler.note note NOTE Det här alternativet rekommenderas bara när DispatcherNoCanonURL
-lösningen inte kan implementeras av någon anledning.
-
-
CACHE_GRAPHQL_PERSISTED_QUERIES
När
CACHE_GRAPHQL_PERSISTED_QUERIES
är aktiverat för Dispatcher kan inte tecknet;
användas i värdet för en variabel.
Cachelagra beständiga frågor caching-persisted-queries
Beständiga frågor rekommenderas eftersom de kan cachelagras på Dispatcher - och CDN-lagren (Content Delivery Network), vilket i slutänden förbättrar prestandan för det begärande klientprogrammet.
Som standard blir cachen ogiltig AEM baserat på en TTL-definition (Time To Live). Dessa TTL:er kan definieras med följande parametrar. Dessa parametrar kan nås på olika sätt, med variationer i namnen beroende på vilken mekanism som används:
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
Författarinstanser author-instances
För författarinstanser är standardvärdena:
max-age
: 60s-maxage
: 60stale-while-revalidate
: 86400stale-if-error
: 86400
De var:
-
kan inte skrivas över:
- med en OSGi-konfiguration
-
kan skrivas över:
- av en begäran som definierar inställningar för HTTP-huvudet med cURL; den bör innehålla lämpliga inställningar för
cache-control
och/ellersurrogate-control
; se till exempel Hantera cache på den beständiga frågenivån - om du anger värden i dialogrutan Headers i GraphiQL IDE
- av en begäran som definierar inställningar för HTTP-huvudet med cURL; den bör innehålla lämpliga inställningar för
Publish-instanser publish-instances
Standardvärdena för publiceringsinstanser är:
max-age
: 60s-maxage
: 7200stale-while-revalidate
: 86400stale-if-error
: 86400
Dessa kan skrivas över:
-
på nivån för beständig fråga. Detta innebär att frågan skickas till AEM med cURL i kommandoradsgränssnittet och att den beständiga frågan publiceras.
Hantera rubriker för HTTP-cache i GraphiQL IDE http-cache-headers-graphiql-ide
GraphiQL IDE - se Spara beständiga frågor
Hantera cache på nivån för beständig fråga cache-persisted-query-level
Detta innebär att skicka frågan till AEM med cURL i kommandoradsgränssnittet.
Ett exempel på metoden PUT (skapa):
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} }'
Ett exempel på metoden 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 anges när den skapas (PUT) eller senare (till exempel via en POST-förfrågan). Cachekontrollen är valfri när du skapar den beständiga frågan, eftersom AEM kan ange standardvärdet. Se Så här behåller du en GraphQL-fråga om du vill se ett exempel på hur en fråga bevaras med cURL.
Hantera cache med Cloud Manager-variabler cache-cloud-manager-variables
Cloud Manager miljövariabler kan definieras med Cloud Manager för att definiera de värden som krävs:
graphqlStaleIfError
graphqlSurrogateControl
Hantera cache med en OSGi-konfiguration cache-osgi-configration
Om du vill hantera cacheminnet globalt kan du konfigurera OSGi-inställningarna för konfigurationen för den beständiga frågetjänsten.
Standardkonfigurationen för OSGi för publiceringsinstanser:
-
läser Cloud Manager-variablerna om sådana finns:
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 layout-auto OSGi-konfigurationsegenskap läser detta Cloud Manager Variable cacheControlMaxAge
läsningar graphqlCacheControl
surrogateControlMaxAge
läsningar graphqlSurrogateControl
surrogateControlStaleWhileRevalidate
läsningar graphqlStaleWhileRevalidate
surrogateControlStaleIfError
läsningar graphqlStaleIfError
-
Om det inte är tillgängligt använder OSGi-konfigurationen standardvärdena för publiceringsinstanser.
Konfigurera frågesvarskoden configuring-query-response-code
Som standard skickar PersistedQueryServlet
ett 200
-svar när en fråga körs, oavsett det faktiska resultatet.
Du kan konfigurera OSGi-inställningarna för konfigurationen för den beständiga frågetjänsten för att kontrollera om mer detaljerade statuskoder returneras av /execute.json/persisted-query
-slutpunkten, om det finns ett fel i den beständiga frågan.
Fältet Respond with application/graphql-response+json
(responseContentTypeGraphQLResponseJson
) kan definieras enligt behov:
-
false
(standardvärde):
Det spelar ingen roll om den beständiga frågan lyckas eller inte. DetContent-Type
-huvud som returnerades ärapplication/json
och/execute.json/persisted-query
always returnerar statuskoden200
. -
true
:
Den returneradeContent-Type
ärapplication/graphql-response+json
och slutpunkten returnerar lämplig svarskod när det finns någon form av fel när den beständiga frågan körs:table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 Code Beskrivning 200 Slutfört svar 400 Anger att det saknas rubriker eller ett problem med den beständiga frågesökvägen. Konfigurationsnamnet har till exempel inte angetts, suffixet har inte angetts och andra har inte angetts.
Se Felsökning - GraphQL-slutpunkt har inte konfigurerats.404 Det går inte att hitta den begärda resursen. Graphql-slutpunkten är till exempel inte tillgänglig på servern.
Se Felsökning - Sökväg saknas i GraphQL beständiga fråge-URL.500 Internt serverfel. Exempel: valideringsfel, beständighetsfel med mera. note note NOTE Se även https://graphql.github.io/graphql-over-http/draft/#sec-Status-Codes
Kodning av fråge-URL för användning av ett program encoding-query-url
Om du vill använda ett program måste alla specialtecken som används för att skapa frågevariabler (d.v.s. semikolon (;
), likhetstecken (=
), snedstreck /
) konverteras till motsvarande UTF-8-kodning.
Till exempel:
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"
URL:en kan delas upp i följande delar:
/graphql/execute.json
/wknd/adventure-by-path
%3B
;
adventurePath
%3D
=
%2F
/
%2Fcontent%2Fdam...
I vanlig text ser URI:n för begäran ut så här:
/graphql/execute.json/wknd/adventure-by-path;adventurePath=/content/dam/wknd/en/adventures/bali-surf-camp/bali-surf-camp
Om du vill använda en beständig fråga i en klientapp bör den AEM huvudlösa klientens SDK användas för JavaScript, Java eller NodeJS. SDK för den Headless-klienten kodar automatiskt alla frågevariabler som behövs i begäran.
Överför en beständig fråga till produktionsmiljön transfer-persisted-query-production
Beständiga frågor ska alltid skapas på en AEM författartjänst och sedan publiceras (replikeras) till en AEM Publish-tjänst. Vanligtvis skapas och testas beständiga frågor i miljöer som lokala miljöer och utvecklingsmiljöer. Det är sedan nödvändigt att befordra beständiga frågor till miljöer på högre nivå, vilket i slutänden gör dem tillgängliga i en AEM Publish-miljö för att klientprogram ska kunna använda dem.
Paketera beständiga frågor
Beständiga frågor kan byggas in i AEM paket. AEM paket kan sedan laddas ned och installeras i olika miljöer. AEM paket kan också replikeras från en AEM redigeringsmiljö till AEM Publish-miljöer.
Skapa ett paket:
- Navigera till Verktyg > Distribution > Paket.
- Skapa ett nytt paket genom att trycka på Skapa paket. Då öppnas en dialogruta där du kan definiera paketet.
- I dialogrutan Paketdefinition, under Allmänt, anger du ett Namn som "wknd-persistent-queries".
- Ange ett versionsnummer som "1.0".
- Lägg till ett nytt Filter under Filter. Använd Sökväg till Finder för att välja mappen
persistentQueries
under konfigurationen. Den fullständiga sökvägen för konfigurationenwknd
är till exempel/conf/wknd/settings/graphql/persistentQueries
. - Välj Spara om du vill spara den nya paketdefinitionen och stänga dialogrutan.
- Välj knappen Skapa i den skapade paketdefinitionen.
När paketet har byggts kan du:
- Hämta paketet och överföra det igen till en annan miljö.
- Replikera paketet genom att trycka på Mer > Replikera. Paketet kommer att replikeras till den anslutna AEM Publish-miljön.