GraphQL リゾルバーを設定する (廃止)

重要

  • set-graphql-resolver ポリシーは廃止されました。 set-graphql-resolver ポリシーを使用しているお客様は、強化された機能を提供する GraphQL API のマネージド リゾルバーに移行する必要があります。
  • GraphQL フィールドに対してマネージド リゾルバーを構成すると、ゲートウェイではすべてのポリシー定義内で set-graphql-resolver ポリシーがスキップされます。 API Management インスタンスでマネージド リゾルバーと set-graphql-resolver ポリシーの使用を組み合わせることはできません。

set-graphql-resolver ポリシーでは、GraphQL スキーマに指定されているオブジェクト タイプで GraphQL フィールドのデータを取得するか、設定します。 スキーマを API Management にインポートする必要があります。 現在、データは HTTP ベースのデータ ソース (REST または SOAP API) を使用して解決する必要があります。

Note

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 API Management ポリシーを設定または編集する方法について説明します。

ポリシー ステートメント

<set-graphql-resolver parent-type="type" field="field"> 
    <http-data-source> 
        <http-request> 
            <set-method>...set-method policy configuration...</set-method> 
            <set-url>URL</set-url>
            <set-header>...set-header policy configuration...</set-header>
            <set-body>...set-body policy configuration...</set-body>
            <authentication-certificate>...authentication-certificate policy configuration...</authentication-certificate>  
        </http-request> 
        <http-response>
            <set-body>...set-body policy configuration...</set-body>
            <xml-to-json>...xml-to-json policy configuration...</xml-to-json>
            <find-and-replace>...find-and-replace policy configuration...</find-and-replace>
        </http-response>
      </http-data-source> 
</set-graphql-resolver> 

属性

属性 説明 必須 Default
parent-type GraphQL スキーマ内のオブジェクト型。 はい 該当なし
フィールド GraphQL スキーマで指定された parent-type のフィールド。 はい 該当なし

Note

現時点では、このポリシーの parent-typefield の値は検証されていません。 有効でない場合、ポリシーは無視され、GraphQL クエリは GraphQL エンドポイントに転送されます (構成されている場合)。

要素

名前 説明 必須
http-data-source HTTP 要求と、必要に応じて、特定の parent-typefield のデータの解決に使用される HTTP 応答を構成します。 はい
http-request リゾルバーの HTTP 要求を構成する URL ポリシーと子ポリシーを指定します。 はい
http-response 必要に応じて、リゾルバーの HTTP 応答を構成する子ポリシーを指定します。 指定しない場合、応答は生文字列として返されます。

http-request 要素

Note

特に明記されている場合を除き、各子要素は最大で 1 回指定できます。 リストされている順序で要素を指定します。

要素 説明 必須
set-method リゾルバーの HTTP 要求のメソッドを設定します。 はい
set-url リゾルバーの HTTP 要求の URL を設定します。 Yes
set-header リゾルバーの HTTP 要求のヘッダーを設定します。 複数のヘッダーがある場合は、追加の header 要素を追加します。 No
set-body リゾルバーの HTTP 要求の本文を設定します。 No
authentication-certificate リゾルバーの HTTP 要求でクライアント証明書を使用して認証します。 No

http-response 要素

注意

各子要素は、最大で 1 回指定できます。 リストされている順序で要素を指定します。

名前 説明 必須
set-body リゾルバーの HTTP 応答の本文を設定します。 No
xml-to-json リゾルバーの HTTP 応答を XML から JSON に変換します。 No
find-and-replace リゾルバーの HTTP 応答で部分文字列を検索し、別の部分文字列に置き換えます。 いいえ

使用法

使用上の注意

  • このポリシーは、一致する GraphQL クエリが実行された場合にのみ呼び出されます。
  • このポリシーは、1 つのフィールドのデータを解決します。 複数のフィールドのデータを解決するには、ポリシー定義でこのポリシーが複数回発生するように構成します。

GraphQL コンテキスト

  • HTTP 要求と HTTP 応答のコンテキスト (指定されている場合) は、元のゲートウェイ API 要求のコンテキストと異なります:
    • context.ParentResult は、現在のリゾルバー実行の親オブジェクトに設定されます。
    • HTTP 要求コンテキストには、GraphQL クエリで本文として渡される引数が含まれています。
    • HTTP 応答コンテキストは、リゾルバーによって行われた独立した HTTP 呼び出しからの応答であり、ゲートウェイ要求の完全な応答のコンテキストではありません。 要求と応答のパイプラインを通過するcontext変数は、<set-graphql-resolver>のポリシーで使用すると、GraphQL コンテキストで拡張されます。

ParentResult

context.ParentResult は、現在のリゾルバー実行の親オブジェクトに設定されます。 次の部分的なスキーマを考えてみましょう。

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
        }
    }
}

parent-type="Blog" field="comments" にリゾルバを設定する場合は、どのブログ ID を使用するかを理解したいはずです。 context.ParentResult.AsJObject()["id"].ToString() を使用してブログの ID を取得できます。 このリゾルバーを構成するためのポリシーは、次のようになります。

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var blogId = context.ParentResult.AsJObject()["id"].ToString();
                return $"https://data.contoso.com/api/blog/{blogId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

引数

パラメーター化された GraphQL クエリの引数が要求の本文に追加されます。 たとえば、次の 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 } }"
}

リゾルバが実行されると、arguments プロパティが本文に追加されます。 リゾルバーは次のように定義できます。

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var commentId = context.Request.Body.As<JObject>(true)["arguments"]["id"];
                return $"https://data.contoso.com/api/comment/{commentId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

その他の例

GraphQL クエリのリゾルバー

次の例では、バックエンド データ ソースへの HTTP GET 呼び出しを行ってクエリを解決します。

スキーマの例

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

サンプル ポリシー

<set-graphql-resolver parent-type="Query" field="users">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>https://data.contoso.com/get/users</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

液体テンプレートを使用してリストを返す GraqhQL クエリのリゾルバー

次の例では、set-body ポリシーで使用するためにサポートされている液体テンプレートを使用して、HTTP 応答の一覧をクエリに返します。 また、REST API からの応答の username フィールド名が、GraphQL 応答の name に変更されます。

スキーマの例

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

サンプル ポリシー

<set-graphql-resolver parent-type="Query" field="users">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>https://data.contoso.com/users</set-url>
        </http-request>
        <http-response>
            <set-body template="liquid">
                [
                    {% JSONArrayFor elem in body %}
                        {
                            "name": "{{elem.username}}"
                        }
                    {% endJSONArrayFor %}
                ]
            </set-body>
        </http-response>
    </http-data-source>
</set-graphql-resolver>

GraphQL 変化のリゾルバー

次の例では、HTTP データ ソースに POST 要求を行ってデータを挿入する変更を解決します。 HTTP 要求の set-body ポリシー内のポリシー式は、GraphQL クエリで本文として渡される name 引数を変更します。 送信される本文は、次の JSON のようになります。

{
    "name": "the-provided-name"
}

スキーマの例

type Query {
    users: [User]
}

type Mutation {
    makeUser(name: String!): User
}

type User {
    id: String!
    name: String!
}

サンプル ポリシー

<set-graphql-resolver parent-type="Mutation" field="makeUser">
    <http-data-source>
        <http-request>
            <set-method>POST</set-method>
            <set-url> https://data.contoso.com/user/create </set-url>
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                var args = context.Request.Body.As<JObject>(true)["arguments"];  
                JObject jsonObject = new JObject();
                jsonObject.Add("name", args["name"])
                return jsonObject.ToString();
            }</set-body>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

ポリシーに対する処理の詳細については、次のトピックを参照してください。