次の方法で共有


リゾルバーの HTTP データ ソース

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

http-data-source リゾルバー ポリシーは、GraphQL スキーマ内のオブジェクト タイプとフィールドのデータを解決するために HTTP 要求を構成し、必要に応じて HTTP 応答を構成します。 スキーマは API Management に GraphQL API としてインポートする必要があります。

Note

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

ポリシー ステートメント

<http-data-source> 
    <http-request>
        <get-authorization-context>...get-authorization-context policy configuration...</get-authorization-context>
        <set-backend-service>...set-backend-service policy configuration...</set-backend-service>
        <set-method>...set-method policy configuration...</set-method> 
        <set-url>URL</set-url>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
        <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> 
    <backend>
        <forward-request>...forward-request policy configuration...</forward-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>
        <publish-event>...publish-event policy configuration...</publish-event>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
    </http-response>
</http-data-source> 

要素

名前 説明 必須
http-request リゾルバーの HTTP 要求を構成する URL ポリシーと子ポリシーを指定します。 はい
バックエンド 必要に応じて、リゾルバーの HTTP 要求をバックエンド サービスに転送します (指定されている場合)。 いいえ
http-response 必要に応じて、リゾルバーの HTTP 応答を構成する子ポリシーを指定します。 指定しない場合、応答は生文字列として返されます。 No

http-request 要素

Note

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

要素 説明 必須
認可コンテキストの取得 リゾルバーの HTTP 要求の承認コンテキストを取得します。 いいえ
set-backend-service リゾルバーの HTTP 要求を指定されたバックエンドにリダイレクトします。 いいえ
include-fragment ポリシー定義にポリシー フラグメントを挿入します。 複数のフラグメントがある場合は、追加の include-fragment 要素を追加します。 いいえ
set-method リゾルバーの HTTP 要求のメソッドを設定します。 はい
set-url リゾルバーの HTTP 要求の URL を設定します。 Yes
set-header リゾルバーの HTTP 要求のヘッダーを設定します。 複数のヘッダーがある場合は、追加の header 要素を追加します。 No
set-body リゾルバーの HTTP 要求の本文を設定します。 No
authentication-certificate リゾルバーの HTTP 要求でクライアント証明書を使用して認証します。 No

backend 要素

要素 説明 必須
forward-request リゾルバーの HTTP 要求を構成済みのバックエンド サービスに転送します。 No

http-response 要素

注意

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

名前 説明 必須
set-body リゾルバーの HTTP 応答の本文を設定します。 No
xml-to-json リゾルバーの HTTP 応答を XML から JSON に変換します。 No
find-and-replace リゾルバーの HTTP 応答で部分文字列を検索し、別の部分文字列に置き換えます。 No
publish-event GraphQL API スキーマで指定された 1 つ以上のサブスクリプションにイベントを発行します。 いいえ
include-fragment ポリシー定義にポリシー フラグメントを挿入します。 複数のフラグメントがある場合は、追加の include-fragment 要素を追加します。 いいえ

使用法

使用上の注意

  • このポリシーを使用してリゾルバーを構成および管理するには、「GraphQL リゾルバーを構成する」を参照してください。
  • このポリシーは、スキーマ内の一致する GraphQL 操作の種類の 1 つのフィールドを解決する場合にのみ呼び出されます。

GraphQL クエリのリゾルバー

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

スキーマの例

type Query {
    users: [User]
}

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

サンプル ポリシー

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

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

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

スキーマの例

type Query {
    users: [User]
}

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

サンプル ポリシー

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

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

サンプル ポリシー

<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.GraphQL.Arguments;  
            JObject jsonObject = new JObject();
            jsonObject.Add("name", args["name"])
            return jsonObject.ToString();
        }</set-body>
    </http-request>
</http-data-source>

GraphQL 共用体型のリゾルバー

次の例では、バックエンド データ ソースへの orderByIdHTTP 呼び出しを行ってクエリGETを解決し、顧客 ID と型を含む JSON オブジェクトを返します。 顧客の型は、RegisteredCustomer 型と GuestCustomer 型の和集合です。

スキーマの例

type Query {
  orderById(orderId: Int): Order
}

type Order {
  customerId: Int!
  orderId: Int!  
  customer: Customer
}

enum AccountType {
  Registered
  Guest
}

union Customer = RegisteredCustomer | GuestCustomer

type RegisteredCustomer {
  accountType: AccountType!
  customerId: Int!
  customerGuid: String!
  firstName: String!
  lastName: String!
  isActive: Boolean!
}

type GuestCustomer {
  accountType: AccountType!
  firstName: String!
  lastName: String!
}

サンプル ポリシー

この例では、外部ソースから顧客の結果をモックし、フェッチされた結果を set-body ポリシーにハード コーディングします。 __typename フィールドは、顧客の型を決定するために使用されます。

<http-data-source>
    <http-request>
        <set-method>GET</set-method>
        <set-url>https://data.contoso.com/orders/</set-url>
    </http-request>
    <http-response>
        <set-body>{"customerId": 12345, "accountType": "Registered", "__typename": "RegisteredCustomer" }
        </set-body>
    </http-response>
</http-data-source>

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