Политика AssignMessage

Вы просматриваете документацию 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 Н/Д Необходимый

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, символы подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

continueOnError ЛОЖЬ Необязательный Установите значение «false», чтобы возвращать ошибку при сбое политики. Это ожидаемое поведение для большинства политик. Установите значение «true», чтобы выполнение потока продолжалось даже после сбоя политики.
enabled истинный Необязательный Установите значение «true», чтобы применить политику. Установите значение «false», чтобы «отключить» политику. Политика не будет применяться, даже если она остается присоединенной к потоку.
async ЛОЖЬ Устаревший Этот атрибут устарел.

В следующей таблице приведено общее описание дочерних элементов элемента <AssignMessage> :

Дочерний элемент Необходимый? Описание
Общие операции
<Add> Необязательный Добавляет информацию в объект сообщения, указанный элементом <AssignTo> .

Элемент <Add> добавляет к сообщению заголовки или параметры, которых нет в исходном сообщении. Чтобы перезаписать существующие заголовки или параметры, используйте элемент <Set> .

<Copy> Необязательный Копирует информацию из сообщения, указанного атрибутом source , в объект сообщения, указанный элементом <AssignTo> .
<Remove> Необязательный Удаляет указанные элементы из переменной сообщения, указанной в элементе <AssignTo> .
<Set> Необязательный Заменяет значения существующих свойств в запросе или ответе, которые указываются элементом <AssignTo> .

<Set> перезаписывает заголовки или параметры, которые уже существуют в исходном сообщении. Для добавления новых заголовков или параметров используйте элемент <Add> .

Другие дочерние элементы
<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 , данная политика изменяет объект response, который изначально был задан данными, возвращенными целевым сервером.

HTTP-заголовок, добавляемый в ответное сообщение этой политикой, определяется переменной, заполняемой политикой LookupCache . Таким образом, ответное сообщение, измененное этой политикой Assign Message, содержит 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>

Рекомендуется удалять параметр запроса apikey из сообщения запроса при использовании политики VerifyAPIKey для аутентификации пользователей. Это делается для предотвращения передачи конфиденциальной информации о ключе на целевую серверную часть.

6: Установка/получение переменных

В следующем примере используются три политики назначения сообщений:

  1. Создает в запросе три переменные потока со статическими значениями.
  2. Получает переменные потока динамически во второй политике в потоке запроса.
  3. Добавляет их в полезную нагрузку ответа.
<!-- 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. Добавьте политики № 1 и № 2 в поток запросов. Убедитесь, что политика № 1 расположена перед политикой № 2.
  2. Добавьте третью политику в поток ответа .
  3. Третий вариант политики использует элемент <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".

  4. Отправьте запрос к вашему 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: Получение заголовков ответа на вызов сервиса.

В следующем примере предположим, что политика ServiceCallout находится в запросе к API-прокси, и ответ вызова содержит несколько заголовков с одинаковым именем ( Set-Cookie ). Если предположить, что переменная ответа ServiceCallout имеет значение по умолчанию 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> использует следующий синтаксис:

Синтаксис s1

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

В следующем примере используется элемент <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 s3

В следующем примере элемент <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 s4

В следующем примере элемент <QueryParams> используется для добавления к запросу одного параметра запроса со статическим значением:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

В этом примере в предварительном потоке запроса используется <Add> . Если вы посмотрите результаты в таком инструменте, как инструмент трассировки , запрос к https://example-target.com/get станет https://example-target.com/get?myParam=42 .

Дочерние элементы <Add> поддерживают динамическую подстановку строк, известную как шаблонизация сообщений .

<FormParams> (дочерний элемент <Add> )

Добавляет новые параметры формы в сообщение запроса. Этот элемент не влияет на сообщение ответа.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Массив элементов <FormParam>
Родительский элемент <Add>
Дочерние элементы <FormParam>

Элемент <FormParams> использует следующий синтаксис:

Синтаксис s5

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

В следующем примере к запросу добавляется один параметр формы ("answer") и статическое значение ("42"):

<AssignMessage name="AM-add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Пример 2 s7

В следующем примере значение параметра запроса 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 s8

В следующем примере к запросу добавляется несколько параметров формы:

