Политика AssignMessage

Вы просматриваете документацию Apigee Edge .
Перейти к документации Apigee X.
info

Что

Политика AssignMessage изменяет или создаёт новые сообщения запросов и ответов в потоке API-прокси. Политика позволяет выполнять следующие действия с этими сообщениями:

  • Добавить новые параметры формы, заголовки или параметры запроса в сообщение
  • Копировать существующие свойства из одного сообщения в другое
  • Удалить заголовки, параметры запроса, параметры формы и/или полезную нагрузку сообщения из сообщения.
  • Установить значение существующих свойств в сообщении

Политика 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-заголовок.

Поскольку в этом примере response указан как имя переменной в элементе <AssignTo> , эта политика изменяет объект 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>

Полный список переменных потока см. в Справочнике переменных потока .

Начиная с версии Cloud 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: Установка/получение переменных

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

  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 ). Если предположить, что переменная ответа вызова службы — это значение по умолчанию 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> . Если посмотреть на результаты в инструменте Trace , запрос к 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

В следующем примере к запросу добавляется один параметр формы («ответ») и статическое значение («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 отправляет изменённый запрос в целевую конечную точку.

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

Синтаксис 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 равны нулю, нечитаемы или имеют неправильный формат, 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 с50

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

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

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

Синтаксис s52

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

Пример 1 с53

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

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

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

Синтаксис s54

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

Пример 1 с55

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

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

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

Синтаксис s56

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

Пример 1 с57

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

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

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

Установите значение true , чтобы игнорировать неразрешенные переменные и продолжить обработку; в противном случае false . Значение по умолчанию — false .

Установка для <IgnoreUnresolvedVariables> значения true отличается от установки для continueOnError <AssignMessage> значения true тем, что она специфична для установки и получения значений переменных. Если вы установите для continueOnError значение true , Edge игнорирует все ошибки, а не только ошибки, возникающие при использовании переменных.

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

Синтаксис s58

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

Пример 1 с59

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

Синтаксис 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>

Пример 1 с61

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

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

В потоке ответов эта политика удаляет тело ответа, возвращая клиенту только заголовки HTTP.

Пример 2 с62

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

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

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

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

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

Удаляет указанные параметры формы из запроса. Этот элемент не влияет на ответ.

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

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

Синтаксис 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>

Пример 1 с65

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

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

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

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

Пример 3 с67

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

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

В следующем примере из запроса удаляется заголовок user-agent :

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

Пример 2, с69

В следующем примере из запроса удаляются все заголовки:

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

Пример 3 с70

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

<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», чтобы очистить полезную нагрузку; в противном случае «ложь». Значение по умолчанию — «ложь».

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

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

Синтаксис

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

Пример 1 с71

В следующем примере для <Payload> устанавливается значение «true», чтобы полезные данные запроса были очищены:

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

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

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

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

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

Синтаксис 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>

Пример 1 с73

В следующем примере из запроса удаляется один параметр запроса:

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

Пример 2 с74

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

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

Пример 3 с75

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

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

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

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

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

Пример 2 с78

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

Синтаксис s79

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

Пример 1 с80

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

Синтаксис s81

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

Пример 1 с81

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

Синтаксис 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>

Пример 1 с83

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

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

Пример 2 с84

В следующем примере задаются полезные данные JSON:

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

Пример 3 с85

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

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

В предыдущих версиях Apigee нельзя было использовать фигурные скобки для обозначения ссылок на переменные внутри полезных данных JSON. В этих выпусках вам нужно было использовать атрибутыvariablePrefix variablePrefix для указания символов-разделителей и использовать их для переноса имен переменных, variableSuffix :

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

Этот старый синтаксис все еще работает.

Пример 4 с86

Содержимое <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

Если указано, значение contentType присваивается HTTP-заголовку Content-Type .

Необязательный Нить
variablePrefix При необходимости указывает ведущий разделитель переменной потока. По умолчанию «{». Дополнительные сведения см. в разделе Справочник по переменным потока . Необязательный Чар
variableSuffix При необходимости указывает конечный разделитель переменной потока. По умолчанию «}». Дополнительные сведения см. в разделе Справочник по переменным потока . Необязательный Чар

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

Перезаписывает существующие параметры запроса в запросе новыми значениями. Этот элемент не влияет на ответ.

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

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

Синтаксис s87

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

Пример 1 с88

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

Синтаксис s89

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

Пример 1 с90

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

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

Пример 2 с91

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

Синтаксис s92

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

В следующем примере в запросе используется простой глагол:

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

Пример 2 с94

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

Синтаксис s95

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

Пример 1 с96

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

  • Тип сообщения: Запрос

В следующем примере создается пользовательский объект запроса с помощью 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 .
  • Устанавливает для <IgnoreUnresolvedVariables> значение «false». Если <IgnoreUnresolvedVariables> имеет значение «false», если одна из переменных, которые пытается добавить политика, не существует, Edge прекратит обработку в потоке API.