Задание текста

ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни Управление API

set-body Используйте политику, чтобы задать текст сообщения для запроса или ответа. Для доступа к тексту сообщения можно использовать свойство context.Request.Body или context.Response.Body в зависимости от того, где находится политика: в разделе inbound или outbound.

Внимание

По умолчанию при доступе к тексту сообщения используется context.Request.Body или context.Response.Bodyисходный текст сообщения теряется и должен быть задан путем возврата текста обратно в выражение. Чтобы сохранить содержимое текста, при доступе к сообщению присвойте параметру preserveContent значение true. Если для параметра preserveContent задано значение true и в выражении возвращается другой текст, используется возвращаемый текст.

Примечание.

Задайте элементы политики и дочерние элементы в порядке, указанном в правиле политики. Узнайте, как устанавливать или изменять политики службы управления API.

Правило политики

<set-body template="liquid" xsi-nil="blank | null" parse-date="true | false">
    new body value as text
</set-body>

Атрибуты

Атрибут Description Обязательное поле По умолчанию.
JSON Используется для изменения режима шаблонов, в котором set-body выполняется политика. В настоящее время поддерживается только одно значение:

- liquidset-body— политика будет использовать модуль ликвидной шаблонной шаблоны.
No Н/П
xsi-nil Используется для управления представлением элементов, помеченных знаком xsi:nil="true", в полезных данных XML. Задайте для одно из следующих значений:

- blank - nil представляется пустой строкой.
- null - nil представляется со значением NULL.

Выражения политики не допускаются.
No blank
parse-date Логическое значение. Указывает, анализируются ли строки формата даты (например, "/Date(1198908717056)/", "2012-03-21T05:40Z") в System.DateTime (mm/dd/yyyy hh:mm:ss). Если задано значение false, значения даты просто копируются.

Выражения политики не допускаются.
No 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.Response.Body и IMessageBody в таблице Переменная контекста.

Использование шаблонов Liquid с набором текста

В политике set-body можно настроить использование языка шаблонов Liquid для преобразования текста запроса или ответа. Это может быть полезным, если нужно полностью изменить формат сообщения.

Внимание

Реализация шаблонов Liquid, используемая в политике set-body, настраивается в режиме C#. Это особенно важно при выполнении действий, таких как фильтрация. Например, если применяется фильтр по дате, то необходимо использовать стиль Pascal и форматирование даты C#, как в следующем примере:

{{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 не работают при использовании в политике возвращаемого ответа. Политика возвращаемого ответа отменяет текущий конвейер выполнения и удаляет текст запроса или ответа. В результате любой шаблон жидкости, используемый внутри возвращаемого ответа, получит пустую строку в качестве входных данных и не будет производить ожидаемые выходные данные.

Поддерживаемые фильтры Liquid

В политике set-body поддерживаются следующие фильтры Liquid. Примеры фильтров см. в документации по Liquid.

Примечание.

Для политики требуется регистр Pascal для имен фильтров Liquid (например, AtLeast вместо at_least).

  • Abs
  • Добавление
  • AtLeast
  • AtMost
  • Capitalize
  • Compact
  • Валюта
  • Дата
  • По умолчанию.
  • DividedBy
  • Нижний регистр
  • ESCAPE
  • First
  • H
  • Присоединиться
  • Last
  • Lstrip
  • Карта
  • Минус
  • Остаток от деления
  • NewlineToBr
  • Плюс
  • Prepend
  • Удалить
  • RemoveFirst
  • Replace
  • ReplaceFirst
  • Round
  • Rstrip
  • Размер
  • Кусочек
  • Сортировать
  • Разделение
  • 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. Пример ответа серверной части содержит свойства корневого уровня, аналогичные API вызовов OpenWeather One.

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

Преобразование JSON в SOAP с помощью шаблона Liquid

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

Преобразование JSON с помощью шаблона Liquid

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

Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.