本文の設定
適用対象: すべての API Management レベル
set-body
ポリシーを使用して、要求または応答のメッセージ本文を設定します。 メッセージ本文へのアクセスには、ポリシーを inbound セクションと outbound セクションのどちらに記載するかに応じて context.Request.Body
プロパティまたは context.Response.Body
を使用します。
重要
既定では、context.Request.Body
または context.Response.Body
を使用してメッセージ本文にアクセスした場合元のメッセージ本文は失われるため、この本文を式で返して設定する必要があります。 本文の内容を保持するには、メッセージへのアクセス時に preserveContent
パラメーターを true
に設定します。 preserveContent
を true
に設定している場合に式から別の本文が返されると、返された本文が使用されます。
Note
ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 API Management ポリシーを設定または編集する方法について説明します。
ポリシー ステートメント
<set-body template="liquid" xsi-nil="blank | null" parse-date="true | false">
new body value as text
</set-body>
属性
属性 | 説明 | 必要 | Default |
---|---|---|---|
template | set-body ポリシーが実行されるテンプレート作成モードの変更に使用されます。 現在サポートされている値:- liquid - set-body ポリシーでは、liquid テンプレート作成エンジンが使用されます |
いいえ | 該当なし |
xsi-nil | xsi:nil="true" でマークされた要素を XML ペイロードでどのように表現するかを制御するために使用されます。 次のいずれかの値に設定します。- blank - nil は、空の文字列で表されます。- null - nil は、null 値で表されます。ポリシー式は使用できません。 |
いいえ | blank |
parse-date | ブール値。 日付形式の文字列 ("/Date(1198908717056)/" 、"2012-03-21T05:40Z" など) を System.DateTime (mm/dd/yyyy hh:mm:ss ) に解析するかどうかを指定します。 false に設定すると、日付値は単純にコピーされます。ポリシー式は使用できません。 |
いいえ | true |
要求と応答に関する情報にアクセスするために、Liquid テンプレートは次のプロパティでコンテキスト オブジェクトにバインドできます。
context. Request. Url Method OriginalMethod OriginalUrl IpAddress MatchedParameters HasBody ClientCertificates Headers Response. StatusCode Method Headers Url. Scheme Host Port Path Query QueryString ToUri ToString OriginalUrl. Scheme Host Port Path Query QueryString ToUri ToString
使用方法
- ポリシー セクション: inbound、outbound、backend
- ポリシー スコープ: グローバル、ワークスペース、製品、API、操作
- ゲートウェイ: クラシック、v2、従量課金、セルフホステッド、ワークスペース
使用上の注意
set-body
ポリシーを使用して新しい本文はまたは更新した本文を返す場合、新しい本文の内容を明示的に指定しているため、preserveContent
をtrue
に設定する必要はありません。- 受信パイプラインには応答が存在しないため、このパイプラインで応答の内容を保持しても意味がありません。
- 送信パイプラインで要求の内容を保持しても、要求はこの時点で既にバックエンドに送信されているため意味がありません。
- 受信パイプラインの
GET
内など、メッセージ本文がない場合にこのポリシーを使用すると、例外がスローされます。
詳細については、context.Request.Body
に関する表の context.Request.Body
context.Response.Body
IMessageBody
の各セクションを参照してください。
set-body での Liquid テンプレートの使用
set-body
ポリシーは、set-body
テンプレート作成言語を使用して要求または応答の本文を変換するように構成できます。 これは、メッセージの形式を完全に再構築する必要がある場合に効果的な場合があります。
重要
set-body
ポリシーで使用される Liquid の実装は、「C# mode」で構成されます。 これは、フィルター処理などを実行する際に特に重要です。 たとえば、日付フィルターを使用するには、次のような Pascal 形式と C# date 形式を使用する必要があります。
{{body.foo.startDateTime| Date:"yyyyMMddTHH:mm:ssZ"}}
重要
Liquid テンプレートを使用して XML 本文に正しくバインドするには、set-header
ポリシーを使用して、Content-Type を application/xml、text/xml (または任意の種類の終了 +xml) に設定します。JSON 本文の場合は、application/json、text/json (または任意の種類の終了 +json) にする必要があります。
重要
Liquid テンプレートは、現在の実行パイプラインにある要求/応答本文を入力として使用します。 このため、Liquid テンプレートを return-response ポリシー内で使用した場合は機能しません。 return-response ポリシーは、現在の実行パイプラインをキャンセルし、要求/応答本文を削除します。 その結果、return-response 内で使用される Liquid テンプレートは、空の文字列を入力として受け取り、期待される出力を生成しないことになります。
サポートされている Liquid フィルター
set-body
ポリシーでは、次の Liquid フィルターがサポートされています。 フィルターの例については、Liquid のドキュメントを参照してください。
注意
このポリシーでは、Liquid フィルター名にパスカル ケーシングが必要です (たとえば、"at_least" ではなく "AtLeast" など)。
- Abs
- 追加する
- AtLeast
- AtMost
- 大文字
- コンパクト
- 通貨
- Date
- Default
- DividedBy
- Downcase
- エスケープ
- First
- H
- Join
- 末尾
- Lstrip
- マップ
- Minus
- 剰余
- NewlineToBr
- Plus
- Prepend
- 削除
- RemoveFirst
- Replace
- ReplaceFirst
- Round
- Rstrip
- サイズ
- スライス
- 並べ替え
- Split
- Strip
- StripHtml
- StripNewlines
- 時刻
- Truncate
- TruncateWords
- Uniq
- Upcase
- UrlDecode
- UrlEncode
例
リテラル テキスト
<set-body>Hello world!</set-body>
文字列である本文にアクセスする
後からパイプラインでアクセスできるように、元の要求本文を保持しています。
<set-body>
@{
string inBody = context.Request.Body.As<string>(preserveContent: true);
if (inBody[0] =='c') {
inBody[0] = 'm';
}
return inBody;
}
</set-body>
JObject である本文にアクセスする
元の要求本文を予約していないため、後でパイプラインでそこにアクセスすると例外が発生します。
<set-body>
@{
JObject inBody = context.Request.Body.As<JObject>();
if (inBody.attribute == <tag>) {
inBody[0] = 'm';
}
return inBody.ToString();
}
</set-body>
製品に基づいて応答をフィルター処理する
この例は、Starter
製品を使用しているときに、バックエンド サービスから受信された応答からデータ要素を削除することによってコンテンツのフィルター処理を実行する方法を示しています。 このバックエンド応答の例には、OpenWeather One Call API に似たルート レベルのプロパティが含まれています。
<!-- Copy this snippet into the outbound section to remove a number of data elements from the response received from the backend service based on the name of the product -->
<choose>
<when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
<set-body>@{
var response = context.Response.Body.As<JObject>();
foreach (var key in new [] {"current", "minutely", "hourly", "daily", "alerts"}) {
response.Property (key).Remove ();
}
return response.ToString();
}
</set-body>
</when>
</choose>
Liquid テンプレートを使用して JSON を SOAP に変換する
<set-body template="liquid">
<soap:Envelope xmlns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetOpenOrders>
<cust>{{body.getOpenOrders.cust}}</cust>
</GetOpenOrders>
</soap:Body>
</soap:Envelope>
</set-body>
Liquid テンプレートを使用した JSON の変換
<set-body template="liquid">
{
"order": {
"id": "{{body.customer.purchase.identifier}}",
"summary": "{{body.customer.purchase.orderShortDesc}}"
}
}
</set-body>
URL でエンコードされたフォーム データとして本文にアクセスする
次の例では、AsFormUrlEncodedContent()
式を使って、URL でエンコードされたフォーム データ (コンテンツ タイプ application/x-www-form-urlencoded
) として要求本文にアクセスし、それを JSON に変換します。 元の要求本文を予約していないため、後でパイプラインでそこにアクセスすると例外が発生します。
<set-body>
@{
var inBody = context.Request.Body.AsFormUrlEncodedContent();
return JsonConvert.SerializeObject(inBody);
}
</set-body>
URL でエンコードされたフォーム データとして本文にアクセスして返す
次の例では、AsFormUrlEncodedContent()
式を使用して、URL でエンコードされたフォーム データ (コンテンツ タイプ application/x-www-form-urlencoded
) として要求の本文にアクセスし、ペイロードにデータを追加して、URL エンコードされたフォーム データを返します。 元の要求本文を予約していないため、後でパイプラインでそこにアクセスすると例外が発生します。
<set-body>
@{
var body = context.Request.Body.AsFormUrlEncodedContent();
body["newKey"].Add("newValue");
return body.ToFormUrlEncodedContent();
}
</set-body>
関連ポリシー
関連するコンテンツ
ポリシーに対する処理の詳細については、次のトピックを参照してください。