Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этой теме обсуждается, как использовать шаблоны сообщений в 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> поддерживают создание шаблонов сообщений:
- Заголовок
- QueryParam
- FormParam
- PayLoad
- Версия
- Глагол
- Путь
- Код состояния
- Разумная фраза
Ещё раз обращаем ваше внимание на то, что переменные потока в шаблоне сообщения должны быть заключены в фигурные скобки .
Когда эта политика выполняется:
- Элементы заголовка получают значения указанных переменных потока.
- Полезная нагрузка содержит смесь текстовых данных и переменных (
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 .
Политики, принимающие шаблоны сообщений
| Политика | Элементы и дочерние элементы, поддерживающие шаблоны сообщений. |
|---|---|
| Политика AccessControl | <SourceAddress> — атрибут mask и IP-адрес. |
| Политика AssignMessage | <Set> дочерние элементы: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams Дочерний элемент |
| Политика вызова расширений | <Input> |
| политика ExtractVariables | <JsonPath> |
| Сгенерировать политику JWS Политика VerifyJWS | <Payload> (Только для генерации политики JWS ) * Эти элементы поддерживают шаблоны сообщений только при type=map . |
| Сгенерировать политику JWT Политика VerifyJWT | <AdditionalClaims><Claim> * Эти элементы поддерживают шаблоны сообщений только при type=map . |
| Политика LDAP | <SearchQuery> |
| Политика ведения журнала сообщений | <Syslog><Message> |
| Политика проверки OAS | элемент |
| Политика RaiseFault | Элементы <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams |
| Политика утверждения SAMLA | <Template> * Только если сигнатура политики — |
| Политика вызова сервисной службы | Элементы <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams |
Элементы TargetEndpoint, принимающие шаблоны сообщений.
| Элементы HTTPTargetConnection | Дочерние элементы, поддерживающие шаблоны сообщений. |
|---|---|
| SSLInfo | Enabled, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore |
| LocalTargetConnection | ApiProxy, ProxyEndpoint |
| Путь | При использовании элемента LoadBalancer элемент Path становится активным и принимает шаблон сообщения. |
Синтаксис шаблона сообщения
В этом разделе объясняются правила, которым необходимо следовать при использовании шаблонов сообщений.
Для обозначения переменных используйте фигурные скобки.
Имена переменных заключайте в фигурные скобки { } . Если переменная не существует, в выходных данных возвращается пустая строка; однако вы можете указать значения по умолчанию в шаблонах сообщений (значения, которые подставляются, если переменная не определена). См. раздел «Установка значений по умолчанию в шаблонах сообщений» .
Обратите внимание, что заключение всей строки шаблона сообщения в кавычки допускается, но необязательно. Например, следующие два шаблона сообщений эквивалентны:
<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 release 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-ответ, содержащий допустимые экранирующие символы. Например:
{
"code": "INVALID",
"user_message": "Invalid value for \"logonId\" check your input."
}Допустим, вы хотите вернуть это сообщение вызывающему клиенту в пользовательской полезной нагрузке. Обычно это делается путем извлечения сообщения из полезной нагрузки целевого ответа и использования функции «Назначить сообщение», чтобы добавить его в пользовательский ответ прокси-сервера (то есть отправить его обратно клиенту).
Вот политика извлечения переменных, которая извлекает информацию user_message в переменную с именем standard.systemMessage :
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
А вот совершенно корректная политика назначения сообщений, которая добавляет извлеченную переменную в полезную нагрузку ответа (ответ прокси-сервера):
<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 . |
Аргументы
string — строка для кодирования или декодирования. Может быть строковым литералом или строковой переменной потока.
Пример
<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) | Преобразовать строку в нижний регистр. |
Аргументы
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)
Аргументы
- строка — строковый литерал или строковая переменная потока, в которой производится замена.
- regex — регулярное выражение.
- 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)
Аргументы
- строка — строковый литерал или строковая переменная потока, в которой производится замена.
- regex — регулярное выражение.
- value — значение, подлежащее замене совпадений в строке, найденных с помощью регулярных выражений.
Функции экранирования и кодирования символов
Функции, которые экранируют или кодируют специальные символы в строке.
Синтаксис
| Функция | Описание |
|---|---|
| escapeJSON(string) | Обратная косая черта экранирует двойные кавычки. |
| escapeXML(string) | Заменяет угловые скобки, апостроф, двойные кавычки и амперсанды соответствующими XML-сущностями. Используется для документов XML 1.0. |
| escapeXML11(string) | Работает аналогично escapeXML, но для сущностей XML версии 1.1. См. примечания по использованию ниже. |
| encodeHTML(string) | Обозначает апостроф, угловые скобки и амперсанд. |
Аргументы
string — строка для экранирования. Может быть строковым литералом или строковой переменной потока.
Примечания по использованию
XML 1.1 может представлять определенные управляющие символы, но не может представлять нулевой байт или непарные суррогатные кодовые точки Unicode, даже после экранирования. Функция escapeXML11() удаляет символы, которые не попадают в следующие диапазоны:
[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Функция escapeXML11() экранирует символы в следующих диапазонах:
[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
Примеры
Предположим, существует переменная потока с именем food , имеющая следующие значения: "bread" & "butter" . Тогда функция:
{escapeHTML(food)}в результате:
"bread" & "butter"Функции форматирования времени
Возвращает строковое представление времени, отформатированное в соответствии с местным часовым поясом или в формате 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
Функции возвращают следующие результаты:
- key - (Обязательно) Указывает секретный ключ, закодированный в виде строки, используемый для вычисления HMAC.
- valueToSign - (Обязательно) Указывает сообщение для подписи. Это должна быть строка.
- keyencoding - (Необязательно) Строка секретного ключа будет декодирована в соответствии с указанной кодировкой. Допустимые значения:
hex,base16,base64,utf-8. По умолчанию:utf-8 - outputencoding - (Необязательно) Указывает алгоритм кодирования, используемый для вывода. Допустимые значения:
hex,base16,base64. Значения нечувствительны к регистру;hexиbase16являются синонимами. По умолчанию:base64 - Если аргументы не указаны, функция возвращает случайное целое число типа long, вычисленное классом Java SecureRandom.
- Если присутствует хотя бы один аргумент, он рассматривается как минимальное значение вычислений.
- Если присутствует второй аргумент, он рассматривается как максимальное значение вычислений.
- (Обязательно)
json-path: (Строка) Выражение пути в формате JSON. - (Обязательно)
json-var: (Строка) Переменная потока или строка, содержащая JSON. - (Необязательный)
want-array: (Строка) Если этот параметр установлен в значение'true'и результирующий набор является массивом, то возвращаются все элементы массива. Если установлено любое другое значение или этот параметр опущен, то возвращается только нулевой элемент результирующего массива. Если результирующий набор не является массивом, то этот третий параметр, если он присутствует, игнорируется.
| Функция | Выход |
|---|---|
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. |
Аргументы
Примеры
В этом примере используется политика 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)
Аргументы
Пример
{random()}В результате получается что-то вроде этого:
5211338197474042880Генератор текста на основе регулярных выражений
Сгенерировать текстовую строку, соответствующую заданному регулярному выражению.
Синтаксис
xeger(regex)
Аргумент
regex — регулярное выражение.
Пример
В этом примере генерируется семизначная строка без нулей:
xeger('[1-9]{7}')Пример результата:
9857253Функция нулевого слияния
Функция firstnonnull() возвращает значение самого левого ненулевого аргумента.
Синтаксис
firstnonnull(var1,varnn>)
Аргумент
var1 — контекстная переменная.
var n - Одна или несколько контекстных переменных. Вы можете установить самый правый аргумент в виде строки, чтобы указать резервное значение (значение, которое будет установлено, если ни один из левых аргументов не установлен).
Примеры
В следующей таблице показано, как использовать эту функцию:
| Шаблон | Var1 | Var2 | Var3 | Результат |
|---|---|---|---|---|
{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-данные.
datatype — (Необязательно) Указывает желаемый тип возвращаемого значения запроса. Это может быть nodeset, node, number, boolean, string. По умолчанию используется nodeset. Обычно это правильный выбор по умолчанию.
Пример 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>
Для добавления дополнительных пространств имен в функцию xpath() можно добавить до 10 дополнительных параметров.
Простое выражение 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 Path
Применяет выражение JSON Path к переменной JSON.
Синтаксис
jsonPath(json-path,json-var,want-array)
Аргументы
Пример 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']