永続的な 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>
に PUT してクエリを準備します。例えば、次のようにして、永続的クエリを作成します。
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>
を GET して、永続的クエリをリクエストできます。例えば、次のような永続的クエリを使用します。
code language-shell $ curl -X GET \ http://localhost:4502/graphql/execute.json/wknd/plain-article-query
-
既存のクエリパスに POST して、永続的クエリを更新します。
例えば、次のような永続的クエリを使用します。
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
UTF-8 エンコーディング %3B
は ;
に使用されます。また、%3D
は =
のエンコーディングです。永続クエリを実行するには、クエリ変数と特殊文字を適切にエンコードする必要があります。
クエリ変数の使用:ベストプラクティス query-variables-best-practices
クエリで変数を使用する場合、次のベストプラクティスに従う必要があります。
-
エンコーディング:
一般的なアプローチとして、すべての特殊文字(例:;
、=
、?
、&
など)を常にエンコードすることをお勧めします。 -
セミコロン:
(セミコロンで区切られた)複数の変数を使用する永続クエリには、次のいずれかが必要です。- エンコードされたセミコロン(
%3B
):URL をエンコードすると、これも実現されます - クエリの終わりに追加された末尾のセミコロン
- エンコードされたセミコロン(
-
CACHE_GRAPHQL_PERSISTED_QUERIES
:
Dispatcher のCACHE_GRAPHQL_PERSISTED_QUERIES
が有効な場合、値に/
または\
文字が含まれるパラメーターが Dispatcher レベルで 2 回エンコードされます。
この状況を回避するには、次の手順に従います。-
Dispatcher で
DispatcherNoCanonURL
を有効にします。
この結果、Dispatcher は元の URL を AEM に転送するように指示されるので、エンコーディングが重複しないようになります。
ただし、この設定は、現在、vhost
レベルでのみ機能するので、URL を書き換える Dispatcher 設定が既にある場合(例えば、短縮 URL を使用する場合など)は、永続クエリ URL 用に別個のvhost
が必要になることがあります。 -
/
文字または\
文字をエンコードせずに送信します。
永続クエリ URL を呼び出す場合は、永続クエリ変数の値の中ですべての/
文字または\
文字がエンコードされないままになっていることを確認します。note note NOTE このオプションは、何らかの理由で DispatcherNoCanonURL
による解決策を実装できない場合にのみお勧めします。
-
-
CACHE_GRAPHQL_PERSISTED_QUERIES
CACHE_GRAPHQL_PERSISTED_QUERIES
が Dispatcher に対して有効になっている場合は、;
文字は変数の値に使用できません。
永続クエリのキャッシュ 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 の ヘッダー ダイアログで値を指定する場合。
- 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 ではデフォルト値を提供できるので、永続クエリを作成する際に cache-control はオプションです。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 ヘッドレス クライアント SDK を JavaScript、Java または NodeJS に使用する必要があります。ヘッドレスクライアント SDK は、自動的にリクエスト内のクエリ変数を適切にエンコードします。
実稼動環境への永続クエリの移行 transfer-persisted-query-production
永続クエリは、常に、AEM オーサーサービスで作成してから、AEM パブリッシュサービスに公開(レプリケート)する必要があります。多くの場合、永続クエリは、ローカル環境や開発環境などの下位環境で作成およびテストされます。その後、永続クエリを上位レベルの環境に昇格し、最終的に実稼動 AEM パブリッシュ環境で使用できるようにして、クライアントアプリケーションが使用できるようにする必要があります。
永続クエリのパッケージ化
永続クエリは、AEM パッケージに組み込むことができます。その後、AEM パッケージをダウンロードして、様々な環境にインストールできます。AEM パッケージは、AEM オーサー環境から AEM パブリッシュ環境にレプリケートすることもできます。
パッケージを作成するには:
- ツール/デプロイメント/パッケージ に移動します。
- 「パッケージを作成」をタップして新しいパッケージを作成します。パッケージを定義するダイアログが開きます。
- パッケージ定義ダイアログの「一般」で、「wknd-persistent-queries」などの 名前 を入力します。
- 「1.0」のようなバージョン番号を入力します。
- 「フィルター」で、新しい フィルター を追加します。パスファインダーを使用して、設定の下にある
persistentQueries
フォルダーを選択します。例えば、wknd
設定の場合、フルパスは/conf/wknd/settings/graphql/persistentQueries
になります。 - 「保存」を選択して新しいパッケージ定義を保存し、ダイアログを閉じます。
- 作成されたパッケージ定義で「ビルド」ボタンを選択します。
パッケージが構築されたら、次の操作を実行できます。
- パッケージを ダウンロード し、別の環境で再アップロードする。
- その他/レプリケート をタップして、パッケージを レプリケート する。これにより、接続された AEM パブリッシュ環境にパッケージがレプリケートされます。