本文の設定

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

set-body ポリシーを使用して、要求または応答のメッセージ本文を設定します。 メッセージ本文へのアクセスには、ポリシーを inbound セクションと outbound セクションのどちらに記載するかに応じて context.Request.Body プロパティまたは context.Response.Body を使用します。

重要

既定では、context.Request.Body または context.Response.Body を使用してメッセージ本文にアクセスした場合元のメッセージ本文は失われるため、この本文を式で返して設定する必要があります。 本文の内容を保持するには、メッセージへのアクセス時に preserveContent パラメーターを true に設定します。 preserveContenttrue に設定している場合に式から別の本文が返されると、返された本文が使用されます。

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

使用方法

使用上の注意

  • set-body ポリシーを使用して新しい本文はまたは更新した本文を返す場合、新しい本文の内容を明示的に指定しているため、preserveContenttrue に設定する必要はありません。
  • 受信パイプラインには応答が存在しないため、このパイプラインで応答の内容を保持しても意味がありません。
  • 送信パイプラインで要求の内容を保持しても、要求はこの時点で既にバックエンドに送信されているため意味がありません。
  • 受信パイプラインの GET 内など、メッセージ本文がない場合にこのポリシーを使用すると、例外がスローされます。

詳細については、context.Request.Bodyに関する表の context.Request.Bodycontext.Response.BodyIMessageBody の各セクションを参照してください。

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>

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