Задание текста
ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни Управление 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 выполняется политика. В настоящее время поддерживается только одно значение:- liquid set-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
Использование
- Разделы политики: inbound, outbound, backend.
- Области политики: глобальная, рабочая область, продукт, API, операция
- Шлюзы: классическая, версия 2, потребление, локальное размещение, рабочая область
Примечания об использовании
- Если вы используете
set-body
политику для возврата нового или обновленного текста, вам не нужно задать значениеpreserveContent
true
, так как вы явно предоставляете новое содержимое текста. - Сохранение содержимого ответа в входящего конвейера не имеет смысла, так как пока нет ответа.
- Сохранять содержимое запроса в исходящем конвейере не имеет смысла, так как на этом этапе запрос уже был отправлен в серверную часть.
- Если эта политика используется при отсутствии текста сообщения, например в входящего
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>
Связанные политики
Связанный контент
Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.
- Руководство. Преобразование и защита API
- Полный перечень операторов политик и их параметров см. в справочнике по политикам.
- Выражения политики
- Настройка или изменение политик
- Повторное использование конфигураций политик
- Репозиторий фрагментов политик
- Создание политик с помощью Microsoft Copilot в Azure