GraphQL リゾルバーを構成する
適用対象: すべての API Management レベル
GraphQL スキーマに指定されたオブジェクト型の GraphQL フィールドのデータを取得したり設定したりするようにリゾルバーを構成します。 スキーマは API Management に GraphQL API としてインポートする必要があります。
Note
現在、この機能はワークスペースでは使用できません。
現在、API Management では、次のデータ ソースにアクセスできるリゾルバーがサポートされています。
- HTTP ベースのデータ ソース (REST または SOAP API)
- Cosmos DB データベース
- Azure SQL データベース
注意事項
- リゾルバーは、スキーマ内の一致するオブジェクト型とフィールドが実行された場合にのみ呼び出されるポリシー定義を含むリソースです。
- 各リゾルバーは、1 つのフィールドのデータを解決します。 複数のフィールドのデータを解決するには、それぞれに別々のリゾルバーを構成します。
- リゾルバースコープのポリシーは、ポリシー実行パイプライン内の と ポリシーの "
inbound
後backend
" に評価されます。 他のスコープからのポリシーは継承しません。 詳しくは、Azure API Management でのポリシーに関するページをご覧ください。 - リゾルバー スコープ ポリシーとは無関係に、GraphQL API の API スコープ ポリシーを構成できます。 たとえば、validate-graphql-request ポリシーを
inbound
スコープに追加して、リゾルバーが呼び出される前に要求を検証します。 API の [API ポリシー] タブで、API スコープ ポリシーを構成します。 - GraphQL リゾルバーでインターフェイスと共用体の型をサポートするには、バックエンド応答に既に
__typename
フィールドが含まれているか、set-body ポリシーを使用して__typename
を含むように変更する必要があります。
前提条件
- 既存の API Management インスタンスがある。 まだない場合は、作成してください。
- パススルーまたは合成 GraphQL API をインポートします。
リゾルバーを作成する
次の手順では、HTTP ベースのデータ ソースを使用してリゾルバーを作成します。 一般的な手順は、サポートされているデータ ソースを使用するすべてのリゾルバーで同様です。
Azure portal で、API Management インスタンスに移動します。
左側のメニューから [API] を選択し、次に GraphQL API の名前を選択します。
[スキーマ] タブで、リゾルバーを構成するオブジェクト型のフィールド用のスキーマをレビューします。
フィールドを選択し、左の余白にポインターを置きます。
[+ リゾルバーの追加] を選択します。
[リゾルバーの作成] ページで、次の手順を実行します。
- 必要に応じて [名前] プロパティを更新し、任意で [説明] を入力し、[型] と [フィールド] の選択内容を確認または更新します。
- リゾルバーの [データ ソース] を選びます。 この例では、[HTTP API] を選びます。
リゾルバー ポリシー エディターで、使用するシナリオの子要素を使用して
http-data-source
ポリシーを更新します。GraphQL 操作を HTTP 要求に変換するポリシーで、必要な
http-request
要素を更新します。必要に応じて
http-response
要素を 追加し、リゾルバーの HTTP 応答を変換する子ポリシーを追加します。http-response
要素が指定されていない場合、応答は生文字列として返されます。[作成] を選択します
リゾルバーはフィールドにアタッチされ、[リゾルバー] タブに表示されます。
リゾルバーの管理
API の [リゾルバー] タブで、GraphQL API のリゾルバーを一覧表示して管理します。
[リゾルバー] タブで、次の手順を実行します。
[リンク] 列は、リゾルバーが、現在 GraphQL スキーマ内にあるフィールド用に構成されているかを示します。 リゾルバーがリンクされていない場合は、呼び出すことはできません。
リゾルバーのコンテキスト メニュー (...) で、リゾルバーを [複製]、[編集]、または [削除] するコマンドを見つけます。 一覧表示されたリゾルバーを複製して、別の型とフィールドをターゲットとする同様のリゾルバーをすばやく作成します。
[+ 作成] を選択して、新しいリゾルバーを作成できます。
リゾルバーを編集してテストする
単一リゾルバーを編集すると、[リゾルバーの編集] ページが開きます。 次のことを実行できます。
リゾルバー ポリシーと必要に応じてデータ ソースを更新します。 データ ソースを変更すると、現在のリゾルバー ポリシーが上書きされます。
リゾルバーがターゲットとする型とフィールドを変更します。
リゾルバーの構成をテストしてデバッグします。 リゾルバー ポリシーを編集するときに、[テストの実行] を選択してデータ ソースからの出力を確認します。この出力は、スキーマに対して検証できます。 エラーが発生した場合、応答にはトラブルシューティング情報が含まれます。
GraphQL コンテキスト
- リゾルバーの要求と応答のコンテキスト (指定されている場合) は、元のゲートウェイ API 要求のコンテキストとは異なります。
context.GraphQL
プロパティは、現在のリゾルバー実行の引数 (Arguments
) と親オブジェクト (Parent
) に設定されます。- 要求コンテキストには、GraphQL クエリに本文として渡される引数が含まれています。
- 応答コンテキストは、リゾルバーによって実行された独立した呼び出しからの応答であり、ゲートウェイ要求の完全な応答のコンテキストではありません。
要求と応答のパイプラインを通じて渡される
context
変数は、GraphQL リゾルバーで使用される場合、GraphQL コンテキストによって拡張されます。
context.GraphQL.parent
context.GraphQL.parent
は、現在のリゾルバー実行の親オブジェクトに設定されます。 次の部分的なスキーマを考えてみましょう。
type Comment {
id: ID!
owner: string!
content: string!
}
type Blog {
id: ID!
title: string!
content: string!
comments: [Comment]!
comment(id: ID!): Comment
}
type Query {
getBlog(): [Blog]!
getBlog(id: ID!): Blog
}
また、特定のブログのすべての情報に対する GraphQL クエリを検討してください。
query {
getBlog(id: 1) {
title
content
comments {
id
owner
content
}
}
}
Blog
型の comments
フィールド用にリゾルバーを設定する場合は、使用するブログ ID を把握する必要があります。 次のリゾルバーに示すように、context.GraphQL.Parent["id"]
を使用してブログの ID を取得できます。
<http-data-source>
<http-request>
<set-method>GET</set-method>
<set-url>@($"https://data.contoso.com/api/blog/{context.GraphQL.Parent["id"]}")
</set-url>
</http-request>
</http-data-source>
context.GraphQL.Arguments
パラメーター化された GraphQL クエリの引数が context.GraphQL.Arguments
に追加されます。 たとえば、次の 2 つのクエリを考えてみます。
query($id: Int) {
getComment(id: $id) {
content
}
}
query {
getComment(id: 2) {
content
}
}
これらのクエリは、getComment
リゾルバーを呼び出す 2 つの方法です。 GraphQL は、次の JSON ペイロードを送信します。
{
"query": "query($id: Int) { getComment(id: $id) { content } }",
"variables": { "id": 2 }
}
{
"query": "query { getComment(id: 2) { content } }"
}
リゾルバーは次のように定義できます。
<http-data-source>
<http-request>
<set-method>GET</set-method>
<set-url>@($"https://data.contoso.com/api/comment/{context.GraphQL.Arguments["id"]}")</set-url>
</http-request>
</http-data-source>
次の手順
リゾルバーのその他の例については、次を参照してください。