Persisted Queries
Persisted QueriesPersisted Queries

Persisted Queries

Included in the “Power Extensions” bundle

GraphQLクエリを使用してRESTのような定義済みエンドポイントを作成し、両方のAPIのメリットを得ましょう。

説明

RESTでは、複数のエンドポイントを作成し、それぞれが事前に定義されたデータセットを返します。

メリットデメリット
✅ シンプルです❌ すべてのエンドポイントを作成するのが面倒です
GETまたはPOSTでアクセスできます❌ エンドポイントの準備ができるまでプロジェクトがボトルネックになる可能性があります
✅ サーバーまたはCDNでキャッシュできます❌ ドキュメントの作成が必須です
✅ 安全です:意図したデータのみが公開されます❌ アプリケーションがすべてのデータを取得するために複数のリクエストが必要になる場合があり(主にモバイルアプリで)、遅くなる可能性があります

GraphQLでは、単一のエンドポイントに任意のクエリを送信でき、要求されたデータのみが返されます。

メリットデメリット
✅ データのアンダー/オーバーフェッチがありませんPOSTのみでアクセスできます
✅ すべてのデータを1回のリクエストで取得できるため、高速です❌ サーバーまたはCDNでキャッシュできないため、本来より遅く、コストがかかります
✅ プロジェクトの迅速な反復が可能です❌ ファイルのアップロードやキャッシュなど、車輪の再発明が必要な場合があります
✅ 自己ドキュメント化できます❌ N+1問題など、追加の複雑さに対処する必要があります
✅ クエリ用エディター(GraphiQL)を提供しており、作業を簡素化します 

Persisted queriesはこれら2つのアプローチを組み合わせます:

  • GraphQLを使用してクエリを作成・解決します
  • ただし、単一のエンドポイントを公開する代わりに、各事前定義クエリをそれぞれ独自のエンドポイントで公開します

そのため、RESTのように事前定義されたデータを持つ複数のエンドポイントを得られますが、GraphQLを使用して作成されるため、それぞれのメリットを得ながらデメリットを回避できます:

メリットデメリット
GETまたはPOSTでアクセスできます❌ すべてのエンドポイントを作成するのが面倒です
✅ サーバーまたはCDNでキャッシュできます❌ エンドポイントの準備ができるまでプロジェクトがボトルネックになる可能性があります
✅ 安全です:意図したデータのみが公開されます❌ ドキュメントの作成が必須です
✅ データのアンダー/オーバーフェッチがありません❌ アプリケーションがすべてのデータを取得するために複数のリクエストが必要になる場合があり(主にモバイルアプリで)、遅くなる可能性があります
✅ すべてのデータを1回のリクエストで取得できるため、高速ですPOSTのみでアクセスできます
✅ プロジェクトの迅速な反復が可能です❌ サーバーまたはCDNでキャッシュできないため、本来より遅く、コストがかかります
✅ 自己ドキュメント化できます❌ ファイルのアップロードやキャッシュなど、車輪の再発明が必要な場合があります
✅ クエリ用エディター(GraphiQL)を提供しており、作業を簡素化します❌ N+1問題など、追加の複雑さに対処する必要があります 👈🏻 この問題は基盤となるエンジンによって解決されています

Persisted queryエディター

Persisted Queryの実行

persisted queryが公開されると、そのパーマリンクを通じて実行できます。

persisted queryはGETでアクセスするため、ブラウザから直接実行でき、要求したデータをJSON形式で取得できます:

ブラウザでpersisted queryを実行する

Persisted Queryの作成

メニューのPersisted Queriesリンクをクリックすると、作成済みのすべてのpersisted queryの一覧が表示されます:

説明付きのPersisted queries
説明付きのPersisted queries

persisted queryはカスタム投稿タイプ(CPT)です。新しいpersisted queryを作成するには、「新しいGraphQL persisted queryを追加」ボタンをクリックしてWordPressエディターを開きます:

新しいPersisted Queryの作成

メインの入力欄はGraphiQLクライアントで、デフォルトでExplorerが付属しています。左サイドパネルのフィールドをクリックするとクエリに追加され、「Run」ボタンをクリックするとクエリが実行されます:

GraphiQL Explorer

クエリの準備ができたら公開すると、そのパーマリンクがエンドポイントになります。エンドポイント(およびソース)へのリンクは「Persisted Query Endpoint Overview」サイドバーパネルに表示されます:

Persisted Query Endpoint Overview

パーマリンクに?view=sourceを追加すると、persisted queryとその設定が表示されます(ユーザーがログイン済みで、そのユーザーロールがアクセス権を持っている場合):

Persisted queryのソース

デフォルトでは、persisted queryのエンドポイントのパスは/graphql-query/であり、この値はSettingsから設定できます:

Persisted queryの設定
Persisted queryの設定

スキーマ設定

スキーマに含まれる要素と、ユーザーのアクセス権は、スキーマ設定で定義します。

そのため、スキーマ設定を作成し、ドロップダウンから選択する必要があります:

スキーマ設定の選択

カテゴリーによるPersisted Queriesの整理

サイドバーパネル「Endpoint categories」では、Persisted Queryの管理に役立つカテゴリーを追加できます:

Persisted Query編集時のエンドポイントカテゴリー

たとえば、クライアント、アプリケーション、またはその他の必要な情報でエンドポイントを管理するカテゴリーを作成できます:

エンドポイントカテゴリーの一覧

Persisted Queriesの一覧では、それぞれのカテゴリーを確認できます。カテゴリーリンクをクリックするか、上部のフィルターを使用すると、そのカテゴリーのエントリーのみが表示されます:

カテゴリー付きPersisted Queriesの一覧

プライベートなpersisted queries

Persisted Queryのステータスをprivateに設定すると、そのエンドポイントには管理者ユーザーのみがアクセスできます。これにより、アクセスすべきでないユーザーにデータが意図せず共有されることを防ぎます。

たとえば、メトリクスのレポートを作成するためのデータ取得など、アプリケーション管理に役立つプライベートなPersisted Queriesを作成できます。

プライベートなPersisted Query

パスワード保護されたpersisted queries

特定のクライアント向けにPersisted Queryを作成する場合、パスワードを設定して、そのクライアントのみがエンドポイントにアクセスできるよう、追加のセキュリティレベルを提供できます。

パスワード保護されたPersisted Query

パスワード保護されたpersisted queryに初めてアクセスすると、パスワードを要求する画面が表示されます:

パスワード保護されたPersisted Query:初回アクセス

パスワードが入力・検証されて初めて、ユーザーは意図したエンドポイントにアクセスできます。

URLパラメーターによるpersisted queryの動的化

各変数の値は、persisted queryの実行時にURLパラメーター(変数名を使用)で設定できます。「URLパラメーターは変数を上書きしますか?」オプションが有効な場合、URLパラメーターが優先されます。それ以外の場合、変数ディクショナリで定義された値が優先されます(存在する場合)。

たとえば、このクエリでは結果の件数が変数$limitで制御されており、デフォルト値は3です:

persisted queryでの変数の使用

このpersisted queryを実行する際に?limit=5を渡すと、5件の結果を返すクエリが実行されます:

persisted queryでの変数値の上書き