持續性 GraphQL 查詢 persisted-graphql-queries
持續性查詢是在 Adobe Experience Manager (AEM) as a Cloud Service 伺服器上建立和儲存的 GraphQL 查詢。用戶端應用程式可以透過 GET 要求來要求它們。GET 要求的回應可以在 Dispatcher 和 CDN 層快取,最終提高發出要求之用戶端應用程式的效能。這與標準的 GraphQL 查詢不同,後者使用 POST 要求執行,其回應無法輕鬆快取。
AEM 有提供 GraphiQL IDE,可讓您在傳送到生產環境之前,開發、測試和保留您的 GraphQL 查詢。如果需要自訂 (例如自訂快取時),您可以使用 API,請參閱如何保留 GraphQL 查詢中提供的 cURL 範例。
持續性查詢和端點 persisted-queries-and-endpoints
持續性查詢必須一律使用與適當的 Sites 設定相關的端點;所以可以使用以下其中之一,或兩者都使用:
- 全域設定和端點
查詢可以存取所有內容片段模型。 - 特定 Sites 設定和端點
為特定 Sites 設定建立持續性查詢時,需要相應的 Sites 設定專屬端點 (以提供相關內容片段模型的存取權)。
例如,若要專門為 WKND Sites 設定建立持續性查詢,必須提前建立相應的 WKND 專屬 Sites 設定和 WKND 專屬端點。
例如,如果有一個名為 my-query
的特定查詢,它使用 Sites 設定 my-conf
中的模型 my-model
:
- 您可以使用
my-conf
專屬端點建立查詢,然後查詢會儲存為:/conf/my-conf/settings/graphql/persistentQueries/my-query
- 您可以使用
global
端點建立相同查詢,然後查詢會儲存為:/conf/global/settings/graphql/persistentQueries/my-query
如何保留 GraphQL 查詢 how-to-persist-query
建議最初在 AEM 編寫環境中保留查詢,然後將查詢傳輸到生產 AEM 發佈環境,以供應用程式使用。
有多種保留查詢的方法,包括:
GraphiQL IDE 是保留查詢的 首選 方法。若要使用 cURL 命令列工具保留特定查詢:
-
透過將查詢放入新端點 URL
/graphql/persist.json/<config>/<persisted-label>
來準備查詢。例如,建立持續性查詢:
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 } } } }'
-
此時,檢查回應。
例如,檢查是否成功:
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" }
-
然後,您可以透過取得 URL
/graphql/execute.json/<shortPath>
來要求持續性查詢。例如,使用持續性查詢:
code language-shell $ curl -X GET \ http://localhost:4502/graphql/execute.json/wknd/plain-article-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 } } } }'
-
建立已包裝的普通查詢。
例如:
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 } } } }"}'
-
建立含快取控制的已包裝普通查詢。
例如:
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 }}'
-
建立含參數的持續性查詢:
例如:
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 } } } }'
如何執行持續性查詢 execute-persisted-query
若要執行持續性查詢,用戶端應用程式使用以下語法發出 GET 要求:
GET <AEM_HOST>/graphql/execute.json/<PERSISTENT_PATH>
其中 PERSISTENT_PATH
是持續性查詢儲存所在的縮短路徑。
-
例如
wknd
是設定名稱,plain-article-query
是持續性查詢的名稱。若要執行查詢:code language-shell $ curl -X GET \ https://publish-p123-e456.adobeaemcloud.com/graphql/execute.json/wknd/plain-article-query
-
執行含參數的查詢。
note note NOTE 執行持續性查詢時,查詢變數和值必須正確編碼。 例如:
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
如需詳細資料,請參閱使用查詢變數。
使用查詢變數 query-variables
查詢變數可以與持續性查詢一起使用。查詢變數使用變數名稱和值附加到開頭為分號 (;
) 的要求。多個變數會用分號分隔。
模式如下所示:
<AEM_HOST>/graphql/execute.json/<PERSISTENT_QUERY_PATH>;variable1=value1;variable2=value2
例如,以下查詢包含一個變數 activity
以根據活動值篩選清單:
query getAdventuresByActivity($activity: String!) {
adventureList (filter: {
adventureActivity: {
_expressions: [
{
value: $activity
}
]
}
}){
items {
_path
adventureTitle
adventurePrice
adventureTripLength
}
}
}
此查詢可以保留在路徑 wknd/adventures-by-activity
下。若要在 activity=Camping
呼叫持續性查詢,要求將如下所示:
<AEM_HOST>/graphql/execute.json/wknd/adventures-by-activity%3Bactivity%3DCamping
%3B
是 ;
的 UTF-8 編碼,%3D
是 =
的編碼。查詢變數和任何特殊字元必須正確編碼才能執行持續性查詢。
使用查詢變數 - 最佳做法 query-variables-best-practices
在查詢中使用變數時,應遵循以下幾個最佳做法:
-
編碼
作為一般方法,建議對所有特殊字元進行編碼;例如,;
、=
、?
、&
等。 -
分號
使用多個變數 (以分號分隔) 的持續性查詢需要具有:- 分號編碼 (
%3B
);對 URL 進行編碼也會達到這個效果 - 或在查詢結尾新增結尾分號
- 分號編碼 (
-
CACHE_GRAPHQL_PERSISTED_QUERIES
當 Dispatcher 啟用 CACHE_GRAPHQL_PERSISTED_QUERIES
時,則值中包含/
或 \
字元的參數會在 Dispatcher 層級上進行兩次編碼。為了避免這種情況:
-
在 Dispatcher 上啟用
DispatcherNoCanonURL
。這將指示 Dispatcher 將原始 URL 轉發到 AEM,以防止重複編碼。然而,此設置目前僅在vhost
層級上有效,因此,如果您已經有 Dispatcher 設定來重寫 URL (例如,使用縮短的 URL),您可能需要為持續性查詢 URL 設定一個單獨的vhost
。 -
傳送未編碼的
/
或\
字元。
呼叫持續性查詢 URL 時,請確保所有/
或\
字元在持續性查詢變數的值中保持未編碼狀態。note note NOTE 僅當 DispatcherNoCanonURL
解決方案因故無法實施時才建議使用此選項。 -
CACHE_GRAPHQL_PERSISTED_QUERIES
當 Dispatcher 啟用
CACHE_GRAPHQL_PERSISTED_QUERIES
時,;
字元不能在變數值中使用。
快取持續性查詢 caching-persisted-queries
建議使用持續性查詢,因為可以在 Dispatcher 和內容傳遞網路 (CDN) 層進行快取,最終提升發出要求的用戶端應用程式效能。
依預設,AEM 將根據存留時間 (TTL) 定義使快取失效。這些 TTL 可以依照以下參數定義。這些參數可以透過各種方式存取,根據所使用的機制,名稱會有所不同:
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
編寫執行個體 author-instances
對於編寫執行個體,預設值為:
max-age
:60s-maxage
: 60stale-while-revalidate
: 86400stale-if-error
: 86400
這些:
-
不可被覆寫:
- 使用 OSGi 設定
-
可以被覆寫:
- 透過使用 cURL 定義 HTTP 標頭設定的請求;它應該包括合適的
cache-control
設定和/或surrogate-control
;例如,請參閱管理持續性查詢層級的快取 - 如果您在 GraphiQL IDE 的 標頭 對話框中指定值。
- 透過使用 cURL 定義 HTTP 標頭設定的請求;它應該包括合適的
發佈執行個體 publish-instances
對於發佈執行個體,預設值為:
max-age
:60s-maxage
: 7200stale-while-revalidate
: 86400stale-if-error
: 86400
這些可以被覆寫:
-
在持續性查詢層級;這涉及在命令列介面中使用 cURL 將查詢發佈到 AEM,以及發佈持續性查詢。
管理 GraphiQL IDE 中的 HTTP 快取標頭 http-cache-headers-graphiql-ide
GraphiQL IDE - 請參閱儲存持續性查詢
在持續性查詢層級管理快取 cache-persisted-query-level
這涉及在命令列介面中使用 cURL 將查詢發佈到 AEM。
對於 PUT (建立) 方法的範例:
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} }'
對於 POST (更新) 方法的範例:
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
可以在建立時 (PUT) 或稍後 (例如透過 POST 要求) 設定。建立持續性查詢時,快取控制是選用的,因為 AEM 可以提供預設值。如需有關如何使用 cURL 保留查詢的範例,請參閱如何保留 GraphQL 查詢。
使用 Cloud Manager 變數管理快取 cache-cloud-manager-variables
Cloud Manager 環境變數可以使用 Cloud Manager 來定義以定義所需的值:
graphqlStaleIfError
graphqlSurrogateControl
使用 OSGi 設定管理快取 cache-osgi-configration
若要全域管理快取,您可以為 持續性查詢服務設定進行 OSGi 設定。
發佈執行個體的預設 OSGi 設定:
-
讀取 Cloud Manager 變數 (若有):
table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 layout-auto OSGi 設定屬性 讀取此 Cloud Manager 變數 cacheControlMaxAge
讀取 graphqlCacheControl
surrogateControlMaxAge
讀取 graphqlSurrogateControl
surrogateControlStaleWhileRevalidate
讀取 graphqlStaleWhileRevalidate
surrogateControlStaleIfError
讀取 graphqlStaleIfError
-
如果沒有,OSGi 設定會使用發佈執行個體的預設值。
設定查詢回應代碼 configuring-query-response-code
預設情況下,PersistedQueryServlet
執行查詢時,會傳送 200
回應,無論實際結果如何。
您可以設定 OSGi 設定 (針對 持續性查詢服務設定),以決定持續性查詢中出現錯誤時,/execute.json/persisted-query
端點是否傳回更詳細的狀態代碼。
欄位 Respond with application/graphql-response+json
(responseContentTypeGraphQLResponseJson
) 可依要求定義:
-
false
(預設值):持續性查詢成功與否並不重要。傳回的Content-Type
標頭為application/json
,並且/execute.json/persisted-query
總是 傳回狀態代碼200
。 -
true
:
傳回的Content-Type
為application/graphql-response+json
,且在執行持續性查詢時若出現任何形式的錯誤,此端點會傳回適當的回應代碼:table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 代碼 說明 200 成功回應 400 表示缺少標頭,或持續性查詢路徑存在問題。例如,未指定設定名稱、未指定尾碼等。
請參閱「疑難排解 - GraphQL 端點未設定」。404 找不到要求的資源。例如,Graphql 端點無法在伺服器上使用。
請參閱「疑難排解 - GraphQL 持續性查詢 URL 中缺少路徑」。500 內部伺服器錯誤。例如,驗證錯誤、持續性錯誤等。 note note NOTE 另請參閱 https://graphql.github.io/graphql-over-http/draft/#sec-Status-Codes
編碼查詢 URL 以供應用程式使用 encoding-query-url
為供應用程式使用,建構查詢變數時使用的任何特殊字元 (即分號 (;
)、等號 (=
)、斜線 /
) 必須是轉換為使用相應的 UTF-8 編碼。
例如:
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 可以分解成以下幾個部分:
/graphql/execute.json
/wknd/adventure-by-path
%3B
;
編碼adventurePath
%3D
=
編碼%2F
/
編碼%2Fcontent%2Fdam...
在純文字中,要求 URI 如下所示:
/graphql/execute.json/wknd/adventure-by-path;adventurePath=/content/dam/wknd/en/adventures/bali-surf-camp/bali-surf-camp
若要在用戶端應用程式中使用持續性查詢,AEM Headless 用戶端 SDK 應該用於 JavaScript、Java 或 NodeJS。Headless 用戶端 SDK 會自動將要求中的任何查詢變數適當地編碼。
將持續性查詢轉移到您的生產環境 transfer-persisted-query-production
持續性查詢應一律建立在 AEM Author 服務上,然後發佈 (複製) 到 AEM Publish 服務。通常,持續性查詢是在低層環境 (例如本機或開發環境) 中建立和測試的。然後,必須將持續性查詢提升到高層環境,最終使它們能在生產 AEM Publish 環境中供用戶端應用程式使用。
封裝持續性查詢
持續性查詢可以內建在 AEM 套件 中。然後,AEM 套件可以下載和安裝在不同的環境中。AEM 套件也可以從 AEM 編寫環境複製到 AEM 發佈環境。
若要建立套件:
- 導覽至 工具 > 部署 > 套件。
- 點選 建立套件 來建立新套件。這會開啟一個對話框來定義封裝。
- 在套件定義對話框中,在 一般 下輸入 名稱,例如「wknd-persistent-queries」。
- 輸入版本號碼,例如「1.0」。
- 在 篩選器 下加入新 篩選器。使用路徑尋找工具選取設定下方的
persistentQueries
資料夾。例如,對於wknd
設定,完整路徑將為/conf/wknd/settings/graphql/persistentQueries
。 - 選取「儲存」以儲存新的封裝定義並關閉對話框。
- 選取已建立封裝定義中的「建置」按鈕。
建置套件後,您可以:
- 下載 套件並在不同環境中重新上傳。
- 點選 更多 > 複製 來 複製 套件。這會將套件複製到連接的 AEM 發佈環境。