適用対象: すべての 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フィールドが含まれているか、を含むように__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要素が指定されていない場合、応答は生文字列として返されます。[作成]を選択します
リゾルバーがフィールドにアタッチされて、[リゾルバー] タブに表示されます。
リゾルバーを管理する
GraphQL API のリゾルバーは、API の [ リゾルバー ] タブで一覧表示および管理できます。
[リゾルバー] タブでは:
[リンク] 列は、リゾルバーが、現在 GraphQL スキーマ内にあるフィールド用に構成されているかを示します。 リゾルバーがリンクされていない場合は、呼び出すことはできません。
リゾルバーのコンテキスト メニュー (...) で、リゾルバーを [複製]、[編集]、または [削除] するコマンドを見つけます。 別の型とフィールドをターゲットとする同様のリゾルバーをすばやく作成するには、一覧表示されたリゾルバーを複製します。
[+ 作成] を選んで、新しいリゾルバーを作成できます。
リゾルバーを編集してテストする
1 つのリゾルバーを編集するときは、[リゾルバーの編集] ページが開きます。 次のようにすることができます。
リゾルバー ポリシーと必要に応じてデータ ソースを更新します。 データ ソースを変更すると、現在のリゾルバー ポリシーが上書きされます。
リゾルバーのターゲットの型とフィールドを変更します。
リゾルバーの構成をテストしてデバッグします。 リゾルバー ポリシーを編集したら、[テストの実行] を選んでデータ ソースからの出力を確認し、スキーマに対して検証できます。 エラーが発生した場合、応答にはトラブルシューティング情報が含まれます。
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
}
}
}
comments 型の Blog フィールド用にリゾルバーを設定する場合は、使用するブログ 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>
関連コンテンツ
リゾルバーのその他の例については、次を参照してください。