Шаблоны сообщений

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

В этом разделе обсуждается, как использовать шаблоны сообщений в прокси-серверах API, и предоставляется ссылка на функции.

Что такое шаблон сообщения?

Шаблон сообщения позволяет выполнять замену строк переменных в определенных элементах политики и TargetEndpoint. Эта функция, если она поддерживается, позволяет динамически заполнять строки при выполнении прокси.

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

См. также Где можно использовать шаблоны сообщений?

Пример

Например, политика «Назначить сообщение» позволяет использовать шаблон сообщения в элементе <Payload> :

<AssignMessage name="set-dynamic-content">
  <AssignTo createNew="false" type="response"></AssignTo>
  <Set>
    <Payload contentType="application/json">
      {"name":"Alert", "message":"You entered an invalid username: {user.name}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

В приведенном выше примере значение переменной потока user.name (в фигурных скобках) будет оценено и подставлено в строку полезных данных во время выполнения. Так, например, если user.name=jdoe , то результирующее сообщение в полезных данных будет следующим: You entered an invalid username: jdoe . Если переменную невозможно разрешить, выводится пустая строка.

Пример

При превышении квоты рекомендуется возвращать вызывающему объекту значимое сообщение. Этот шаблон обычно используется с «правилом сбоя» для предоставления вызывающей стороне информации о нарушении квоты. В следующей политике назначения сообщения шаблоны сообщений используются для динамического заполнения информации о квоте в нескольких элементах XML:

<AssignMessage name='AM-QuotaViolationMessage'>
  <Description>message for quota exceeded</Description>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <Set>
    <Headers>
      <Header name='X-Quota-Reset'>{ratelimit.Quota-1.expiry.time}</Header>
      <Header name='X-Quota-Allowed'>{ratelimit.Quota-1.allowed.count}</Header>
      <Header name='X-Quota-Available'>{ratelimit.Quota-1.available.count}</Header>
    </Headers>
    <Payload contentType='application/json'>{
  "error" : {
    "message" : "you have exceeded your quota",
    "clientId" : "{request.queryparam.apikey}"
  }
}
    </Payload>
    <StatusCode>429</StatusCode>
    <ReasonPhrase>Quota Exceeded</ReasonPhrase>
  </Set>
</AssignMessage>

В политике AssignMessage следующие элементы элемента <Set> поддерживают шаблонирование сообщений:

  • Заголовок
  • ЗапросПарам
  • ФормаПарам
  • Полезная нагрузка
  • Версия
  • Глагол
  • Путь
  • СтатусКод
  • ПричинаФраза

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

Когда эта политика выполняется:

  • Элементы заголовка получают значения указанных переменных потока.
  • Полезная нагрузка включает в себя сочетание буквального текста и переменных ( client_id заполняется динамически).
  • StatusCode и ReasonPhrase включают только буквальный текст; однако эти элементы также поддерживают шаблоны сообщений, если вы хотите их использовать.

Пример

В определении прокси-сервера TargetEndpoint дочерние элементы <SSLInfo> поддерживают шаблоны сообщений. Следуя той же схеме, что и в политиках, переменные потока в фигурных скобках заменяются при выполнении прокси.

<TargetEndpoint name="default">
  …
  <HTTPTargetConnection>
    <SSLInfo>
        <Enabled>{myvars.ssl.enabled}</Enabled>
        <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled>
        <KeyStore>{myvars.ssl.keystore}</KeyStore>
        <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias>
        <TrustStore>{myvars.ssl.trustStore}</TrustStore>
    </SSLInfo>

  </HTTPTargetConnection>
  …
</TargetEndpoint>

Где можно использовать шаблоны сообщений?

Шаблоны сообщений поддерживаются в нескольких политиках , а также в некоторых элементах, используемых в конфигурации TargetEndpoint .

Политики, принимающие шаблоны сообщений

Политика Элементы и дочерние элементы, поддерживающие шаблоны сообщений.
Политика контроля доступа <SourceAddress> для атрибута mask и IP-адреса.
Политика назначения сообщений Дочерние элементы <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams.

<Add> дочерние элементы: Headers, QueryParams, FormParams.

Дочерний элемент <AssignVariable> : <Template>

Политика ExtensionCallout <Input>
Политика извлечения переменных <JsonPath>
Создать политику JWS
Проверить политику JWS
<Payload> (только политика GenerateJWS )

<AdditionalHeaders><Claim>

* Эти элементы поддерживают шаблон сообщения только в том случае, если type=map .

Создать политику JWT
Проверьте политику JWT
<AdditionalClaims><Claim>

<AdditionalHeaders><Claim>

* Эти элементы поддерживают шаблон сообщения только в том случае, если type=map .

Политика LDAP <SearchQuery>
Политика регистрации сообщений <Syslog><Message>

<File><Message>

Политика проверки OAS Элемент <OASResource>
Политика RaiseFault Элементы <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams.

Элементы <Add> : Заголовки, QueryParams, FormParams.

SAMLAПолитика утверждений <Template>

* Только если подпись политики <GenerateSAMLAssertion>

Политика ServiceCallout Элементы <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams.

Элементы <Add> : Заголовки, QueryParams, FormParams.

<HTTPTargetConnection>/<URL> : обратите внимание, что первая часть строки должна быть http или https.

Элементы TargetEndpoint, принимающие шаблоны сообщений.

Элементы HTTPTargetConnection Дочерние элементы, поддерживающие шаблоны сообщений
SSLInfo Включено, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore
Локалтаржетконнектион АпиПрокси, ПроксиКонечная точка
Путь Н/Д

Синтаксис шаблона сообщения

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

Используйте фигурные скобки для обозначения переменных

Заключите имена переменных в фигурные скобки { } . Если переменная не существует, на выходе возвращается пустая строка; однако вы можете указать значения по умолчанию в шаблонах сообщений (значения, которые заменяются, если переменная не разрешена). См. раздел Установка значений по умолчанию в шаблонах сообщений .

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

<Set>
    <Headers>
        <Header name="x-h1">"Hello {user.name}"</Header>
        <Header name="x-h1">Hello {user.name}</Header>
    </Headers>
</Set>

Установка значений по умолчанию в шаблонах сообщений

Если шаблонную переменную невозможно разрешить, Edge заменяет пустую строку. Однако вы можете указать значение по умолчанию следующим образом:

<Header name="x-h1">Test message. id = {request.header.id:Unknown}</Header>

В приведенном выше примере, если переменная request.header.id не может быть разрешена, ее значение заменяется на Unknown . Например:

Test message. id = Unknown

Пробелы не допускаются в выражениях функций.

Пробелы в выражениях функций шаблона сообщения не допускаются. Например:

Допустимый:

{substring(alpha,0,4)}
{createUuid()}
{randomLong(10)}

Не разрешено:

{substring( alpha, 0, 4 )}
{ createUuid( ) }
{randomLong( 10 )}

Устаревший синтаксис для полезных данных JSON

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

<Set>
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
    {"name":"foo", "type":"@variable_name#"}
  </Payload>
</Set>

Хотя Apigee рекомендует использовать новый синтаксис фигурных скобок, старый синтаксис по-прежнему работает.

Использование функций шаблона сообщения

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

Функции шаблона сообщения подробно описаны в Справочнике по функциям шаблона сообщения .

Пример: toLowerCase()

Используйте встроенную функцию toLowerCase() для преобразования строковой переменной в нижний регистр:

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
        <Headers>
            <Header name="x-h1">Test header: {toLowerCase(foo.bar:FOO)}</Header>
        </Headers>
    </Set>
</AssignMessage>

Если переменная потока foo.bar разрешается, то все ее символы будут строчными. Если foo.bar не разрешен, то значение по умолчанию FOO заменяется и преобразуется в символы нижнего регистра. Например:

Test header: foo

Пример: escapeJSON()

Вот интересный вариант использования: допустим, ваше серверное приложение возвращает ответ JSON, содержащий допустимые escape-символы. Например:

{
      "code": "INVALID",
      "user_message": "Invalid value for \"logonId\" check your input."
}

Затем, предположим, вы хотите вернуть это сообщение вызывающему клиенту в пользовательской полезной нагрузке. Обычный способ сделать это — извлечь сообщение из полезных данных целевого ответа и использовать Assign Message, чтобы добавить его в пользовательский ответ прокси (то есть отправить его обратно клиенту).

Вот политика извлечения переменных, которая извлекает информацию user_message в переменную с именем standard.systemMessage :

<ExtractVariables name="EV-BackendErrorResponse">
    <DisplayName>EV-BackendErrorResponse</DisplayName>
    <JSONPayload>
        <Variable name="standard.systemMessage">
            <JSONPath>$.user_message</JSONPath>
        </Variable>
    </JSONPayload>
</ExtractVariables>

Теперь вот совершенно допустимая политика Assign Message, которая добавляет извлеченную переменную в полезную нагрузку ответа (ответ прокси):

<AssignMessage name="AM-SetStandardFaultResponse">
    <DisplayName>AM-SetStandardFaultResponse</DisplayName>
    <Set>
        <Payload contentType="application/json">
           {
              "systemMessage": "{standard.systemMessage}"
           }
        </Payload>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>


К сожалению, есть проблема. Политика извлечения переменных удалила экранированные кавычки вокруг части сообщения. Это означает, что ответ, возвращаемый клиенту, является недействительным JSON. Это явно не то, что вы хотели!

{
    "systemMessage": "Invalid value for "logonId" check your input."
}

Чтобы обойти эту проблему, вы можете изменить политику назначения сообщений, чтобы использовать функцию шаблона сообщения , которая экранирует кавычки в JSON. Эта функция escapeJSON() экранирует любые кавычки или другие специальные символы, встречающиеся в выражении JSON:

<AssignMessage name="AM-SetStandardFaultResponse">
    <DisplayName>AM-SetStandardFaultResponse</DisplayName>
    <Set>
        <Payload contentType="application/json">
           {
              "systemMessage": "{escapeJSON(standard.systemMessage)}"
           }
        </Payload>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>


Функция экранирует встроенные кавычки, в результате чего получается действительный JSON, а это именно то, что вам нужно:

{
      "systemMessage": "Invalid value for \"logonId\" check your input.",
}

Шаблон сообщения — это функция динамической замены строк, которую можно использовать в определенных политиках и определениях TargetEndpoint. Функции шаблона сообщения позволяют выполнять в шаблоне сообщения такие полезные операции, как хеширование, манипулирование строками, экранирование символов и другие.

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

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Test header: {Hello, toLowerCase(user.name)}</Header>
       </Headers>
    </Set>
</AssignMessage>

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

Хэш-функции

Вычислите значение хеш-функции и верните строковое представление этого хеша.

Шестнадцатеричные хеш-функции

Вычислите значение хеш-функции и верните строковое представление этого хеша в виде шестнадцатеричного числа.

Синтаксис

Функция Описание
md5Hex(string) Вычисляет хэш MD5, выраженный в виде шестнадцатеричного числа.
sha1Hex(string) Вычисляет хэш SHA1, выраженный в виде шестнадцатеричного числа.
sha256Hex(string) Вычисляет хэш SHA256, выраженный в виде шестнадцатеричного числа.
sha384Hex(string) Вычисляет хэш SHA384, выраженный в виде шестнадцатеричного числа.
sha512Hex(string) Вычисляет хэш SHA512, выраженный в виде шестнадцатеричного числа.

Аргументы

строка — хеш-функции принимают один строковый аргумент, на основе которого вычисляется хэш-алгоритм. Аргументом может быть литеральная строка или строковая переменная потока.

Примеры

Вызов функции:

sha256Hex('abc')

Результат:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

Вызов функции:

var str = 'abc';
sha256Hex(str)

Результат:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

Хэш-функции Base64

Вычислите значение хеш-функции и верните строковое представление этого хеша в виде значения в кодировке Base64.

Синтаксис

Функция Описание
md5Base64(string) Вычисляет хэш MD5, выраженный как значение в кодировке Base64.
sha1Base64(string) Вычисляет хэш SHA1, выраженный как значение в кодировке Base64.
sha256Base64(string) Вычисляет хэш SHA256, выраженный как значение в кодировке Base64.
sha384Base64(string) Вычисляет хэш SHA384, выраженный как оценщик в кодировке Base64.
sha512Base64(string) Вычисляет хэш SHA512, выраженный как значение в кодировке Base64.

Аргументы

строка — хеш-функции принимают один строковый аргумент, на основе которого вычисляется хэш-алгоритм. Аргументом может быть литеральная строка или строковая переменная потока.

Примеры

Вызов функции:

sha256Base64('abc')

Результат:

ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=

Вызов функции:

var str = 'abc';
sha256Base64(str)

Результат:

ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=

Строковые функции

Выполнение операций со строками в шаблоне сообщения.

Функции кодирования Base64

Кодируйте и декодируйте строки, используя схему кодирования Base64.

Синтаксис

Функция Описание
encodeBase64(string) Кодирует строку, используя кодировку Base64. Например: encodeBase64( value ) , когда value содержит abc , функция возвращает строку: YWJj
decodeBase64(string) Декодирует строку в кодировке Base64. Например: decodeBase64( value ) если value содержит aGVsbG8sIHdvcmxk , функция возвращает строку hello, world .

Аргументы

строка — строка для кодирования или декодирования. Может быть строкой-литералом или переменной потока строк.

Пример

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Hello, {decodeBase64('d29ybGQK')}</Header>
       </Headers>
    </Set>
</AssignMessage>

Функции преобразования регистра

Преобразуйте строку во все буквы верхнего или нижнего регистра.

Синтаксис

Функция Описание
toUpperCase(string) Преобразовать строку в верхний регистр.
toLowerCase(string) Преобразовать строку в нижний регистр.


Аргументы

строка — строка для преобразования. Может быть строкой-литералом или переменной потока строк.

Пример

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Hello, {toLowerCase(user.name)}</Header>
       </Headers>
    </Set>
</AssignMessage>

Функция подстроки

Возвращает символы между начальным и конечным индексом указанной строки.

Синтаксис

substring(str,start_index,end_index)

Аргументы

  • str — литеральная строка или переменная потока строки.
  • start_index — начальный индекс строки.
  • end_index — (необязательно) Конечный индекс строки. Если он не указан, конечный индекс является концом строки.

Примеры

Для следующих примеров предположим, что эти переменные потока существуют:

Имя переменной Ценить
alpha ABCDEFGHIJKLMNOPQRSTUVWXYZ
seven 7


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

Выражение шаблона сообщения Результат
{substring(alpha,22)} WXYZ
hello {substring(alpha,22)} hello WXYZ
{substring(alpha,-4)} WXYZ
{substring(alpha,-8,-4)} STUV
{substring(alpha,0,10)} ABCDEFGHIJ
{substring(alpha,0,seven)} ABCDEFG

Функция «Заменить все»

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

Синтаксис

replaceAll(string,regex,value)

Аргументы

  • строка — литеральная строка или строковая переменная потока, в которой можно выполнить замены.
  • регулярное выражение — регулярное выражение.
  • value — значение для замены всех совпадений регулярных выражений в строке.

Примеры

В следующих примерах предположим, что эти переменные потока существуют:

Имя переменной Ценить
header Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
regex1 "^Bearer "
replacement "TOKEN: "

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

Выражение шаблона сообщения Результат
{replaceAll(header,"9993",'')} Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-
{replaceAll(header,regex1,'')} ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
{replaceAll(header,regex1,replacement)} TOKEN: ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993

Заменить первую функцию

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

Синтаксис

replaceFirst(string,regex,value)

Аргументы

  • строка — литеральная строка или строковая переменная потока, в которой можно выполнить замены.
  • регулярное выражение — регулярное выражение.
  • value — значение, заменяющее совпадения регулярного выражения внутри строки.

Функции escape и кодирования символов

Функции, которые экранируют или кодируют специальные символы в строке.

Синтаксис

Функция Описание
escapeJSON (строка) Обратная косая черта позволяет избежать двойных кавычек.
escapeXML (строка) Заменяет угловые скобки, апостроф, двойные кавычки и амперсанды соответствующими объектами XML. Используйте для документов XML 1.0.

escapeXML11 (строка) Работает так же, как escapeXML, но для объектов XML версии 1.1. См. Примечания по использованию ниже.
кодироватьHTML (строка) Кодирует апостроф, угловые скобки и амперсанд.

Аргументы

строка — строка, которую нужно экранировать. Может быть строкой-литералом или переменной потока строк.

Примечания по использованию

XML 1.1 может представлять определенные управляющие символы, но не может представлять нулевой байт или непарные суррогатные кодовые точки Юникода, даже после экранирования. Функция escapeXML11() удаляет символы, не попадающие в следующие диапазоны:

[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

Функция escapeXML11() экранирует символы в следующих диапазонах:

[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

Примеры

Предположим, что переменная потока с именем food существует со следующим значением: "bread" & "butter" . Тогда функция:

{escapeHTML(food)}

приводит к:

&quot;bread&quot; &amp; &quot;butter&quot;

Функции формата времени

Возвращает строковое представление времени, отформатированное в местном часовом поясе или в формате UTC.

Синтаксис

Функция Описание
timeFormat(format,str) Возвращает дату, отформатированную в местном часовом поясе.
timeFormatMs(format,str) Возвращает дату, отформатированную в местном часовом поясе.
timeFormatUTC(format,str) Возвращает дату в формате UTC.
timeFormatUTCMs(format,str) Возвращает дату в формате UTC.

Аргументы

  • format — строка формата даты/времени. Может быть строкой-литералом или строковой переменной.
  • str — строка или строковая переменная потока, содержащая значение времени. Значение может быть в секундах с эпохи или миллисекундах с эпохи для timeFormatMs.

Примеры

Примите следующие значения и предположите, что местный часовой пояс — Тихоокеанский:

  • epoch_time_ms = 1494390266000
  • epoch_time = 1494390266
  • fmt1 = yyyy-MM-dd
  • fmt2 = yyyy-MM-dd HH-mm-ss
  • fmt3 = yyyyMMddHHmmss

Функции возвращают следующие результаты:

    Функция Выход
    timeFormatMs(fmt1,epoch_time_ms) 2017-05-09
    timeFormat(fmt1,epoch_time) 2017-05-09
    timeFormat(fmt2,epoch_time) 2017-05-09 21:24:26
    timeFormat(fmt3,epoch_time) 20170509212426
    timeFormatUTC(fmt1,epoch_time) 2017-05-10
    timeFormatUTC(fmt2,epoch_time) 2017-05-10 04:24:26
    timeFormatUTC(fmt3,epoch_time) 20170510042426

    Функции расчета HMAC

    Функции расчета HMAC предоставляют альтернативу использованию политики HMAC для вычисления HMAC. Эти функции удобны при выполнении каскадного расчета HMAC, например, когда выходные данные одного HMAC используются в качестве ключа для второго HMAC.

    Синтаксис

    Функция Описание
    hmacSha224(key,valueToSign[,keyencoding[,outputencoding]]) Вычисляет HMAC с помощью хэш-функции SHA-224.
    hmacSha256(key,valueToSign[,keyencoding[,outputencoding]]) Кодирует HMAC с помощью хэш-функции SHA-256.
    hmacSha384(key,valueToSign[,keyencoding[,outputencoding]]) Кодирует HMAC с помощью хэш-функции SHA-384.
    hmacSha512(key,valueToSign[,keyencoding[,outputencoding]]) Кодирует HMAC с помощью хэш-функции SHA-512.
    hmacMd5(key,valueToSign[,keyencoding[,outputencoding]]) Кодирует HMAC с помощью хэш-функции MD5.
    hmacSha1(key, valueToSign [,keyencoding[,outputencoding]]) Кодирует HMAC с помощью алгоритма шифрования SHA-1.

    Аргументы

    • ключ — (обязательно) Указывает секретный ключ, закодированный в виде строки, используемый для вычисления HMAC.
    • valueToSign — (обязательно) Указывает сообщение, которое нужно подписать. Это должна быть строка.
    • keyencoding — (Необязательно) Строка секретного ключа будет декодирована в соответствии с указанной кодировкой. Допустимые значения: hex , base16 , base64 , utf-8 . По умолчанию: utf-8
    • outputencoding — (необязательно) Указывает алгоритм кодирования, используемый для вывода. Допустимые значения: hex , base16 , base64 . Значения нечувствительны к регистру; hex и base16 являются синонимами. По умолчанию: base64

    Примеры

    В этом примере используется политика AssignMessage для вычисления HMAC-256 и назначения его переменной потока:

    <AssignMessage name='AM-HMAC-1'>
      <AssignVariable>
        <Name>valueToSign</Name>
        <Template>{request.header.apikey}.{request.header.date}</Template>
      </AssignVariable>
      <AssignVariable>
        <Name>hmac_value</Name>
        <Template>{hmacSha256(private.secretkey,valueToSign)}</Template>
      </AssignVariable>
    </AssignMessage>
    

    В этом примере показано, как создать каскадный HMAC, который можно использовать с процессом подписания AWS Signature v4 . В примере используется политика AssignMessage для создания пяти уровней каскадного HMAC, используемых для расчета подписи для AWS Signature v4:

    <AssignMessage name='AM-HMAC-AWS-1'>
      <!-- 1 -->
      <AssignVariable>
        <Name>DateValue</Name>
        <Template>{timeFormatUTCMs('yyyyMMdd',system.timestamp)}</Template>
      </AssignVariable>
      <!-- 2 -->
      <AssignVariable>
        <Name>FirstKey</Name>
        <Template>AWS4{private.secret_aws_access_key}</Template>
      </AssignVariable>
      <!-- 3 -->
      <AssignVariable>
        <Name>DateKey</Name>
        <Template>{hmacSha256(FirstKey,DateValue,'utf-8','base16')}</Template>
      </AssignVariable>
      <!-- 4 -->
      <AssignVariable>
        <Name>DateRegionKey</Name>
        <Template>{hmacSha256(DateKey,aws_region,'base16','base16')}</Template>
      </AssignVariable>
      <!-- 5 -->
      <AssignVariable>
        <Name>DateRegionServiceKey</Name>
        <Template>{hmacSha256(DateRegionKey,aws_service,'base16','base16')}</Template>
      </AssignVariable>
      <!-- 6 -->
      <AssignVariable>
        <Name>SigningKey</Name>
        <Template>{hmacSha256(DateRegionServiceKey,'aws4_request','base16','base16')}</Template>
      </AssignVariable>
      <!-- 7 -->
      <AssignVariable>
        <Name>aws4_hmac_value</Name>
        <Template>{hmacSha256(SigningKey,stringToSign,'base16','base16')}</Template>
      </AssignVariable>
    </AssignMessage>
    

    Другие функции

    Создать функцию UUID

    Генерирует и возвращает UUID.

    Синтаксис

    createUuid()
    

    Аргументы

    Никто.

    Пример

    { createUuid()}

    Пример результата:

    ec3ca9be-d1e1-4ef4-aee4-4a58f3130db8
    

    Функция случайного длинного генератора

    Возвращает случайное длинное целое число.

    Синтаксис

    randomLong(args)
    

    Аргументы

    • Если аргументы не указаны, функция возвращает случайное длинное целое число, вычисленное классом Java SecureRandom.
    • Если присутствует один аргумент, он рассматривается как минимальное значение вычисления.
    • Если присутствует второй аргумент, он рассматривается как максимальное значение вычисления.

    Пример

    {random()}
    

    получается что-то вроде этого:

    5211338197474042880
    

    Генератор текста регулярных выражений

    Создайте текстовую строку, соответствующую заданному регулярному выражению.

    Синтаксис

    xeger(regex)
    

    Аргумент

    регулярное выражение — регулярное выражение.

    Пример

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

    xeger('[1-9]{7}')
    

    Пример результата:

    9857253
    

    Функция объединения нулей

    Функция firstnonnull() возвращает значение крайнего левого аргумента, отличного от NULL.

    Синтаксис

    firstnonnull(var1,varn)
    

    Аргумент

    var1 — контекстная переменная.

    var n — одна или несколько переменных контекста. Вы можете установить самый правый аргумент в строку, чтобы предоставить резервное значение (значение, которое будет установлено, если ни один из левых аргументов не установлен).

    Примеры

    В следующей таблице показано, как использовать эту функцию:

    Шаблон Вар1 Вар2 Вар3 Результат
    {firstnonnull(var1,var2)} Не установлено foo Н/Д foo
    {firstnonnull(var1,var2)} foo bar Н/Д foo
    {firstnonnull(var1,var2)} foo Не установлено Н/Д foo
    {firstnonnull(var1,var2,var3)} foo bar baz foo
    {firstnonnull(var1,var2,var3)} Не установлено bar baz bar
    {firstnonnull(var1,var2,var3)} Не установлено Не установлено baz baz
    {firstnonnull(var1,var2,var3)} Не установлено Не установлено Не установлено null
    {firstnonnull(var1)} Не установлено Н/Д Н/Д null
    {firstnonnull(var1)} foo Н/Д Н/Д foo
    {firstnonnull(var1,var2)} "" bar Н/Д ""
    {firstnonnull(var1,var2,'fallback value')} null null fallback value fallback value

    Функция XPath

    Применяет выражение XPath к переменной XML.

    Синтаксис

    xpath(xpath_expression,xml_string,[datatype])
    

    Аргументы

    xpath_expression — выражение XPath.

    xml_string — переменная потока или строка, содержащая XML.

    тип данных — (необязательно) Указывает желаемый тип возвращаемого значения запроса. Это может быть набор узлов, узел, число, логическое значение, строка. По умолчанию используется набор узлов. Значение по умолчанию обычно является правильным выбором.

    Пример 1

    Предположим, что эти переменные контекста определяют строку XML и выражение XPath:

    xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>"
    xpath = "/tag/tagid"

    А функция xpath() используется в политике AssignMessage следующим образом:

    <AssignMessage>
      <AssignVariable>
        <Name>extracted_tag</Name>
        <Template>{xpath(xpath,xml)}</Template>
      </AssignVariable>
    </AssignMessage><

    Функция возвращает значение <tagid>250397</tagid> . Это значение помещается в переменную контекста с именем extracted_tag .

    Пример 2

    Если вам нужно только значение узла, используйте функцию text() следующим образом:

    <AssignMessage>
      <AssignVariable>
        <Name>extracted_tag</Name>
        <Template>{xpath('/tag/tagid/text()',xml)}</Template>
      </AssignVariable>
    </AssignMessage>

    В результате этой операции контекстная переменная extracted_tag ​​имеет значение 250397

    Если выбрано несколько узлов, то результатом xpath() будут все значения выбора, объединенные запятой.

    Пример 3: Пространства имен XML

    Чтобы указать пространство имен, добавьте дополнительные параметры, каждый из которых представляет собой строку вида prefix:namespaceuri . Например, функция xpath() , которая выбирает дочерний элемент тела SOAP, может быть такой:

    <AssignMessage>
      <AssignVariable>
        <Name>soapns</Name>
        <Value>soap:http://schemas.xmlsoap.org/soap/envelope/</Value>
      </AssignVariable>
      <AssignVariable>
        <Name>xpathexpression</Name>
        <Value>/soap:Envelope/soap:Body/*</Value>
      </AssignVariable>
      <AssignVariable>
        <Name>extracted_element</Name>
        <Template>{xpath(xpathexpression,xml,soapns)}</Template>
      </AssignVariable>
    </AssignMessage>

    Для дополнительных пространств имен вы можете добавить до 10 дополнительных параметров в функцию xpath() .

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

    {xpath('/tag/tagid/text()',xml)}

    Если выражение XPath включает префиксы пространства имен (и двоеточия), вам необходимо назначить это выражение XPath переменной и указать имя переменной, а не выражение напрямую.

    {xpath(xpathexpression,xml,ns1)}

    Пример 4. Указание желаемого типа возвращаемого значения

    Необязательный третий параметр, передаваемый функции xpath() , указывает желаемый тип возвращаемого значения запроса.

    Некоторые запросы XPath могут возвращать числовые или логические значения. Например, функция count() возвращает число. Это действительный запрос XPath:

    count(//Record/Fields/Pair)
    

    Этот допустимый запрос возвращает логическое значение:

    count(//Record/Fields/Pair)>0
    

    В этих случаях вызовите функцию xpath() с третьим параметром, указывающим этот тип:

    {xpath(expression,xml,'number')}
    {xpath(expression,xml,'boolean')}

    Если третий параметр содержит двоеточие, оно интерпретируется как аргумент пространства имен. Если нет, то он рассматривается как желаемый тип возвращаемого значения. В этом случае, если третий параметр не является одним из допустимых значений (без учета регистра), функция xpath() по умолчанию возвращает набор узлов.

    Функция пути JSON

    Применяет выражение JSON Path к переменной JSON.

    Синтаксис

    jsonPath(json-path,json-var,want-array)

    Аргументы

    • (Обязательно) json-path : (Строка) Выражение пути JSON.
    • (Обязательно) json-var : (String) Переменная потока или строка, содержащая JSON.
    • (Необязательно) want-array : (String) Если для этого параметра установлено значение 'true' и если набор результатов представляет собой массив, то возвращаются все элементы массива. Если установлено любое другое значение или этот параметр опущен, возвращается только нулевой элемент массива набора результатов. Если набор результатов не является массивом, то этот третий параметр, если он присутствует, игнорируется.

    Пример 1

    Если это шаблон сообщения:

    The address is {jsonPath($.results[?(@.name == 'Mae West')].address.line1,the_json_variable)}

    и the_json_variable содержит:

    {
      "results" : [
        {
          "address" : {
            "line1" : "18250 142ND AV NE",
            "city" : "Woodinville",
            "state" : "Washington",
            "zip" : "98072"
          },
          "name" : "Fred Meyer"
        },
        {
          "address" : {
            "line1" : "1060 West Addison Street",
            "city" : "Chicago",
            "state" : "Illinois",
            "zip" : "60613"
          },
          "name" : "Mae West"
        }
      ]
    } 

    Результат функции:

    The address is 1060 West Addison Street

    Обратите внимание, что в этом случае набор результатов представляет собой один элемент (а не массив элементов). Если бы результирующий набор был массивом, то был бы возвращен только нулевой элемент массива. Чтобы вернуть полный массив, вызовите функцию с 'true' в качестве третьего параметра, как показано в следующем примере.

    Пример 2

    Если это шаблон сообщения:

    {jsonPath($.config.quota[?(@.operation=='ManageOrder')].appname,the_json_variable,'true')}

    и the_json_variable содержит:

    {
      "results" : [
         {
          "config": {
            "quota": [
              {
                "appname": "A",
                "operation": "ManageOrder",
                "value": "900"
              },
              {
                "appname": "B",
                "operation": "ManageOrder",
                "value": "1000"
              },
              {
                "appname": "B",
                "operation": "SubmitOrder",
                "value": "800"
              }
            ]
          }
        }
      ]
    } 

    Результат функции:

    ['A','B']