Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. info
![]()
Что
Правило AssignMessage изменяет или создает новые сообщения запросов и ответов во время выполнения потока прокси-сервера API. Правило позволяет выполнять с такими письмами следующие действия:
- Добавлять в сообщение новые параметры формы, заголовки или параметры запроса.
- Копирование существующих свойств из одного сообщения в другое.
- Удаление заголовков, параметров запросов, параметров форм и/или полезной нагрузки из сообщения.
- Задавать значения существующих свойств в сообщении.
С помощью правила AssignMessage вы обычно добавляете, изменяете или удаляете свойства запроса или ответа. Однако вы также можете использовать правило AssignMessage, чтобы создать специальный запрос или ответ и передать его альтернативной целевой конечной точке, как описано в разделе Создание специальных запросов.
Правило AssignMessage может создавать или изменять сообщения или переменные потока. Используйте это правило, чтобы изменять сообщения запросов перед их отправкой через прокси-сервер в вышестоящие системы или чтобы изменять сообщения ответов перед их передачей в приложения, использующие API.
Элемент <AssignMessage>
Определяет правило AssignMessage.
| Значение по умолчанию | См. вкладку Правила по умолчанию ниже. |
| Обязательно? | Обязательно |
| Тип | Сложный объект |
| Родительский элемент | – |
| Дочерние элементы |
<Add><AssignTo><AssignVariable><Copy><DisplayName><IgnoreUnresolvedVariables><Remove><Set> |
Элемент <AssignMessage> использует следующий синтаксис:
Синтаксис
Элемент <AssignMessage> использует следующий синтаксис:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <!-- All AssignMessage child elements are optional --> <Add> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Add> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> <Template>message_template</Template> or <Template ref='template_variable'></Template> <Value>variable_value</Value> </AssignVariable> <Copy source="[request|response]"> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Path>[false|true]</Path> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> <ReasonPhrase>[false|true]</ReasonPhrase> <StatusCode>[false|true]</StatusCode> <Verb>[false|true]</Verb> <Version>[false|true]</Version> </Copy> <DisplayName>policy_display_name</DisplayName> <IgnoreUnresolvedVariables>[true|false] </IgnoreUnresolvedVariables> <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> <Set> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Path>path</Path> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> <StatusCode>HTTP_status_code or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Правило по умолчанию
В следующем примере показаны настройки по умолчанию, которые используются при добавлении правила AssignMessage в поток в интерфейсе Edge:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <DisplayName>Assign Message-1</DisplayName> <Properties/> <Copy source="request"> <Headers/> <QueryParams/> <FormParams/> <Payload/> <Verb/> <StatusCode/> <ReasonPhrase/> <Path/> </Copy> <Remove> <Headers> <Header name="h1"/> </Headers> <QueryParams> <QueryParam name="q1"/> </QueryParams> <FormParams> <FormParam name="f1"/> </FormParams> <Payload/> </Remove> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <!-- <Verb>GET</Verb> --> <Path/> </Set> <AssignVariable> <Name>name</Name> <Value/> <Ref/> </AssignVariable> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Когда вы вставляете новое правило AssignMessage в интерфейсе Edge, шаблон содержит заглушки для всех возможных операций. Как правило, вы выбираете, какие операции хотите выполнить с этим правилом, и удаляете остальные дочерние элементы. Например, если вы хотите выполнить операцию копирования, используйте элемент <Copy> и удалите из правила элементы <Add>, <Remove> и другие дочерние элементы, чтобы сделать его более понятным.
Этот элемент имеет следующие атрибуты, общие для всех политик:
| Атрибут | По умолчанию | Необходимый? | Описание |
|---|---|---|---|
name | Н/Д | Необходимый | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент |
continueOnError | ЛОЖЬ | Необязательный | Установите значение «false», чтобы возвращать ошибку при сбое политики. Это ожидаемое поведение для большинства политик. Установите значение «true», чтобы выполнение потока продолжалось даже после сбоя политики. |
enabled | истинный | Необязательный | Установите значение «true», чтобы применить политику. Установите значение «false», чтобы «отключить» политику. Политика не будет применяться, даже если она остается присоединенной к потоку. |
async | ЛОЖЬ | Устаревший | Этот атрибут устарел. |
В таблице ниже приведено общее описание дочерних элементов <AssignMessage>.
| Дочерний элемент | Обязательно? | Описание |
|---|---|---|
| Стандартные операции | ||
<Add> |
Необязательно | Добавляет информацию в объект сообщения, указанный элементом <AssignTo>.
|
<Copy> |
Необязательно | Копирует информацию из сообщения, указанного атрибутом source, в объект сообщения, указанный элементом <AssignTo>. |
<Remove> |
Необязательно | Удаляет указанные элементы из переменной сообщения, заданной в элементе <AssignTo>. |
<Set> |
Необязательно | Заменяет значения существующих свойств в запросе или ответе, указанном в элементе <AssignTo>.
|
| Другие дочерние элементы | ||
<AssignTo> |
Необязательно | Указывает, к какому сообщению применяется правило AssignMessage. Это может быть стандартный запрос или ответ, а также новое специальное сообщение. |
<AssignVariable> |
Необязательно | Присваивает значение переменной потока. Если переменной нет, <AssignVariable> создаст ее. |
<IgnoreUnresolvedVariables> |
Необязательно | Определяет, прекращается ли обработка при обнаружении неразрешенной переменной. |
Каждый из этих дочерних элементов описан в следующих разделах.
Примеры
В следующих примерах показаны некоторые способы использования правила AssignMessage:
1. Добавьте заголовок
В следующем примере в запрос добавляется заголовок с элементом <Add>:
<AssignMessage name="AM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage>2. Удалите полезную нагрузку
В следующем примере полезная нагрузка удаляется из ответа с помощью элемента <Remove>:
<AssignMessage name="AM-remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo>response</AssignTo> </AssignMessage>
3. Изменить ответ
В следующем примере показано, как изменить существующий объект ответа, добавив в него заголовок:
<AssignMessage name="AM-modify-response">
<Set>
<Headers>
<Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
</Headers>
</Set>
<IgnoreUnresolvedVariables>false
</IgnoreUnresolvedVariables>
<AssignTo>response</AssignTo>
</AssignMessage>В этом примере новое сообщение не создается. Вместо этого он изменяет существующее сообщение ответа, добавляя HTTP-заголовок.
Поскольку в этом примере в качестве имени переменной в элементе <AssignTo> указано response, это правило изменяет объект ответа, который изначально был задан с данными, возвращенными целевым сервером.
HTTP-заголовок, добавленный в ответное сообщение этим правилом, получен из переменной, заполненной правилом LookupCache. Поэтому ответ, измененный этим правилом, содержит HTTP-заголовок, который указывает, были ли результаты получены из кеша. Заголовки в ответе могут быть полезны для отладки и устранения неполадок.
4. Настройте динамический контент
Вы можете использовать Assign Message, чтобы встроить динамический контент в полезную нагрузку сообщений ответа и запроса.
Чтобы встроить переменные потока Edge в полезную нагрузку XML, заключите назначенную переменную в фигурные скобки, например {prefix.name}.
В следующем примере значение переменной потока заголовка HTTP user-agent встраивается в элемент XML с названием User-agent:
<AssignMessage name="AM-set-dynamic-content"> <AssignTo>response</AssignTo> <Set> <Payload contentType="text/xml"> <User-agent>{request.header.user-agent}</User-agent> </Payload> </Set> <IgnoreUnresolvedVariables>false </IgnoreUnresolvedVariables> </AssignMessage>
В полезную нагрузку JSON можно вставлять переменные, используя атрибуты variablePrefix и variableSuffix с символами-разделителями, как показано в примере ниже.
<AssignMessage name="set-payload"> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> { "user-agent": "@request.header.user-agent#" } </Payload> </AssignMessage>
Полный список переменных потока приведен в справочнике по переменным потока.
Начиная с версии 16.08.17, для вставки переменных можно также использовать фигурные скобки.
5. Удалите параметр запроса
В примере ниже из запроса удаляется параметр apikey:
<AssignMessage name="AM-remove-query-param">
<Remove>
<QueryParams>
<QueryParam name="apikey"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>При использовании правила VerifyAPIKey для аутентификации пользователей рекомендуется удалять параметр запроса apikey из сообщения запроса. Это делается для того, чтобы конфиденциальная информация о ключе не передавалась целевому серверу.
6. Настройка и получение переменных
В следующем примере используются три правила Assign Message:
- Создает в запросе три переменные потока со статическими значениями.
- Динамически получает переменные потока во второй политике в потоке запросов.
- Задает их в полезной нагрузке ответа.
<!-- Policy #1: Set variables in the request --> <AssignMessage name="AM-set-variables"> <!-- Create a variable named myAppSecret --> <AssignVariable> <Name>myAppSecret</Name> <Value>42</Value> </AssignVariable> <!-- Create a variable named config.environment --> <AssignVariable> <Name>config.environment</Name> <Value>test</Value> </AssignVariable> <!-- Create a variable named config.protocol --> <AssignVariable> <Name>config.protocol</Name> <Value>gopher</Value> </AssignVariable> </AssignMessage>
В первом правиле элемент <AssignVariable> создает и задает три переменные в запросе. Каждый элемент <Name> указывает название переменной, а <Value> – ее значение.
Второе правило использует элемент <AssignVariable>, чтобы считать значения и создать три новые переменные:
<!-- Policy #2: Get variables from the request --> <AssignMessage continueOnError="false" enabled="true" name="get-variables"> <AssignTo createNew="false" transport="http" type="request"/> <!-- Get the value of myAppSecret and create a new variable, secret --> <AssignVariable> <Name>secret</Name> <Ref>myAppSecret</Ref> <Value>0</Value> </AssignVariable> <!-- Get the value of config.environment and create a new variable, environment --> <AssignVariable> <Name>environment</Name> <Ref>config.environment</Ref> <Value>default</Value> </AssignVariable> <!-- Get the value of config.protocol and create a new variable, protocol --> <AssignVariable> <Name>protocol</Name> <Ref>config.protocol</Ref> <Value>default</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Во втором правиле элемент <Ref> ссылается на исходную переменную, а элементы <Name> указывают названия новых переменных. Если переменная, на которую ссылается элемент <Ref>, недоступна, можно использовать значение, указанное в элементе <Value>.
Чтобы протестировать этот набор правил:
- Добавьте правила 1 и 2 в поток запросов. Правило 1 должно быть выше правила 2.
- Добавьте третье правило в поток response.
- Третье правило использует элемент
<Set>, чтобы добавить переменные в ответ. В следующем примере создается полезная нагрузка XML в ответе, который Edge возвращает клиенту:<!-- Policy #3: Add variables to the response --> <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload"> <DisplayName>put-em-in-the-payload</DisplayName> <Set> <Payload contentType="application/xml"> <wrapper> <secret>{secret}</secret> <config> <environment>{environment}</environment> <protocol>{protocol}</protocol> </config> </wrapper> </Payload> </Set> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Обратите внимание, что для доступа к переменным потока в
<Set>их нужно заключить в фигурные скобки.Убедитесь, что для атрибута
contentTypeэлемента<Payload>задано значение application/xml. - Отправьте запрос к прокси-серверу API, например:
curl -vL https://ahamilton-eval-test.apigee.net/myproxy
При желании вы можете передать результаты в утилиту, например
xmllint, чтобы XML-код отображался в удобном формате:curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -
Тело ответа должно выглядеть следующим образом:
<wrapper> <secret>42</secret> <config> <environment>test</environment> <protocol>gopher</protocol> </config> </wrapper>
7. Получение заголовков ответа Service Callout
В примере ниже в запросе прокси-сервера API используется правило ServiceCallout, а ответ вызова содержит несколько заголовков с одинаковым названием (Set-Cookie). Если переменная ответа вызова сервиса имеет значение по умолчанию calloutResponse, то следующее правило получает второе значение заголовка Set-Cookie.
<AssignMessage name="AM-Payload-from-SC-header"> <Set> <Payload contentType="application/json"> {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"} </Payload> </Set> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
Чтобы получить список всех значений заголовка, используйте следующую переменную:
{calloutResponse.header.Set-Cookie.values}Для каждого дочернего элемента в этом справочнике приведены дополнительные примеры. Дополнительные примеры можно найти в примере AssignMessage на GitHub.
Ссылка на дочерний элемент
В этом разделе описываются дочерние элементы <AssignMessage>.
<Add>
Добавляет в запрос или ответ информацию, указанную в элементе <AssignTo>.
Элемент <Add> добавляет в письмо новые свойства, которых не было в исходном письме. Чтобы изменить значения существующих свойств, используйте элемент <Set>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Сложный тип |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы |
<FormParams><Headers><QueryParams> |
Элемент <Add> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Add>
<FormParams>
<FormParam name="formparam_name">formparam_value</FormParam>
...
</FormParams>
<Headers>
<Header name="header_name">header_value</Header>
...
</Headers>
<QueryParams>
<QueryParam name="queryparam_name">queryparam_value</QueryParam>
...
</QueryParams>
</Add>
</AssignMessage>Пример 1
В следующем примере элемент <FormParams> используется для получения значений трех параметров строки запроса из исходного запроса и их установки в качестве параметров формы в запросе целевой конечной точки:
<AssignMessage name="AM-add-formparams-3">
<Add>
<FormParams>
<FormParam name="username">{request.queryparam.name}</FormParam>
<FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
<FormParam name="default_language">{request.queryparam.lang}</FormParam>
</FormParams>
</Add>
<Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В следующем примере элемент <Headers> используется для добавления заголовка partner-id в запрос, который будет отправлен целевой конечной точке:
<AssignMessage name="AM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 3
В следующем примере элемент <QueryParams> используется для добавления в запрос одного параметра запроса со статическим значением:
<AssignMessage name="AM-add-queryparams-1">
<Add>
<QueryParams>
<QueryParam name="myParam">42</QueryParam>
</QueryParams>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage>В этом примере используется <Add> в предварительном потоке запроса. Если вы посмотрите на результаты в таком инструменте, как Trace tool, то увидите, что запрос к https://example-target.com/get превращается в https://example-target.com/get?myParam=42.
Дочерние элементы <Add> поддерживают динамическую замену строк, которая называется шаблонами сообщений.
<FormParams> (дочерний элемент <Add>)
Добавляет новые параметры формы в сообщение запроса. Этот элемент не влияет на ответное сообщение.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <FormParam> |
| Родительский элемент |
<Add>
|
| Дочерние элементы |
<FormParam> |
Элемент <FormParams> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Add> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> </Add> </AssignMessage>
Пример 1
В следующем примере в запрос добавляется один параметр формы ("answer") и статическое значение ("42"):
<AssignMessage name="AM-add-formparams-1">
<Add>
<FormParams>
<FormParam name="answer">42</FormParam>
</FormParams>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В следующем примере показано, как получить значение параметра запроса name, добавить его в запрос в качестве параметра формы, а затем удалить параметр запроса:
<AssignMessage name="AM-Swap-QueryParam-to-FormParams">
<Add>
<FormParam name="name">{request.queryparam.name}</FormParam>
</Add>
<Remove>
<QueryParam name="name"/>
</Remove>
</AssignMessage>Обратите внимание, что в этом примере не указана цель с помощью <AssignTo>. Это правило только добавляет параметр в запрос.
Пример 3
В примере ниже в запрос добавляется несколько параметров формы:
<AssignMessage name="AM-add-formparams-3">
<Add>
<FormParams>
<FormParam name="username">{request.queryparam.name}</FormParam>
<FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
<FormParam name="default_language">{request.queryparam.lang}</FormParam>
</FormParams>
</Add>
<Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>В этом примере параметры строки запроса извлекаются из исходного запроса и добавляются в качестве параметров формы с другими названиями. Затем он удаляет исходные параметры запроса. Apigee отправит измененный запрос в целевую конечную точку.
Для просмотра потока можно использовать инструмент Trace. Вы увидите, что тело запроса содержит данные формы в URL-кодировке, которые изначально были переданы в качестве параметров строки запроса:
username=nick&zip_code=90210&default_language=en
Вы можете использовать <FormParams>, только если выполняются следующие условия:
- HTTP-метод: POST
- Тип сообщения: запрос
- Один или оба из следующих вариантов:
- Данные формы: задайте значение или оставьте поле пустым. Например, если выбрана подсказка
curl, то в запросе должно быть такое сочетание символов:-d "". - Заголовок
Content-Length: установите значение 0 (если в исходном запросе нет данных; в противном случае укажите текущую длину в байтах). Например, если вы используетеcurl, добавьте в запрос-H "Content-Length: 0".
- Данные формы: задайте значение или оставьте поле пустым. Например, если выбрана подсказка
Пример:
curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded" https://ahamilton-eval-test.apigee.net/am-test
При добавлении <FormParams> Edge устанавливает для заголовка Content-Type запроса значение application/x-www-form-urlencoded перед отправкой сообщения в целевой сервис.
<Headers> (дочерний элемент <Add>)
Добавляет новые заголовки в указанный запрос или ответ, который задается элементом <AssignTo>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <Header> |
| Родительский элемент |
<Add>
|
| Дочерние элементы |
<Header> |
Элемент <Headers> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Add>
<Headers>
<Header name="header_name">header_value</Header>
...
</Headers>
</Add>
</AssignMessage>Пример 1
В следующем примере в сообщение запроса добавляется заголовок partner-id, которому присваивается значение переменной потока verifyapikey.VAK-1.developer.app.partner-id.
<AssignMessage name="AM-add-headers-1">
<Add>
<Headers>
<Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
</Headers>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage><QueryParams> (дочерний элемент <Add>)
Добавляет в запрос новые параметры. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <QueryParam> |
| Родительский элемент |
<Add>
|
| Дочерние элементы |
<QueryParam> |
Элемент <QueryParams> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Add>
<QueryParams>
<QueryParam name="queryparam_name">queryparam_value</QueryParam>
...
</QueryParams>
</Add>
</AssignMessage>Пример 1
В следующем примере в запрос добавляется параметр запроса "myParam" со значением "42":
<AssignMessage name="AM-add-queryparams-1">
<Add>
<QueryParams>
<QueryParam name="myParam">42</QueryParam>
</QueryParams>
</Add>
<AssignTo>request</AssignTo>
</AssignMessage>Вы можете использовать <QueryParams>, только если выполняются следующие условия:
- HTTP-метод: GET
- Тип сообщения: запрос
Кроме того, параметры запроса можно задавать, только если атрибут type элемента <AssignTo> является сообщением запроса. Если задать их в ответе, это ни на что не повлияет.
Если вы определите пустой массив параметров запроса в правиле (<Add><QueryParams/></Add>), правило не добавит никаких параметров запроса. Это то же самое, что не указывать <QueryParams>.
<AssignTo>
Определяет, с каким объектом работает правило AssignMessage. Доступны следующие варианты:
- Сообщение запроса.
request, полученный прокси-сервером API. - Ответное сообщение.
response, возвращенный целевым сервером. - Специальное сообщение. Специальный объект запроса или ответа.
Обратите внимание, что в некоторых случаях вы не можете изменить объект, на который действует правило AssignMessage.
Например, вы не можете использовать <Add> или <Set>, чтобы добавить или изменить параметры запроса (<QueryParams>) или формы (<FormParams>) в ответе. В запросе можно изменять только параметры запроса и формы.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы | Нет |
Если вы не укажете <AssignTo> или укажете элемент <AssignTo>, но не укажете для него текстовое значение, правило будет действовать на запрос или ответ по умолчанию, в зависимости от того, где выполняется правило. Если правило выполняется в потоке запросов, оно влияет на сообщение запроса. Если правило выполняется в потоке ответа, оно по умолчанию влияет на ответ.
Элемент <AssignTo> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> </AssignMessage>
Пример 1
В следующем примере указывается, что целью является исходный запрос, который будет отправлен в целевую конечную точку:
<AssignMessage name="assignto-1"> <!-- DO NOT do this --> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Пример 2
В следующем примере создается новый объект запроса:
<AssignMessage name="AM-assignto-2"> <AssignTo createNew="true" transport="http" type="request">NameOfNewMessage</AssignTo> </AssignMessage>
Когда вы создаете новый объект запроса или ответа, другие элементы правила AssignMessage (такие как <Add>, <Set> и <Copy>) воздействуют на этот новый объект запроса.
Вы можете получить доступ к новому объекту запроса в других правилах позже в потоке или отправить новый объект запроса во внешний сервис с помощью правила ServiceCallout.
Пример 3
В примере ниже создается объект запроса с названием MyRequestObject:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> </AssignMessage>
Когда вы создаете новый объект запроса или ответа, другие элементы правила AssignMessage (такие как <Add>, <Set> и <Copy>) воздействуют на этот новый объект запроса.
Вы можете получить доступ к новому объекту запроса в других правилах позже в потоке или отправить новый объект запроса во внешний сервис с помощью правила ServiceCallout.
В таблице ниже описаны атрибуты <AssignTo>.
| Атрибут | Описание | Обязательно? | Тип |
|---|---|---|---|
createNew |
Определяет, создается ли новое сообщение при назначении значений. Если задано значение true, правило создает новую переменную типа, указанного в Если значение false, то политика реагирует одним из двух способов:
Если правило
|
Необязательно | Логическое значение |
transport |
Указывает тип транспорта для типа сообщения запроса или ответа. Значение по умолчанию – http (единственное допустимое значение). |
Необязательно | Строка |
type |
Указывает тип нового сообщения, если createNew имеет значение true. Допустимые значения: request или response.
Если вы опустите этот атрибут, Edge создаст запрос или ответ в зависимости от того, где в потоке выполняется это правило. |
Необязательно | Строка |
<AssignVariable>
Присваивает значение переменной потока. Если переменная потока не существует, <AssignVariable> создает ее.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Сложный тип |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы |
<Name> (обязательно)<Ref><Template><Value> |
Значение, которое вы присваиваете переменной потока, может быть одним из следующих:
- Строковый литерал. Используйте дочерний элемент
<Value>, чтобы указать значение строкового литерала для переменной потока. - Переменная потока. Используйте дочерний элемент
<Ref>, чтобы указать значение существующей переменной потока для целевой переменной потока. Полный список переменных потока, которые можно использовать в качестве источника, приведен в справочнике по переменным потока. - Шаблон сообщения. Используйте дочерний элемент
<Template>, чтобы указать шаблон сообщения для интерполяции и получить значение, которое будет помещено в переменную целевого потока.
Элемент <AssignVariable> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> <Template>message_template</Template> or <Template ref='template_variable'></Template> <Value>variable_value</Value> </AssignVariable> </AssignMessage>
Используйте элемент <Ref>, чтобы указать исходную переменную. Если переменная, на которую ссылается <Ref>, недоступна, Edge использует значение, указанное элементом <Value>. Если вы зададите элемент <Template>, он будет иметь приоритет над другими дочерними элементами.
Пример 1
В следующем примере значение новой переменной myvar задается как литеральное значение "42":
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Пример 2
В следующем примере значение переменной потока request.header.user-agent присваивается целевой переменной потока myvar, а значение параметра запроса country – целевой переменной потока Country:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Если одно из назначений не удается, Edge присваивает переменной целевого потока значение ErrorOnCopy.
Если переменные потока myvar или Country не существуют, <AssignVariable> создает их.
Пример 3
В следующем примере дочерний элемент <Template> используется для объединения двух контекстных переменных с помощью дефиса:
<AssignMessage name='AV-via-template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Обычно <AssignVariable> используется для установки значения по умолчанию для параметра запроса, заголовка или другого значения, которое может быть передано вместе с запросом. Для этого используются дочерние элементы <Ref> и <Value>. Дополнительную информацию вы найдете в примерах для <Ref>.
<Name> (дочерний элемент <AssignVariable>)
Указывает название переменной целевого потока (например, переменной, значение которой задается правилом AssignMessage). Если переменной с именем, указанным в <AssignVariable>, не существует, правило создаст ее.
| Значение по умолчанию | – |
| Обязательно? | Обязательно |
| Тип | Строка |
| Родительский элемент |
<AssignVariable>
|
| Дочерние элементы | Нет |
Элемент <Name> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> </AssignVariable> </AssignMessage>
Пример 1
В следующем примере в качестве целевой переменной указана myvar, а в качестве ее значения – литеральное значение "42":
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Если myvar не существует, <AssignVariable> создаст его.
<Ref> (дочерний элемент <AssignVariable>)
Указывает источник назначения в качестве переменной потока. Переменная потока может быть одной из стандартных переменных потока (перечисленных в справочнике по переменным потока) или созданной вами пользовательской переменной потока.
Значение <Ref> всегда интерпретируется как переменная потока. Вы не можете указать в качестве значения строковый литерал. Чтобы назначить строковое значение, используйте элемент <Value>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<AssignVariable>
|
| Дочерние элементы | Нет |
При указании переменной потока с помощью <Ref> опустите фигурные скобки {}, которые обычно используются для ссылки на переменную потока. Например, чтобы присвоить новой переменной значение переменной потока client.host, выполните следующие действия:
Do this (no brackets): <Ref>client.host</Ref> Do NOT do this (brackets): <Ref>{client.host}</Ref>
Чтобы задать значение по умолчанию для переменной целевого потока, используйте <Value> в сочетании с <Ref>. Если переменная потока, указанная в <Ref>, не существует, не может быть прочитана или имеет значение null, Edge присваивает целевой переменной потока значение <Value>.
Элемент <Ref> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> </AssignVariable> </AssignMessage>
Пример 1
В следующем примере значение переменной потока request.header.user-agent присваивается переменной целевого потока myvar, а значение параметра запроса country – переменной Country:
<AssignMessage name="assignvariable-4"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> </AssignMessage>
В этом примере для Edge не указано значение по умолчанию (или резервное значение) ни для одного из назначений.
Пример 2
В следующем примере значение переменной потока request.header.user-agent присваивается переменной целевого потока myvar, а значение параметра запроса country – переменной Country:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
В этом примере, если значения переменной потока request.header.user-agent или параметра запроса Country равны null, нечитаемы или имеют неправильный формат, Edge присваивает новым переменным значение ErrorOnCopy.
Пример 3
Чаще всего <AssignVariable> используется для того, чтобы задать значение по умолчанию для параметра запроса, заголовка или другого значения, которое может быть передано вместе с запросом. Например, вы создаете прокси-сервер API погоды, в котором запрос принимает один параметр запроса с именем "w". Этот параметр содержит идентификатор города, для которого вы хотите получить прогноз погоды. URL запроса имеет следующий вид:
http://myCO.com/v1/weather/forecastrss?w=city_ID
Чтобы задать значение по умолчанию для переменной w, создайте правило AssignMessage, как показано ниже.
<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3"> <AssignTo createNew="false" transport="http" type="request"/> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> <AssignVariable> <Name>request.queryparam.w</Name> <Ref>request.queryparam.w</Ref> <Value>12797282</Value> </AssignVariable> </AssignMessage>
В этом примере <AssignVariable> получает значение request.queryparam.w и присваивает его себе. Если переменная потока имеет значение null, то есть параметр запроса w был опущен, то в этом примере используется значение по умолчанию из элемента <Value>. Поэтому вы можете отправить запрос к этому прокси-серверу API, опустив параметр запроса "w":
http://myCO.com/v1/weather/forecastrss
…и при этом прокси-сервер API возвращает действительный результат.
В отличие от <Value>, значением <Ref> должна быть переменная потока, например свойство объекта request, response или target. Значением также может быть созданная вами переменная пользовательского потока.
Если вы укажете переменную потока, которая не существует для значения <Ref>, а значение <IgnoreUnresolvedVariables> – true, Edge выдаст ошибку.
<Template> (дочерний элемент <AssignVariable>)
Указывает шаблон сообщения. Шаблон сообщения позволяет выполнять подстановку переменных строк при выполнении правила и может объединять литеральные строки с именами переменных, заключенными в фигурные скобки. Кроме того, шаблоны сообщений поддерживают функции, такие как экранирование и преобразование регистра.
Используйте атрибут ref, чтобы указать переменную потока, значение которой является шаблоном сообщения. Например, вы можете сохранить шаблон сообщения как настраиваемый атрибут в приложении разработчика. Когда Edge идентифицирует приложение разработчика после проверки ключа API или токена безопасности (с помощью дополнительного правила), элемент <AssignVariable> может использовать шаблон сообщения из настраиваемого атрибута приложения, который доступен как переменная потока из правила безопасности.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<AssignVariable>
|
| Дочерние элементы | Нет |
Элемент <Template> использует следующий синтаксис:
Синтаксис: .
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Template>message_template</Template> or <Template ref='template_variable'></Template> </AssignVariable> </AssignMessage>
Пример 1
В следующем примере используется синтаксис шаблонов сообщений для объединения двух контекстных переменных с литеральной строкой (дефисом) между ними:
<AssignMessage name='AV-via-template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Пример 2
В следующем примере указана переменная потока, значением которой является предварительно заданный шаблон сообщения. Используйте этот вариант, если вы хотите внедрить предопределенный шаблон во время выполнения без изменения правила:
<AssignMessage name='AV-via-template-indirectly'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template ref='my_template_variable'/> </AssignVariable> </AssignMessage>
Пример 3
В следующем примере указаны переменная потока и текстовое значение. В этом случае, если значение переменной не равно null, оно используется в качестве шаблона. Если значение, на которое указывает ссылка, равно null, то в качестве шаблона используется текстовое значение (в данном случае {system.uuid}-{messageid}). Этот шаблон полезен, когда нужно переопределить значение, то есть в некоторых случаях заменить шаблон по умолчанию (текстовую часть) динамически заданными значениями. Например, условный оператор может получить значение из пары "ключ-значение" и присвоить его переменной, на которую указывает ссылка:
<AssignMessage name='AV-template-with-fallback'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template ref='my_variable'>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
<Value> (дочерний элемент <AssignVariable>)
Определяет значение переменной целевого потока, заданной с помощью <AssignVariable>. Значение всегда интерпретируется как строковый литерал. Вы не можете использовать переменную потока в качестве значения, даже если заключите ее в фигурные скобки ({}). Чтобы использовать переменную потока, укажите <Ref>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<AssignVariable>
|
| Дочерние элементы | Нет |
При использовании в сочетании с элементом <Ref> элемент <Value> действует как значение по умолчанию (или резервное значение). Если значение <Ref> не указано, не может быть определено или равно null, используется значение <Value>.
Элемент <Value> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Value>variable_value</Value> </AssignVariable> </AssignMessage>
Пример 1
В следующем примере переменной потока назначения myvar присваивается литеральное значение "42":
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Пример 2
В следующем примере значение переменной потока request.header.user-agent присваивается переменной потока myvar, а значение параметра запроса country – переменной Country:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Если одно из назначений не удается, <AssignVariable> присваивает переменной целевого потока значение ErrorOnCopy.
<Copy>
Копирует значения из сообщения, указанного в атрибуте source, в сообщение, указанное в элементе <AssignTo>. Если вы не укажете цель с помощью <AssignTo>, то это правило скопирует значения в запрос или ответ в зависимости от того, где в потоке оно выполняется.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы |
<FormParams><Headers><Path><Payload><QueryParams><ReasonPhrase><StatusCode><Verb><Version> |
Если вы не укажете дочерние элементы в элементе <Copy>, будут скопированы все части указанного исходного сообщения.
Элемент <Copy> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<!-- Can also be an empty array (<FormParams/>) -->
<FormParams>
<FormParam name="formparam_name">formparam_value</FormParam>
...
</FormParams>
<!-- Can also be an empty array (<Headers/>) -->
<Headers>
<Header name="header_name">header_value</Header>
...
</Headers>
<Path>[false|true]</Path>
<Payload>[false|true]</Payload>
<!-- Can also be an empty array (<QueryParams/>) -->
<QueryParams>
<QueryParam name="queryparam_name">queryparam_value</QueryParam>
...
</QueryParams>
<ReasonPhrase>[false|true]</ReasonPhrase>
<StatusCode>[false|true]</StatusCode>
<Verb>[false|true]</Verb>
<Version>[false|true]</Version>
</Copy>
<!-- Used as the destination for the <Copy> values -->
<AssignTo createNew="[true|false]" transport="http"
type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>
Пример 1
В следующем примере копируется заголовок, три параметра формы, путь и все параметры запроса из сообщения request в новый пользовательский запрос с именем newRequest:
<AssignMessage name="AM-copy-1"> <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo> <Copy source="request"> <Headers> <Header name="Header_Name_1"/> </Headers> <FormParams> <FormParam name="Form_Param_Name_1"/> <FormParam name="Form_Param_Name_2"/> <FormParam name="Form_Param_Name_3"/> </FormParams> <Path>true</Path> <QueryParams/> </Copy> </AssignMessage>
Поскольку элементы <Payload> и <Verb> отсутствуют, правило не копирует эти части сообщения.
Пример 2
В примере ниже сначала удаляется все содержимое существующего сообщения response, а затем
в него копируются все значения из другого сообщения – secondResponse
response.
<AssignMessage name='AM-Copy-Response'> <AssignTo createNew="false" transport="http" type="response">response</AssignTo> <!-- first remove any existing values --> <Remove/> <!-- then copy everything from the designated message --> <Copy source="secondResponse"/> </AssignMessage>
У элемента <Copy> есть один атрибут:
| Атрибут | Описание | Обязательно? | Тип |
|---|---|---|---|
| source |
Указывает исходный объект копии.
|
Необязательно | Строка |
<FormParams> (дочерний элемент <Copy>)
Копирует параметры формы из запроса, указанного в атрибуте source элемента <Copy>, в запрос, указанный в элементе <AssignTo>. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <FormParam> или пустой массив. |
| Родительский элемент |
<Copy>
|
| Дочерние элементы |
<FormParam> |
Элемент <FormParams> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> </Copy> </AssignMessage>
Пример 1
В следующем примере один параметр формы копируется из запроса в специальный запрос MyCustomRequest:
<AssignMessage name="copy-formparams-1"> <Copy source="request"> <FormParams> <FormParam name="paramName">Form param value 1</FormParam> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 2
В примере ниже все параметры формы копируются в специальный запрос MyCustomRequest:
<AssignMessage name="copy-formparams-2"> <Copy source="request"> <FormParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 3
В следующем примере три параметра формы копируются в специальный запрос MyCustomRequest:
<AssignMessage name="copy-formparams-3"> <Copy source="request"> <FormParams> <FormParam name="paramName1"/> <FormParam name="paramName2"/> <FormParam name="paramName3"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример: .
Если у нескольких параметров формы одинаковое название, используйте следующий синтаксис:
<AssignMessage name="copy-formparams-4"> <Copy source="request"> <FormParams> <FormParam name="f1"/> <FormParam name="f2"/> <FormParam name="f3.2"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
В этом примере копируются f1, f2 и второе значение f3. Если у f3 только одно значение, оно не копируется.
Вы можете использовать <FormParams>, только если выполняются следующие условия:
- HTTP-метод: POST
- Тип сообщения: ответ
- Один или оба из следующих вариантов:
- Данные формы: задайте значение или оставьте поле пустым. Например, если выбрана подсказка
curl, то в запросе должно быть такое сочетание символов:-d "". - Заголовок
Content-Length. Установите значение 0 (если в исходном запросе нет данных; в противном случае укажите текущую длину). Например, если вы используетеcurl, добавьте в запрос-H "Content-Length: 0".
- Данные формы: задайте значение или оставьте поле пустым. Например, если выбрана подсказка
При копировании <FormParams> <Copy> задает для Content-Type сообщения значение application/x-www-form-urlencoded, а затем отправляет сообщение в целевой сервис.
<Headers> (дочерний элемент <Copy>)
Копирует HTTP-заголовки из сообщения запроса или ответа, указанного атрибутом source элемента <Copy>, в сообщение запроса или ответа, указанное элементом <AssignTo>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <Header> или пустой массив. |
| Родительский элемент |
<Copy>
|
| Дочерние элементы |
<Header> |
Элемент <Headers> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Copy> </AssignMessage>
Пример 1
В следующем примере заголовок user-agent копируется из запроса в новый объект пользовательского запроса:
<AssignMessage name="copy-headers-1"> <Copy source="request"> <Headers> <Header name="user-agent"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 2:
Чтобы скопировать все заголовки, используйте пустой элемент <Headers>, как показано в примере ниже.
<AssignMessage name="copy-headers-2"> <Copy source="request"> <Headers/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 3
Если есть несколько заголовков с одинаковым названием, используйте следующий синтаксис:
<AssignMessage name="copy-headers-3"> <Copy source="request"> <Headers> <Header name="h1"/> <Header name="h2"/> <Header name="h3.2"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
В этом примере копируются значения h1, h2 и второе значение h3. Если у h3 только одно значение, оно не копируется.
<Path> (дочерний элемент <Copy>)
Определяет, нужно ли копировать путь из исходного запроса в целевой. Этот элемент не влияет на ответ.
Если задано значение true, это правило копирует путь из сообщения запроса, указанного атрибутом source элемента <Copy>, в сообщение запроса, указанное элементом <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <Path> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<Path>[false|true]</Path>
</Copy>
</AssignMessage>Пример 1
В следующем примере показано, как правило AssignMessage копирует путь из исходного запроса в новый объект запроса:
<AssignMessage name="copy-path-1"> <Copy source="request"> <Path>true</Path> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Вы можете использовать <Path>, только если выполняются следующие условия:
- Тип сообщения: запрос
<Payload> (дочерний элемент <Copy>)
Определяет, нужно ли копировать полезную нагрузку из источника в целевой объект. Источником и назначением могут быть запросы или ответы.
Если задано значение true, это правило копирует полезную нагрузку из сообщения, указанного в атрибуте source элемента <Copy>, в сообщение, указанное в элементе <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <Payload> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <Payload>[false|true]</Payload> </Copy> </AssignMessage>
Пример 1
В следующем примере для <Payload> задано значение true, чтобы полезная нагрузка запроса копировалась из запроса в ответ:
<AssignMessage name="AM-copy-payload-1"> <Copy source="request"> <Payload>true</Payload> </Copy> <AssignTo>response</AssignTo> </AssignMessage>
<QueryParams> (дочерний элемент <Copy>)
Копирует параметры строки запроса из запроса, указанного атрибутом source элемента <Copy>, в запрос, указанный элементом <AssignTo>. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <QueryParam> или пустой массив. |
| Родительский элемент |
<QueryParam>
|
| Дочерние элементы | Нет |
Элемент <QueryParams> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Copy> </AssignMessage>
Пример 1
В следующем примере параметр запроса my_param копируется из запроса в новый объект специального запроса:
<AssignMessage name="copy-queryparams-1"> <Copy source="request"> <QueryParams> <QueryParam name="my_param"/> </QueryParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 2
В следующем примере все параметры запроса копируются из запроса в новый объект специального запроса:
<AssignMessage name="copy-queryparams-2"> <Copy source="request"> <QueryParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Пример 3
Если у вас несколько параметров запроса с одинаковым названием, используйте следующий синтаксис:
<AssignMessage name="copy-queryparams-3"> <Copy source="request"> <QueryParams> <QueryParam name="qp1"/> <QueryParam name="qp2"/> <QueryParam name="qp3.2"/> </QueryParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
В этом примере копируются параметры qp1, qp2 и второе значение параметра qp3. Если у qp3 только одно значение, оно не копируется.
Вы можете использовать <QueryParams>, только если выполняются следующие условия:
- HTTP-метод: GET
- Тип сообщения: запрос
<ReasonPhrase> (дочерний элемент <Copy>)
Определяет, нужно ли копировать фразу с причиной из исходного ответа в целевой. Этот элемент не влияет на запрос.
Если задано значение True, это правило копирует ReasonPhrase из ответа, указанного атрибутом source элемента <Copy>, в ответ, указанный элементом <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <ReasonPhrase> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<ReasonPhrase>[false|true]</ReasonPhrase>
</Copy>
</AssignMessage>Пример 1
В приведенном ниже примере для параметра <ReasonPhrase> устанавливается значение true. При указанных источнике и элементе <AssignTo> <Copy> копирует пояснение из указанного ответного сообщения в объект response:
<AssignMessage name="AM-copy-reasonphrase-1">
<Copy source="serviceCalloutResponse">
<ReasonPhrase>true</ReasonPhrase>
</Copy>
<AssignTo>response</AssignTo>
</AssignMessage>Вы можете использовать <ReasonPhrase>, только если исходное и целевое сообщения имеют тип Response.
<StatusCode> (дочерний элемент <Copy>)
Определяет, копируется ли код статуса из исходного ответа в целевой. Этот элемент не влияет на запрос.
Если задано значение true, это правило копирует код статуса из сообщения ответа, указанного атрибутом source элемента <Copy>, в сообщение ответа, указанное элементом <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <StatusCode> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<StatusCode>[false|true]</StatusCode>
</Copy>
</AssignMessage>Пример 1
В следующем примере для параметра <StatusCode> задано значение true, что позволяет скопировать код статуса из объекта ответа по умолчанию в новый объект ответа:
<AssignMessage name="copy-statuscode-1"> <Copy source="response"> <StatusCode>true</StatusCode> </Copy> <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo> </AssignMessage>
Вы можете использовать <StatusCode>, только если исходное и целевое сообщения имеют тип Response.
Часто <StatusCode> используется для того, чтобы задать для кода статуса ответа прокси-сервера значение, отличное от полученного от целевого сервера.
<Verb> (дочерний элемент <Copy>)
Определяет, копируется ли HTTP-глагол из исходного запроса в целевой. Этот элемент не влияет на ответ.
Если задано значение true, копирует глагол, найденный в атрибуте source элемента <Copy>, в запрос, указанный в элементе <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <Verb> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<Verb>[false|true]</Verb>
</Copy>
</AssignMessage>Пример 1
В примере ниже для параметра <Verb> задано значение true, поэтому глагол из запроса по умолчанию копируется в новый специальный запрос.
<AssignMessage name="copy-verb-1"> <Copy source="request"> <Verb>true</Verb> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Вы можете использовать <Verb>, только если выполняются следующие условия:
- Тип сообщения: запрос
<Version> (дочерний элемент <Copy>)
Определяет, копируется ли версия HTTP из исходного запроса в целевой. Этот элемент не влияет на ответ.
Если задано значение true, копирует версию HTTP, найденную в атрибуте source элемента <Copy>, в объект, указанный элементом <AssignTo>.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Copy>
|
| Дочерние элементы | Нет |
Элемент <Version> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<Version>[false|true]</Version>
</Copy>
</AssignMessage>Пример 1
В следующем примере для параметра <Version> в запросе задано значение true, что позволяет скопировать версию из объекта запроса по умолчанию в новый объект пользовательского запроса:
<AssignMessage name="copy-version-1"> <Copy source="request"> <Version>true</Version> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Вы можете использовать <Version>, только если выполняются следующие условия:
- Тип сообщения: запрос
<DisplayName>
Используйте вместе с атрибутом name, чтобы присвоить правилу в редакторе прокси-серверов в интерфейсе управления другое, более понятное название.
Элемент <DisplayName> является общим для всех правил.
| Значение по умолчанию | – |
| Обязательно? | Необязательное поле. Если вы не укажете <DisplayName>, будет использоваться значение атрибута name правила. |
| Тип | Строка |
| Родительский элемент | <PolicyElement> |
| Дочерние элементы | Нет |
Элемент <DisplayName> использует следующий синтаксис:
Синтаксис
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Пример
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
У элемента <DisplayName> нет атрибутов или дочерних элементов.
<IgnoreUnresolvedVariables>
Определяет, прекращается ли обработка при обнаружении неразрешенной переменной.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы | Нет |
Установите значение true, чтобы игнорировать неразрешенные переменные и продолжить обработку. В противном случае установите значение false. Значение по умолчанию: false.
Задание значения true для <IgnoreUnresolvedVariables> отличается от задания значения true для continueOnError в <AssignMessage> тем, что оно относится к заданию и получению значений переменных. Если задать для continueOnError значение true, Edge будет игнорировать все ошибки, а не только те, которые возникают при использовании переменных.
Элемент <IgnoreUnresolvedVariables> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<IgnoreUnresolvedVariables>[true|false]
</IgnoreUnresolvedVariables>
</AssignMessage>Пример 1
В примере ниже для параметра <IgnoreUnresolvedVariables> задано значение true.
<AssignMessage name="AM-Set-Headers"> <Set> <Headers> <Header name='new-header'>{possibly-defined-variable}<Header> </Headers> </Set> <IgnoreUnresolvedVariables>true </IgnoreUnresolvedVariables> </AssignMessage>
Поскольку для <IgnoreUnresolvedVariables> задано значение true, если переменная possibly-defined-variable не определена, это правило не приведет к ошибке.
<Remove>
Удаляет из сообщения заголовки, параметры запроса, параметры формы и/или полезную нагрузку. Сообщение может быть запросом или ответом. Вы указываете, на какое сообщение действует <Remove>, с помощью элемента <AssignTo>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Сложный тип |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы |
<FormParams><Headers><Payload><QueryParams> |
Чаще всего <Remove> используется для удаления параметра запроса или заголовка, содержащего конфиденциальную информацию, из объекта входящего запроса, чтобы не передавать ее на бэкенд-сервер.
Элемент <Remove> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Пример 1
В следующем примере из ответа удаляется тело сообщения:
<AssignMessage name="AM-remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo>response</AssignTo> </AssignMessage>
В потоке ответов это правило удаляет тело ответа, возвращая клиенту только HTTP-заголовки.
Пример 2
В следующем примере из объекта request удаляются все параметры формы и параметр запроса:
<AssignMessage name="AM-remove-2">
<Remove>
<!-- Empty (<FormParams/>) removes all form parameters -->
<FormParams/>
<QueryParams>
<QueryParam name="qp1"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 3
В следующем примере из объекта сообщения удаляется все:
<AssignMessage name="AM-remove-3"> <Remove/> <AssignTo>request</AssignTo> </AssignMessage>
Обычно это делается только в том случае, если вы собираетесь использовать элемент <Set> или <Copy>, чтобы задать в сообщении значения для замены.
<FormParams> (дочерний элемент <Remove>)
Удаляет из запроса указанные параметры формы. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <FormParam> или пустой массив. |
| Родительский элемент |
<Remove>
|
| Дочерние элементы |
<FormParam> |
Элемент <FormParams> использует следующий синтаксис:
Синтаксис:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> </Remove> </AssignMessage>
Пример 1
В следующем примере из запроса удаляются три параметра формы:
<AssignMessage name="AM-remove-formparams-1">
<Remove>
<FormParams>
<FormParam name="form_param_1"/>
<FormParam name="form_param_2"/>
<FormParam name="form_param_3"/>
</FormParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В следующем примере из запроса удаляются все параметры формы:
<AssignMessage name="AM-remove-formparams-2">
<Remove>
<FormParams/>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 3
Если у нескольких параметров формы одинаковое название, используйте следующий синтаксис:
<AssignMessage name="AM-remove-formparams-3">
<Remove>
<FormParams>
<FormParam name="f1"/>
<FormParam name="f2"/>
<FormParam name="f3.2"/>
</FormParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>В этом примере удаляются значения f1, f2 и второе значение f3. Если у f3 только одно значение, оно не удаляется.
Вы можете использовать <FormParams>, только если выполняются следующие условия:
- Тип сообщения: запрос
Content-Type: "application/x-www-form-urlencoded"
<Headers> (дочерний элемент <Remove>)
Удаляет указанные HTTP-заголовки из запроса или ответа, заданного элементом <AssignTo>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <Header> или пустой массив. |
| Родительский элемент |
<Remove>
|
| Дочерние элементы |
<Header> |
Элемент <Headers> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Remove> </AssignMessage>
Пример 1
В примере ниже из запроса удаляется заголовок user-agent:
<AssignMessage name="AM-remove-one-header">
<Remove>
<Headers>
<Header name="user-agent"/>
</Headers>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В следующем примере из запроса удаляются все заголовки:
<AssignMessage name="AM-remove-all-headers">
<Remove>
<Headers/>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 3
Если есть несколько заголовков с одинаковым названием, используйте следующий синтаксис:
<AssignMessage name="AM-remove-headers-3">
<Remove>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>В этом примере из запроса удаляются заголовки h1, h2 и второе значение заголовка h3. Если у h3 только одно значение, оно не удаляется.
<Payload> (дочерний элемент <Remove>)
Определяет, удаляет ли <Remove> полезную нагрузку в запросе или ответе, которая указана элементом <AssignTo>. Чтобы очистить полезную нагрузку, задайте значение true, в противном случае – false. Значение по умолчанию – false.
| Значение по умолчанию | False |
| Обязательно? | Необязательно |
| Тип | Логическое значение |
| Родительский элемент |
<Remove>
|
| Дочерние элементы | Нет |
Элемент <Payload> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <Payload>[false|true]</Payload> </Remove> </AssignMessage>
Пример 1
В приведенном ниже примере для параметра <Payload> устанавливается значение true, чтобы очистить полезную нагрузку запроса.
<AssignMessage name="AM-remove-payload-1"> <Remove> <Payload>true</Payload> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
<QueryParams> (дочерний элемент <Remove>)
Удаляет из запроса указанные параметры. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <QueryParam> или пустой массив. |
| Родительский элемент |
<Remove>
|
| Дочерние элементы |
<QueryParam> |
Элемент <QueryParams> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Пример 1
В следующем примере из запроса удаляется один параметр запроса:
<AssignMessage name="AM-remove-queryparams-1">
<Remove>
<QueryParams>
<QueryParam name="qp1"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В следующем примере из запроса удаляются все параметры:
<AssignMessage name="AM-remove-queryparams-2">
<Remove>
<QueryParams/>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 3
Если у вас несколько параметров запроса с одинаковым названием, используйте следующий синтаксис:
<AssignMessage name="AM-remove-queryparams-3">
<Remove>
<QueryParams>
<QueryParam name="qp1"/>
<QueryParam name="qp2"/>
<QueryParam name="qp3.2"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>В этом примере из запроса удаляются параметры qp1, qp2 и второе значение параметра qp3. Если у параметра qp3 только одно значение, оно не удаляется.
Пример 4
В примере ниже из запроса удаляется параметр apikey:
<AssignMessage name="AM-remove-query-param">
<Remove>
<QueryParams>
<QueryParam name="apikey"/>
</QueryParams>
</Remove>
<AssignTo>request</AssignTo>
</AssignMessage>Вы можете использовать <QueryParams>, только если соблюдены следующие условия:
- HTTP-метод: GET
- Тип сообщения: запрос
<Set>
Задает информацию в сообщении запроса или ответа, которая определяется элементом <AssignTo>. <Set> перезаписывает заголовки, запросы или параметры формы, которые уже есть в исходном сообщении. Заголовки, запросы и параметры формы в HTTP-сообщении могут содержать несколько значений. Чтобы добавить дополнительные значения для заголовка или параметра, используйте элемент <Add>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Сложный тип |
| Родительский элемент |
<AssignMessage>
|
| Дочерние элементы |
<FormParams><Headers><Payload><Path><QueryParams><ReasonPhrase><StatusCode><Verb><Version> |
Элемент <Set> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Path>path</Path> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> <StatusCode>HTTP_status_code or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Пример 1
В примере ниже показано, как задать определенный заголовок. Если это правило прикреплено к потоку запросов, оно позволит вышестоящей системе получить дополнительный заголовок, который не был включен в исходный входящий запрос.
<AssignMessage name="AM-Set-Header">
<Set>
<Headers>
<Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
</Headers>
</Set>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
В примере ниже перезаписывается полезная нагрузка для ответа, а также заголовок Content-Type.
<AssignMessage name="AM-Overwrite-Payload"> <Set> <Payload contentType="application/json">{ "status" : 42 }</Payload> </Set> <AssignTo>response</AssignTo> </AssignMessage>
<FormParams> (дочерний элемент <Set>)
Перезаписывает существующие параметры формы в запросе и заменяет их новыми значениями, которые вы указываете в этом элементе. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <FormParam> |
| Родительский элемент |
<Set>
|
| Дочерние элементы |
<FormParam> |
Элемент <FormParams> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Set>
<FormParams>
<FormParam name="formparam_name">formparam_value</FormParam>
...
</FormParams>
</Set>
</AssignMessage>Пример 1
В следующем примере параметр формы "myparam" получает значение переменной request.header.myparam в новом специальном запросе:
<AssignMessage name="AM-set-formparams-1"> <Set> <FormParams> <FormParam name="myparam">{request.header.myparam}</FormParam> </FormParams> </Set> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Вы можете использовать <FormParams>, только если выполняются следующие условия:
- HTTP-метод: POST
- Тип сообщения: запрос
Если вы зададите в правиле пустые параметры формы (<Add><FormParams/></Add>), то правило не добавит никаких параметров. Это то же самое, что не указывать <FormParams>.
<Set> изменяет Content-Type сообщения на application/x-www-form-urlencoded перед отправкой в целевую конечную точку.
<Headers> (дочерний элемент <Set>)
Перезаписывает существующие HTTP-заголовки в запросе или ответе, которые указаны в элементе <AssignTo>.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <Header> |
| Родительский элемент |
<Set>
|
| Дочерние элементы |
<Header> |
Элемент <Headers> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Set>
<Headers>
<Header name="header_name">header_value</Header>
...
</Headers>
</Set>
</AssignMessage>Пример 1
В следующем примере заголовку x-ratelimit-remaining присваивается значение переменной ratelimit.Quota-1.available.count:
<AssignMessage name="AM-Set-RateLimit-Header">
<Set>
<Headers>
<Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
</Headers>
</Set>
<AssignTo>response</AssignTo>
</AssignMessage>Если вы определите пустые заголовки в правиле (<Set><Headers/></Set>), оно не будет задавать заголовки. Это приведет к тому же результату, что и отсутствие параметра <Headers>.
<Path> (дочерний элемент <Set>)
<Payload> (дочерний элемент <Set>)
Определяет тело сообщения для запроса или ответа, которое задается элементом <AssignTo>. Полезная нагрузка может быть любого допустимого типа, например обычный текст, JSON или XML.
| Значение по умолчанию | пустая строка |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<Set>
|
| Дочерние элементы | Нет |
Элемент <Payload> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> </Set> </AssignMessage>
Пример 1
В примере ниже показано, как добавить полезную нагрузку в виде обычного текста.
<AssignMessage name="set-payload-1"> <Set> <Payload contentType="text/plain">42</Payload> </Set> </AssignMessage>
Пример 2
В примере ниже показано, как задать полезную нагрузку JSON.
<AssignMessage name="set-payload-2"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set> </AssignMessage>
Пример 3
В следующем примере значения переменных вставляются в полезную нагрузку путем заключения имен переменных в фигурные скобки:
<AssignMessage name="set-payload-3"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set> </AssignMessage>
В предыдущих версиях Apigee нельзя было использовать фигурные скобки для обозначения ссылок на переменные в полезных нагрузках JSON. В этих версиях для указания символов-разделителей нужно было использовать атрибуты variablePrefix и variableSuffix, а затем заключать в них названия переменных, например:
<AssignMessage name="set-payload-3b"> <Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set> </AssignMessage>
Старый синтаксис по-прежнему работает.
Пример 4
Содержимое файла <Payload> обрабатывается как шаблон сообщения. Это означает, что правило AssignMessage заменяет переменные, заключенные в фигурные скобки, значением указанных переменных во время выполнения.
В следующем примере используется синтаксис фигурных скобок, чтобы задать часть полезной нагрузки для значения переменной:
<AssignMessage name="set-payload-4"> <Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </root> </Payload> </Set> </AssignMessage>
В таблице ниже описаны атрибуты <Payload>.
| Атрибут | Описание | Тип поля | Тип |
|---|---|---|---|
contentType |
Если значение |
Необязательно | Строка |
variablePrefix |
Необязательный параметр, который указывает начальный разделитель в переменной потока. По умолчанию используется значение "{". Подробную информацию можно найти в справочнике по переменным потока. | Необязательно | Угля |
variableSuffix |
При необходимости указывает конечный разделитель в переменной потока. По умолчанию используется значение "}". Подробную информацию можно найти в справочнике по переменным потока. | Необязательно | Угля |
<QueryParams> (дочерний элемент <Set>)
Заменяет существующие параметры запроса новыми значениями. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Массив элементов <QueryParam> |
| Родительский элемент |
<Set>
|
| Дочерние элементы |
<QueryParam> |
Элемент <QueryParams> использует следующий синтаксис:
Синтаксис
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Set>
<QueryParams>
<QueryParam name="queryparam_name">queryparam_value</QueryParam>
...
</QueryParams>
</Set>
</AssignMessage>Пример 1
В следующем примере параметру запроса address присваивается значение переменной request.header.address:
<AssignMessage name="AM-set-queryparams-1"> <Set> <QueryParams> <QueryParam name="address">{request.header.address}</QueryParam> </QueryParams> </Set> </AssignMessage>
Вы можете использовать <QueryParams>, только если выполняются следующие условия:
- HTTP-метод: GET
- Тип сообщения: запрос
Если вы определите пустые параметры запроса в правиле (<Set><QueryParams/></Set>), правило не будет задавать никаких параметров запроса. Это то же самое, что не указывать <QueryParams>.
<ReasonPhrase> (дочерний элемент <Set>)
Задает фразу с причиной в ответе. Обычно это делается для отладки в сочетании с <StatusCode>. Этот элемент не влияет на запрос.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка |
| Родительский элемент |
<Set>
|
| Дочерние элементы | Нет |
Элемент <ReasonPhrase> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> </Set> </AssignMessage>
Пример 1:
В примере ниже показано, как задать простую фразу с причиной:
<AssignMessage name="set-reasonphrase-1"> <Set> <ReasonPhrase>Bad medicine</ReasonPhrase> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Пример 2
Содержимое файла <ReasonPhrase> обрабатывается как шаблон сообщения. Это означает, что название переменной, заключенное в фигурные скобки, во время выполнения будет заменено значением указанной переменной, как показано в следующем примере:
<AssignMessage name="AM-set-reasonphrase-2">
<Set>
<ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase>
</Set>
<AssignTo>response</AssignTo>
</AssignMessage>Вы можете использовать <ReasonPhrase>, только если выполняются следующие условия:
- Тип сообщения: ответ
<StatusCode> (дочерний элемент <Set>)
Задает код статуса ответа. Этот элемент не влияет на запрос.
| Значение по умолчанию | 200 (если атрибут createNew элемента <AssignTo> имеет значение true). |
| Обязательно? | Необязательно |
| Тип | Строка или variable |
| Родительский элемент |
<Set>
|
| Дочерние элементы | Нет |
Элемент <StatusCode> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <StatusCode>HTTP_status_code or {variable}</StatusCode> </Set> </AssignMessage>
Пример 1
В следующем примере задается простой код статуса:
<AssignMessage name="AM-set-statuscode-404">
<Set>
<StatusCode>404</StatusCode>
</Set>
<AssignTo>response</AssignTo>
</AssignMessage>Пример 2
Содержимое файла <StatusCode> обрабатывается как шаблон сообщения. Это означает, что название переменной, заключенное в фигурные скобки, во время выполнения будет заменено значением указанной переменной, как показано в следующем примере:
<AssignMessage name="set-statuscode-2">
<Set>
<StatusCode>{calloutresponse.status.code}</StatusCode>
</Set>
<AssignTo>response</AssignTo>
</AssignMessage>Вы можете использовать <StatusCode>, только если выполняются следующие условия:
- Тип сообщения: ответ
<Verb> (дочерний элемент <Set>)
Задает HTTP-глагол в запросе. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка или variable |
| Родительский элемент |
<Set>
|
| Дочерние элементы | Нет |
Элемент <Verb> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> </Set> </AssignMessage>
Пример 1
В следующем примере в запросе задается простой глагол:
<AssignMessage name="AM-set-verb-1">
<Set>
<Verb>POST</Verb>
</Set>
<AssignTo>request</AssignTo>
</AssignMessage>Пример 2
Содержимое файла <Verb> обрабатывается как шаблон сообщения. Это означает, что название переменной, заключенное в фигурные скобки, во время выполнения будет заменено значением указанной переменной.
В следующем примере переменная используется для подстановки глагола:
<AssignMessage name="AM-set-verb-to-dynamic-value"> <Set> <Verb>{my_variable}</Verb> </Set> <AssignTo>request</AssignTo> </AssignMessage>
Вы можете использовать <Verb>, только если выполняются следующие условия:
- Тип сообщения: запрос
<Version> (дочерний элемент <Set>)
Задает версию HTTP в запросе. Этот элемент не влияет на ответ.
| Значение по умолчанию | – |
| Обязательно? | Необязательно |
| Тип | Строка или variable |
| Родительский элемент |
<Set>
|
| Дочерние элементы | Нет |
Элемент <Version> использует следующий синтаксис:
Синтаксис
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Пример 1
В примере ниже номер версии – 1.1.
<AssignMessage name="AM-set-version-1">
<Set>
<Version>1.1</Version>
</Set>
</AssignMessage>Пример 2
В следующем примере для указания номера версии используется переменная в фигурных скобках:
<AssignMessage name="AM-set-version-2">
<Set>
<Version>{my_version}</Version>
</Set>
<AssignTo>request</AssignTo>
</AssignMessage>Содержимое файла <Version> обрабатывается как шаблон сообщения. Это означает, что название переменной, заключенное в фигурные скобки, во время выполнения будет заменено значением указанной переменной.
Вы можете использовать <Version>, только если выполняются следующие условия:
- Тип сообщения: запрос
Как создавать собственные сообщения с запросом согласия
Вы можете использовать политику AssignMessage, чтобы создать специальное сообщение запроса. После создания специального запроса вы можете использовать его следующими способами:
- Доступ к переменным в других правилах
- Передать во внешний сервис.
Чтобы создать специальное сообщение запроса, используйте элемент <AssignTo> в правиле AssignMessage. Задайте для атрибута createNew значение true и укажите название нового сообщения в теле элемента, как показано в примере ниже.
<AssignMessage name="AM-assignto-2"> <AssignTo createNew="true" transport="http" type="request">NameOfNewMessage</AssignTo> </AssignMessage>
По умолчанию Edge не выполняет никаких действий со специальным сообщением запроса. После создания Edge продолжит выполнение исходного запроса. Чтобы использовать специальный запрос, добавьте в прокси-сервер правило, например ServiceCallout, которое может передавать специальный запрос внешнему сервису.
Ниже приведены примеры создания специальных сообщений с запросом.
Пример 1
В следующем примере создается объект пользовательского запроса с помощью Assign Message:
<AssignMessage name="AssignMessage-3"> <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo> <Copy> <Headers> <Header name="user-agent"/> </Headers> </Copy> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.addy}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <IgnoreUnresolvedVariables>false </IgnoreUnresolvedVariables> </AssignMessage>
который:
- Создает новый объект сообщения запроса с названием MyCustomRequest.
- В MyCustomRequest это правило:
- Копирует значение HTTP-заголовка
user-agentиз входящего запроса в новое сообщение. Поскольку<Copy>использует абсолютную ссылку на переменную потокаuser-agent, указывать атрибутsourceдля<Copy>не нужно. - Задает для параметра запроса
addressв специальном сообщении значение параметра запросаaddyво входящем запросе. - Задает для HTTP-команды значение
GET.
- Копирует значение HTTP-заголовка
- Задает для
<IgnoreUnresolvedVariables>значение false. Если для<IgnoreUnresolvedVariables>задано значение false, а одна из переменных, которую пытается добавить правило, не существует, Edge прекратит обработку в потоке API.
Пример 2
Вот ещё один пример, демонстрирующий, как создать объект пользовательского запроса с помощью Assign Message:
<AssignMessage name="AssignMessage-2"> <AssignTo createNew="true" type="request">partner.request</AssignTo> <Set> <Verb>POST</Verb> <Payload contentType="text/xml"> <request><operation>105</operation></request> </Payload> </Set> </AssignMessage>
В этом примере создается новый специальный запрос с названием partner.request. Затем он задает <Verb> и <Payload> в новом запросе.
Вы можете получить доступ к специальному сообщению запроса в другом правиле AssignMessage, которое выполняется позже в потоке. В следующем примере показано, как получить значение заголовка user-agent специального сообщения запроса:
<AssignMessage name="custom-request-1-access">
<DisplayName>custom-request-1-access</DisplayName>
<AssignTo>partner.request</AssignTo>
<Set>
<Headers>
<Header name="user-agentCopyCustomRequest">{MyCustomRequest.header.user-agent}</Header>
</Headers>
</Set>
</AssignMessage>Видео
Чтобы узнать больше о правиле AssignMessage, посмотрите следующие видео.
| Видео | Описание |
|---|---|
| Зачем назначать правила для сообщений? | Узнайте о преимуществах использования правила AssignMessage для изменения запроса или ответа API без изменения кода серверной части. |
| Как скопировать элементы API с помощью правила AssignMessage | Скопируйте элементы из запроса к API или ответа и создайте новый объект запроса или ответа, используя правило AssignMessage. |
| Как удалить элементы API с помощью правила AssignMessage | Удаляйте элементы API и изменяйте API до того, как он достигнет целевого бэкенда, с помощью правила AssignMessage. |
| Как добавлять и настраивать элементы API с помощью правила AssignMessage | Изменение запроса к API или ответа путем добавления параметров запроса, заголовков, параметров формы или полезной нагрузки с помощью правила AssignMessage. |
| Как создать пользовательские переменные с помощью правила AssignMessage | Задайте пользовательские переменные потока с помощью правила AssignMessage и используйте их в других правилах прокси-сервера API. |
| Создание новых объектов запроса или ответа с помощью правила AssignMessage | Создавайте новые объекты запросов к API или ответов с помощью правила AssignMessage во время выполнения API. |
| Как создать макет API с помощью правила AssignMessage | Создайте простой макет REST API, добавив политику AssignMessage в поток ответов. |
| Задайте или измените полезную нагрузку с помощью правила AssignMessage | Преобразуйте REST-запрос в SOAP-запрос, задав полезную нагрузку SOAP с помощью правила AssignMessage во время выполнения API. |
Коды ошибок
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…
Ошибки времени выполнения
Эти ошибки могут возникать при выполнении правил.
| Код ошибки | Статус HTTP | Причина | Исправить |
|---|---|---|---|
steps.assignmessage.SetVariableFailed |
500 | Правило не смогло задать переменную. Название неразрешенной переменной можно найти в строке ошибки. | |
steps.assignmessage.VariableOfNonMsgType |
500 |
Эта ошибка возникает, если атрибуту Переменные типа сообщения представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Edge |
build |
steps.assignmessage.UnresolvedVariable |
500 |
Эта ошибка возникает, если переменная, указанная в правиле "Назначить сообщение",
|
build |
Ошибки развертывания
Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.
| Название ошибки | Причина | Исправить |
|---|---|---|
InvalidIndex |
Если индекс, указанный в элементах <Copy> и/или <Remove> правила "Назначить сообщение", равен 0 или отрицательному числу, развертывание прокси API завершится неудачно.
|
build |
InvalidVariableName |
Если дочерний элемент <Name> пуст или не указан в элементе <AssignVariable>, развертывание прокси-сервера API завершится неудачно, поскольку нет действительного имени переменной, которой можно присвоить значение. Укажите допустимое имя переменной.
|
build |
InvalidPayload |
Недопустимая полезная нагрузка, указанная в правиле. |
Переменные ошибок
Эти переменные задаются, когда правило вызывает ошибку во время выполнения. Подробнее о нарушениях правил…
| Переменные | Место | Пример |
|---|---|---|
fault.name="fault_name" |
fault_name – название ошибки, указанное в таблице Ошибки выполнения выше. Название ошибки – это последняя часть кода ошибки. | fault.name Matches "UnresolvedVariable" |
assignmessage.policy_name.failed |
policy_name – заданное пользователем название правила, которое вызвало ошибку. | assignmessage.AM-SetResponse.failed = true |
Пример ответа об ошибке
{ "fault":{ "detail":{ "errorcode":"steps.assignmessage.VariableOfNonMsgType" }, "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message" } }
Пример правила обработки ошибок
<FaultRule name="Assign Message Faults"> <Step> <Name>AM-CustomNonMessageTypeErrorResponse</Name> <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition> </Step> <Step> <Name>AM-CustomSetVariableErrorResponse</Name> <Condition>(fault.name = "SetVariableFailed")</Condition> </Step> <Condition>(assignmessage.failed = true) </Condition> </FaultRule>
Схемы
Каждый тип правил определяется схемой XML (.xsd). Схемы правил доступны на GitHub.
Статьи по теме
Рабочие примеры правила AssignMessage доступны в примерах платформы API.
Более сложный пример переопределения target.url из ProxyEndpoint приведен в этой статье сообщества Apigee.
Чтобы посмотреть, как работает set path в правиле ServiceCallout, ознакомьтесь с примером в GitHub Apigee. Просто клонируйте репозиторий и следуйте инструкциям в этом разделе. В примере используется правило AssignMessage для настройки пути запроса, а затем правило Service Callout для отправки запроса внешнему сервису.