<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 отправит измененный запрос на целевую конечную точку.

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

Синтаксис s9

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Add>
</AssignMessage>

Пример 1 s10

В следующем примере к сообщению запроса добавляется заголовок 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> использует следующий синтаксис:

Синтаксис s11

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Пример 1 s12

В следующем примере к запросу добавляется параметр запроса "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> использует следующий синтаксис:

Синтаксис s13

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

В следующем примере указано, что целью является исходный запрос, который будет отправлен на целевую конечную точку:

<AssignMessage name="assignto-1">
<!-- DO NOT do this -->
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Пример 2 s15

В следующем примере создается новый объект запроса:

<AssignMessage name="AM-assignto-2"> 
  <AssignTo createNew="true" transport="http" type="request">NameOfNewMessage</AssignTo> 
</AssignMessage>

При создании нового объекта запроса или ответа другие элементы политики AssignMessage (такие как <Add> , <Set> и <Copy> ) воздействуют на этот новый объект запроса.

Вы можете получить доступ к новому объекту запроса в других политиках позже в процессе выполнения, или отправить новый объект запроса во внешний сервис с помощью политики ServiceCallout .

Пример 3 s16

В следующем примере создается новый объект запроса с именем "MyRequestObject":

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"&gt;MyRequestObject&lt;/AssignTo>
</AssignMessage>

При создании нового объекта запроса или ответа другие элементы политики AssignMessage (такие как <Add> , <Set> и <Copy> ) воздействуют на этот новый объект запроса.

Вы можете получить доступ к новому объекту запроса в других политиках позже в процессе выполнения, или отправить новый объект запроса во внешний сервис с помощью политики ServiceCallout .

В следующей таблице описаны атрибуты объекта <AssignTo> :

Атрибут Описание Необходимый? Тип
createNew

Определяет, будет ли данная политика создавать новое сообщение при присвоении значений.

Если значение равно "true", то политика создает новую переменную типа, указанного параметром type (либо "request", либо "response"). Если имя новой переменной не указано, то политика создает новый объект запроса или ответа на основе значения type .

Если ответ «ложный», то политика реагирует одним из двух способов:

  • Если переменная <AssignTo> может быть преобразована в объект запроса или ответа, обработка продолжается. Например, если политика находится в потоке запроса, переменной является объект запроса. Если политика находится в ответе, переменной является объект ответа.
  • Если <AssignTo> не может быть разрешено или разрешается в тип, отличный от сообщения, то политика выдает ошибку.

Если createNew не указан, политика реагирует одним из двух способов:

  • Если текстовое значение поля <AssignTo> соответствует сообщению, то обработка переходит к следующему шагу.
  • Если текстовое значение переменной <AssignTo> не может быть определено или определяется как тип, отличный от сообщения, создается новая переменная типа, указанного в type .
Необязательный Логический
transport

Указывает тип транспорта для сообщения запроса или ответа.

Значение по умолчанию — "http" (единственное поддерживаемое значение).

Необязательный Нить
type Указывает тип нового сообщения, если createNew имеет значение "true". Допустимые значения: "request" или "response".

Если этот атрибут опустить, Edge создаст либо запрос, либо ответ, в зависимости от того, на каком этапе выполнения этой политики будет запущен процесс.

Необязательный Нить

<AssignVariable>

Присваивает значение переменной потока. Если переменная потока не существует, то <AssignVariable> создает её.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Сложный тип
Родительский элемент <AssignMessage>
Дочерние элементы <Name> (обязательно)
<Ref>
<Template>
<Value>

Значение, которое вы присваиваете переменной потока, может быть одним из следующих:

  • Строковый литерал: Используйте дочерний элемент <Value> для указания строкового значения для переменной потока.
  • Переменная потока: Используйте дочерний элемент <Ref> , чтобы указать значение существующей переменной потока в качестве целевой переменной потока. Полный список переменных потока, которые можно использовать в качестве источника, см. в справочнике по переменным потока .
  • Шаблон сообщения: Используйте дочерний элемент <Template> , чтобы указать шаблон сообщения для интерполяции, чтобы получить значение, которое будет помещено в целевую переменную потока.

