GraphQL リゾルバーを構成する

適用対象: すべての API Management レベル

GraphQL スキーマに指定されたオブジェクト型の GraphQL フィールドのデータを取得したり設定したりするようにリゾルバーを構成します。 スキーマは API Management に GraphQL API としてインポートする必要があります。

現在、API Management では、次のデータ ソースにアクセスできるリゾルバーがサポートされています。

注意事項

  • リゾルバーは、スキーマ内の一致するオブジェクト型とフィールドが実行された場合にのみ呼び出されるポリシー定義を含むリソースです。
  • 各リゾルバーは、1 つのフィールドのデータを解決します。 複数のフィールドのデータを解決するには、それぞれに別々のリゾルバーを構成します。
  • リゾルバースコープのポリシーは、ポリシー実行パイプライン内の ポリシーの "inboundbackend" に評価されます。 他のスコープからのポリシーは継承しません。 詳しくは、Azure API Management でのポリシーに関するページをご覧ください。
  • リゾルバー スコープ ポリシーとは無関係に、GraphQL API の API スコープ ポリシーを構成できます。 たとえば、validate-graphql-request ポリシーを inbound スコープに追加して、リゾルバーが呼び出される前に要求を検証します。 API の [API ポリシー] タブで、API スコープ ポリシーを構成します。

前提条件

リゾルバーを作成する

次の手順では、HTTP ベースのデータ ソースを使用してリゾルバーを作成します。 一般的な手順は、サポートされているデータ ソースを使用するすべてのリゾルバーで同様です。

  1. Azure portal で、API Management インスタンスに移動します。

  2. 左側のメニューから [API] を選択し、次に GraphQL API の名前を選択します。

  3. [スキーマ] タブで、リゾルバーを構成するオブジェクト型のフィールド用のスキーマをレビューします。

    1. フィールドを選択し、左の余白にポインターを置きます。

    2. [+ リゾルバーの追加] を選択します。

      ポータルで GraphQL スキーマのフィールドからリゾルバーを追加するスクリーンショット。

  4. [リゾルバーの作成] ページで、次の手順を実行します。

    1. 必要に応じて [名前] プロパティを更新し、任意で [説明] を入力し、[型][フィールド] の選択内容を確認または更新します。
    2. リゾルバーの [データ ソース] を選びます。 この例では、[HTTP API] を選びます。
  5. リゾルバー ポリシー エディターで、使用するシナリオの子要素を使用して http-data-source ポリシーを更新します。

    1. GraphQL 操作を HTTP 要求に変換するポリシーで、必要な http-request 要素を更新します。

    2. 必要に応じて http-response 要素を 追加し、リゾルバーの HTTP 応答を変換する子ポリシーを追加します。 http-response 要素が指定されていない場合、応答は生文字列として返されます。

    3. [作成] を選択します

      ポータルのリゾルバー ポリシー エディターを示すスクリーンショット。

    リゾルバーはフィールドにアタッチされ、[リゾルバー] タブに表示されます。

    ポータルの GraphQL API 用リゾルバー一覧のスクリーンショット。

リゾルバーの管理

API の [リゾルバー] タブで、GraphQL 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>

次の手順

リゾルバーのその他の例については、次を参照してください。