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-type
と field
の値は検証されていません。 有効でない場合、ポリシーは無視され、GraphQL クエリは GraphQL エンドポイントに転送されます (構成されている場合)。
要素
名前 | 説明 | 必須 |
---|---|---|
http-data-source | HTTP 要求と、必要に応じて、特定の parent-type と field のデータの解決に使用される 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 応答で部分文字列を検索し、別の部分文字列に置き換えます。 | いいえ |
使用法
- ポリシー セクション: backend
- ポリシー スコープ: グローバル、ワークスペース、製品、API、操作
- ゲートウェイ: 専用
使用上の注意
- このポリシーは、一致する 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>
関連ポリシー
関連コンテンツ
ポリシーに対する処理の詳細については、次のトピックを参照してください。
- チュートリアル:API を変換および保護する
- ポリシー ステートメントとその設定の一覧に関するポリシー リファレンス
- ポリシー式
- ポリシーの設定または編集
- ポリシー構成を再利用する
- ポリシー スニペットのリポジトリ
- Microsoft Copilot for Azure を使用してポリシーを作成する