Элемент <AssignVariable> использует следующий синтаксис:

Синтаксис s17

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

В следующем примере новой переменной myvar присваивается буквальное значение "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Пример 2 s19

В следующем примере значение переменной потока 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 s20

В следующем примере используется дочерний элемент <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> использует следующий синтаксис:

Синтаксис s21

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
  </AssignVariable>
</AssignMessage>

Пример 1 s22

В следующем примере в качестве целевой переменной указывается 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 s23

В следующем примере значение переменной потока 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 s23

В следующем примере значение переменной потока 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 s24

Типичный пример использования ` <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> использует следующий синтаксис:

Синтаксис s25

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
  </AssignVariable>
</AssignMessage>

Пример 1 s26

В следующем примере используется синтаксис шаблонизации сообщений для объединения двух контекстных переменных, разделенных строковым литералом (дефисом):

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

В следующем примере задается переменная потока, значением которой является предопределенный шаблон сообщения. Используйте этот параметр, если хотите внедрить предопределенный шаблон во время выполнения без необходимости изменения политики:

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

В следующем примере задается переменная потока и текстовое значение. В этом случае, если ссылочная переменная не равна 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> использует следующий синтаксис:

Синтаксис s29

<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> использует следующий синтаксис:

Синтаксис s30

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

В следующем примере из сообщения 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 s32

В следующем примере сначала удаляется все содержимое существующего 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 не указан, по умолчанию используется значение message , которое может отличаться в зависимости от потока выполнения политики. Если политика выполняется в потоке запроса, то переменная message ссылается на объект request . Если политика выполняется в потоке ответа, то переменная message ссылается на объект response .
  • Если исходная переменная не может быть разрешена или имеет тип, отличный от сообщения, <Copy> не отвечает.
Необязательный Нить

<FormParams> (дочерний элемент <Copy> )

Копирует параметры формы из запроса, указанного атрибутом source элемента <Copy> , в запрос, указанный элементом <AssignTo> . Этот элемент не влияет на ответ.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Массив элементов <FormParam> или пустой массив
Родительский элемент <Copy>
Дочерние элементы <FormParam>

Элемент <FormParams> использует следующий синтаксис:

Синтаксис s33

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

В следующем примере копируется один параметр формы из запроса в пользовательский запрос "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 s35

В следующем примере все параметры формы копируются в пользовательский запрос "MyCustomRequest":

<AssignMessage name="copy-formparams-2">
  <Copy source="request">
    <FormParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Пример 3 s36

В следующем примере три параметра формы копируются в пользовательский запрос "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>

Пример 4 s37

Если несколько параметров формы имеют одинаковое имя, используйте следующий синтаксис:

<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> использует следующий синтаксис:

Синтаксис s38

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

В следующем примере заголовок 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 s40

Чтобы скопировать все заголовки, используйте пустой элемент <Headers> , как показано в следующем примере:

<AssignMessage name="copy-headers-2">
  <Copy source="request">
    <Headers/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Пример 3 s41

Если имеется несколько заголовков с одинаковым именем, используйте следующий синтаксис:

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

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

Элемент <Path> использует следующий синтаксис:

Синтаксис

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Path>[false|true]</Path>
  </Copy>
</AssignMessage>

Пример 1 s42

Следующий пример показывает, что политика 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> .

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

Элемент <Payload> использует следующий синтаксис:

Синтаксис s43

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Payload>[false|true]</Payload>
  </Copy>
</AssignMessage>

Пример 1 s44

В следующем примере параметру <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> использует следующий синтаксис:

Синтаксис s45

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

В следующем примере параметр запроса "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 s47

В следующем примере все параметры запроса копируются в новый, пользовательский объект запроса:

<AssignMessage name="copy-queryparams-2">
  <Copy source="request">
    <QueryParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Пример 3 s48

Если имеется несколько параметров запроса с одинаковым именем, используйте следующий синтаксис:

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

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

Элемент <ReasonPhrase> использует следующий синтаксис:

Синтаксис s49

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <ReasonPhrase>[false|true]</ReasonPhrase>
  </Copy>
</AssignMessage>

Пример 1 s50

В следующем примере параметру <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> )

Определяет, копируется ли код состояния из ответа источника в ответ получателя. Этот элемент не влияет на запрос.

If "true", this policy copies the status code from the response message specified by the <Copy> element's source attribute to the response message specified by the <AssignTo> element.

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

The <StatusCode> element uses the following syntax:

Syntax s52

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <StatusCode>[false|true]</StatusCode>
  </Copy>
</AssignMessage>

Example 1 s53

The following example sets <StatusCode> to "true", which copies the status code from the default response object to a new, custom response object:

<AssignMessage name="copy-statuscode-1">
  <Copy source="response">
    <StatusCode>true</StatusCode>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

You can use <StatusCode> only when the source and destination messages are of type Response.

A common use of <StatusCode> is to set the proxy response status code to a different value than that received from the target.

<Verb> (child of <Copy> )

Determines whether the HTTP verb is copied from the source request to the destination request. This element has no effect on a response.

If "true", copies the verb found in the <Copy> element's source attribute to the request specified in the <AssignTo> element.

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

The <Verb> element uses the following syntax:

Syntax s54

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Verb>[false|true]</Verb>
  </Copy>
</AssignMessage>

Example 1 s55

The following example sets <Verb> to "true", which copies the verb from the default request to a new, custom request:

<AssignMessage name="copy-verb-1">
  <Copy source="request">
    <Verb>true</Verb>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

You can use <Verb> only when the following criteria are met:

  • Message type: Request

<Version> (child of <Copy> )

Determines whether the HTTP version is copied from the source request to the destination request. This element has no effect on a response.

If "true", copies the HTTP version found in the <Copy> element's source attribute to the object specified by the <AssignTo> element.

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Copy>
Дочерние элементы Никто

The <Version> element uses the following syntax:

Syntax s56

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Version>[false|true]</Version>
  </Copy>
</AssignMessage>

Example 1 s57

The following example sets <Version> to "true" on the request, which copies the version from the default request object to a new, custom request object:

<AssignMessage name="copy-version-1">
  <Copy source="request">
    <Version>true</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

You can use <Version> only when the following criteria are met:

  • Message type: Request

<DisplayName>

Используйте в дополнение к атрибуту name , чтобы обозначить политику в редакторе прокси-сервера пользовательского интерфейса управления другим, более естественно звучащим именем.

Элемент <DisplayName> является общим для всех политик.

Значение по умолчанию н/д
Необходимый? Необязательно. Если <DisplayName> опущен, будет использоваться значение атрибута name политики.
Тип Нить
Родительский элемент < PolicyElement >
Дочерние элементы Никто

Элемент <DisplayName> использует следующий синтаксис:

Синтаксис

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Пример

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

Элемент <DisplayName> не имеет атрибутов или дочерних элементов.

<IgnoreUnresolvedVariables>

Определяет, прекращается ли обработка при обнаружении неразрешенной переменной.

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <AssignMessage>
Дочерние элементы Никто

Set to true to ignore unresolved variables and continue processing; otherwise false . The default value is false .

Setting <IgnoreUnresolvedVariables> to true is different from setting the <AssignMessage> 's continueOnError to true in that it is specific to setting and getting values of variables. If you set continueOnError to true , then Edge ignores all errors, not just errors encountered when using variables.

Элемент <IgnoreUnresolvedVariables> использует следующий синтаксис:

Syntax s58

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <IgnoreUnresolvedVariables>[true|false]
  </IgnoreUnresolvedVariables>
</AssignMessage>

Example 1 s59

The following example sets <IgnoreUnresolvedVariables> to "true":

<AssignMessage name="AM-Set-Headers">
  <Set>
    <Headers>
      <Header name='new-header'>{possibly-defined-variable}<Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
</AssignMessage>

Because <IgnoreUnresolvedVariables> is set to true , if the possibly-defined-variable variable is not defined, this policy will not throw a fault.

<Remove>

Removes headers, query parameters, form parameters, and/or the message payload from a message. The message can be a request or a response. You specify which message <Remove> acts on by using the <AssignTo> element.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Сложный тип
Родительский элемент <AssignMessage>
Дочерние элементы <FormParams>
<Headers>
<Payload>
<QueryParams>

A common use case for <Remove> is to delete a query parameter or header that contains sensitive information from the incoming request object, to avoid passing it to the backend server.

The <Remove> element uses the following syntax:

Syntax s60

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

Example 1 s61

The following example removes the message's body from the response:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

In the response flow, this policy removes the body of the response, returning only HTTP headers to the client.

Example 2 s62

The following example removes all form parameters and a query parameter from the request object:

<AssignMessage name="AM-remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 3 s63

The following example removes everything from a message object:

<AssignMessage name="AM-remove-3">
  <Remove/>
  <AssignTo>request</AssignTo>
</AssignMessage>

Typically you would do this only if you were going to use the <Set> element or the <Copy> element to set some replacement values in the message.

<FormParams> (child of <Remove> )

Removes the specified form parameters from the request. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <FormParam> elements or an empty array
Родительский элемент <Remove>
Дочерние элементы <FormParam>

The <FormParams> element uses the following syntax:

Syntax s64

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

Example 1 s65

The following example removes three form parameters from the request:

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

Example 2 s66

The following example removes all form parameters from the request:

<AssignMessage name="AM-remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 3 s67

If there are multiple form params with the same name, use the following syntax:

<AssignMessage name="AM-remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

This example removes "f1", "f2", and the second value of "f3". If "f3" has only one value, then it is not removed.

You can use <FormParams> only when the following criteria are met:

  • Message type: Request
  • Content-Type : "application/x-www-form-urlencoded"

<Headers> (child of <Remove> )

Removes the specified HTTP headers from the request or response, which is specified by the <AssignTo> element.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <Header> elements or an empty array
Родительский элемент <Remove>
Дочерние элементы <Header>

The <Headers> element uses the following syntax:

Синтаксис

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

Example 1 s68

The following example removes the user-agent header from the request:

<AssignMessage name="AM-remove-one-header">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 2 s69

The following example removes all headers from the request:

<AssignMessage name="AM-remove-all-headers">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 3 s70

If there are multiple headers with the same name, use the following syntax:

<AssignMessage name="AM-remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

This example removes "h1", "h2", and the second value of "h3" from the request. If "h3" has only one value, then it is not removed.

<Payload> (child of <Remove> )

Determines whether <Remove> deletes the payload in the request or response, which is specified by the <AssignTo> element. Set to "true" to clear the payload; otherwise "false". The default value is "false".

Значение по умолчанию ЛОЖЬ
Необходимый? Необязательный
Тип Логический
Родительский элемент <Remove>
Дочерние элементы Никто

The <Payload> element uses the following syntax:

Синтаксис

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <Payload>[false|true]</Payload>
  </Remove>
</AssignMessage>

Example 1 s71

The following example sets <Payload> to "true" so that the request payload is cleared:

<AssignMessage name="AM-remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

<QueryParams> (child of <Remove> )

Removes the specified query parameters from the request. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <QueryParam> elements or an empty array
Родительский элемент <Remove>
Дочерние элементы <QueryParam>

The <QueryParams> element uses the following syntax:

Syntax s72

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

Example 1 s73

The following example removes a single query parameter from the request:

<AssignMessage name="AM-remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 2 s74

The following example removes all query parameters from the request:

<AssignMessage name="AM-remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 3 s75

If there are multiple query params with the same name, use the following syntax:

<AssignMessage name="AM-remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

This example removes "qp1", "qp2", and the second value of "qp3" from the request. If "qp3" has only one value, then it is not removed.

Example 4 s76

The following example removes the apikey query parameter from the request:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

You can use <QueryParams> only when the following criteria are met:

  • HTTP verb: GET
  • Message type: Request

<Set>

Sets information in the request or response message, which is specified by the <AssignTo> element. <Set> overwrites headers or query or form parameters that already exist in the original message. Headers and query and form parameters in an HTTP message may hold multiple values. To add additional values for a header or parameter, use the <Add> element instead.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Сложный тип
Родительский элемент <AssignMessage>
Дочерние элементы <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

The <Set> element uses the following syntax:

Синтаксис

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

Example 1 s77

The following example sets a specific header. When this policy is attached in the Request flow, it will allow the upstream system to receive an additional header that was not included in the original inbound request.

<AssignMessage name="AM-Set-Header">
  <Set>
    <Headers>
        <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
    </Headers>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 2 s78

The following example overwrites the payload for a response, as well as the Content-Type header.

<AssignMessage name="AM-Overwrite-Payload">
  <Set>
    <Payload contentType="application/json">{ "status" : 42 }</Payload>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

<FormParams> (child of <Set> )

Overwrites existing form parameters on a request and replaces them with the new values that you specify with this element. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <FormParam> elements
Родительский элемент <Set>
Дочерние элементы <FormParam>

The <FormParams> element uses the following syntax:

Syntax s79

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Set>
</AssignMessage>

Example 1 s80

The following example sets a form parameter called "myparam" to the value of the request.header.myparam variable in a new, custom request:

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

You can use <FormParams> only when the following criteria are met:

  • HTTP verb: POST
  • Message type: Request

If you define empty form parameters in your policy ( <Add><FormParams/></Add> ), the policy does not add any form parameters. This is the same as omitting the <FormParams> .

<Set> changes the Content-Type of the message to "application/x-www-form-urlencoded" before sending it to the target endpoint.

<Headers> (child of <Set> )

Overwrites existing HTTP headers in the request or response, which is specified by the <AssignTo> element.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <Header> elements
Родительский элемент <Set>
Дочерние элементы <Header>

The <Headers> element uses the following syntax:

Syntax s81

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Set>
</AssignMessage>

Example 1 s81

The following example sets the x-ratelimit-remaining header to the value of the ratelimit.Quota-1.available.count variable:

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

If you define empty headers in your policy ( <Set><Headers/></Set> ), the policy does not set any headers. This will have the same effect as omitting <Headers> .

<Path> (child of <Set> )

<Payload> (child of <Set> )

Defines the message body for a request or response, which is specified by the <AssignTo> element. The payload can be any valid content type, such as plain text, JSON, or XML.

Значение по умолчанию empty string
Необходимый? Необязательный
Тип Нить
Родительский элемент <Set>
Дочерние элементы Никто

The <Payload> element uses the following syntax:

Syntax s82

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
  </Set>
</AssignMessage>

Example 1 s83

The following example sets a plain text payload:

<AssignMessage name="set-payload-1">
  <Set>
    <Payload contentType="text/plain">42</Payload>
  </Set>
</AssignMessage>

Example 2 s84

The following example sets a JSON payload:

<AssignMessage name="set-payload-2">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"bar"}
    </Payload>
  </Set>
</AssignMessage>

Example 3 s85

The following example inserts variable values into the payload by wrapping variable names in curly braces:

<AssignMessage name="set-payload-3">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"{variable_name}"}
    </Payload>
  </Set>
</AssignMessage>

In previous versions of Apigee, you could not use curly braces to denote variable references within JSON payloads. In those releases, you needed to use the variablePrefix and variableSuffix attributes to specify delimiter characters, and use those to wrap variable names, like so:

<AssignMessage name="set-payload-3b">
  <Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
      {"name":"foo", "type":"@variable_name#"}
    </Payload>
  </Set>
</AssignMessage>

This older syntax still works.

Example 4 s86

The content of <Payload> is treated as a message template. This means that the AssignMessage policy replaces variables wrapped in curly braces with the value of the referenced variables at runtime.

The following example uses the curly braces syntax to set part of the payload to a variable value:

<AssignMessage name="set-payload-4">
  <Set>
    <Payload contentType="text/xml">
      <root>
        <e1>sunday</e1>
        <e2>funday</e2>
        <e3>{var1}</e3>
      </root>
    </Payload>
  </Set>
</AssignMessage>

The following table describes the attributes of <Payload> :

Атрибут Описание Присутствие Тип
contentType

If specified, the value of contentType is assigned to the Content-Type HTTP header.

Необязательный Нить
variablePrefix Optionally specifies the leading delimiter on a flow variable. Defaults to "{". For more information, see Flow variables reference . Необязательный Чар
variableSuffix Optionally specifies the trailing delimiter on a flow variable. Defaults to "}". For more information, see Flow variables reference . Необязательный Чар

<QueryParams> (child of <Set> )

Overwrites existing query parameters in the request with new values. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Array of <QueryParam> elements
Родительский элемент <Set>
Дочерние элементы <QueryParam>

The <QueryParams> element uses the following syntax:

Syntax s87

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Set>
</AssignMessage>

Example 1 s88

The following example sets the "address" query parameter to the value of the request.header.address variable:

<AssignMessage name="AM-set-queryparams-1">  <Set>
    <QueryParams>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

You can use <QueryParams> only when the following criteria are met:

  • HTTP verb: GET
  • Message type: Request

If you define empty query parameters in your policy ( <Set><QueryParams/></Set> ), the policy does not set any query parameters. This is the same as omitting <QueryParams> .

<ReasonPhrase> (child of <Set> )

Sets the reason phrase on the response. This is normally done for debugging in combination with <StatusCode> . This element has no effect on a request.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип Нить
Родительский элемент <Set>
Дочерние элементы Никто

The <ReasonPhrase> element uses the following syntax:

Syntax s89

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
  </Set>
</AssignMessage>

Example 1 s90

The following example defines a simple reason phrase:

<AssignMessage name="set-reasonphrase-1">
  <Set>
    <ReasonPhrase>Bad medicine</ReasonPhrase>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Example 2 s91

The content of <ReasonPhrase> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable, as the following example shows:

<AssignMessage name="AM-set-reasonphrase-2">
  <Set>
    <ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

You can use <ReasonPhrase> only when the following criteria are met:

  • Message type: Response

<StatusCode> (child of <Set> )

Sets the status code on the response. This element has no effect on a request.

Значение по умолчанию '200' (when <AssignTo> 's createNew attribute is set to 'true')
Необходимый? Необязательный
Тип String or variable
Родительский элемент <Set>
Дочерние элементы Никто

The <StatusCode> element uses the following syntax:

Syntax s92

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
  </Set>
</AssignMessage>

Пример 1

The following example sets a simple status code:

<AssignMessage name="AM-set-statuscode-404">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Пример 2

The content of <StatusCode> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable, as the following example shows:

<AssignMessage name="set-statuscode-2">
  <Set>
    <StatusCode>{calloutresponse.status.code}</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

You can use <StatusCode> only when the following criteria are met:

  • Message type: Response

<Verb> (child of <Set> )

Sets the HTTP verb on the request. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип String or variable
Родительский элемент <Set>
Дочерние элементы Никто

The <Verb> element uses the following syntax:

Синтаксис

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
  </Set>
</AssignMessage>

Example 1 s93

The following example sets a simple verb on the request:

<AssignMessage name="AM-set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Example 2 s94

The content of <Verb> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable.

The following example uses a variable to populate a verb:

<AssignMessage name="AM-set-verb-to-dynamic-value">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

You can use <Verb> only when the following criteria are met:

  • Message type: Request

<Version> (child of <Set> )

Sets the HTTP version on a request. This element has no effect on a response.

Значение по умолчанию н/д
Необходимый? Необязательный
Тип String or variable
Родительский элемент <Set>
Дочерние элементы Никто

The <Version> element uses the following syntax:

Syntax s95

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Example 1 s96

The following example sets the version number to "1.1":

<AssignMessage name="AM-set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
 </AssignMessage>

Пример 2

The following uses a variable in curly braces to set the version number:

<AssignMessage name="AM-set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

The content of <Version> is treated as a message template. This means a variable name wrapped in curly braces will be replaced at runtime with the value of the referenced variable.

You can use <Version> only when the following criteria are met:

  • Message type: Request

The following example creates a custom request object with 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>

This example:

  • Creates a new request message object called "MyCustomRequest".
  • On MyCustomRequest, this policy:
    • Copies the value of the user-agent HTTP header from the incoming request to the new message. Because <Copy> uses an absolute reference to the user-agent flow variable, there is no need to specify the source attribute to <Copy> .
    • Sets the address query parameter on the custom message to the value of the incoming request's addy query parameter.
    • Sets the HTTP verb to GET .
  • Sets <IgnoreUnresolvedVariables> to "false". When <IgnoreUnresolvedVariables> is "false", if one of the variables the policy tries to add does not exist, Edge will stop processing in the API flow.