Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
Este tópico aborda como usar modelos de mensagens em proxies de API e fornece uma referência de funções.
O que é um modelo de mensagem?
Um modelo de mensagem permite-lhe fazer a substituição de strings variáveis em determinados elementos de políticas e <TargetEndpoint>
. Esta funcionalidade, quando suportada,
permite-lhe preencher strings dinamicamente quando um proxy é executado.
Pode incluir qualquer combinação de referências de variáveis de fluxo e texto literal num modelo de mensagem. Os nomes das variáveis de fluxo têm de estar entre chavetas, enquanto qualquer texto que não esteja entre chavetas é apresentado como texto literal.
Consulte também Onde pode usar modelos de mensagens?
Exemplo
Por exemplo, a política AssignMessage permite-lhe usar um modelo de mensagem no elemento
<Payload>
:
<AssignMessage name="AM-set-payload-with-dynamic-content"> <Set> <Payload contentType="application/json"> {"name":"Alert", "message":"You entered an invalid username: {user.name}"} </Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
No exemplo acima, o valor da variável de fluxo user.name
(entre chavetas) será avaliado e substituído na string de payload no momento da execução. Por exemplo, se
user.name=jdoe
,
a mensagem resultante no payload será: You entered an invalid username:
jdoe
. Se não for possível resolver a variável, é gerada uma string vazia.
Exemplo
Quando uma quota é excedida, é uma boa prática devolver uma mensagem significativa ao autor da chamada. Este padrão é usado frequentemente com uma "regra de falha" para fornecer resultados que dão ao autor da chamada informações sobre a violação de quota. Na política AssignMessage seguinte, os modelos de mensagens são usados para preencher dinamicamente informações de quotas em vários elementos 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> </Set> </AssignMessage>
Na política AssignMessage, os seguintes elementos no elemento <Set>
suportam a utilização de modelos de mensagens:
<Header>
<QueryParam>
<FormParam>
<PayLoad>
<Version>
<Verb>
<Path>
<StatusCode>
Mais uma vez, tenha em atenção que as variáveis de fluxo num modelo de mensagem têm de estar entre chavetas.
Quando esta política é executada:
- Os elementos
<Header>
recebem valores das variáveis de fluxo especificadas. - O payload inclui uma combinação de texto literal e variáveis (o
client_id
é preenchido dinamicamente). - O elemento
<StatusCode>
inclui apenas texto literal. No entanto, este elemento também suporta modelos de mensagens se quiser usá-los.
Exemplo
Numa definição de proxy <TargetEndpoint>
, os elementos subordinados de
<SSLInfo>
suportam a utilização de modelos de mensagens. Seguindo o mesmo padrão usado nas políticas, as variáveis de fluxo entre chavetas são substituídas quando o proxy é executado.
<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>
Onde pode usar modelos de mensagens?
Os modelos de mensagens são suportados em várias políticas, bem como em determinados elementos usados na configuração TargetEndpoint.
Políticas que aceitam modelos de mensagens
A tabela seguinte indica as políticas e os elementos/elementos secundários suportados:
Política | Elementos/elementos secundários |
---|---|
Política AccessControl | <SourceAddress> , para o atributo mask e o endereço IP. |
Política AssignMessage | <Set> elementos secundários: Payload, ContentType, Verb, Version, Path, StatusCode, Headers, QueryParams, FormParams
Elemento secundário |
Política de CORS | |
Política ExtractVariables | <JsonPath>
|
Política GenerateJWS Política VerifyJWS |
* Estes elementos suportam o modelo de mensagem apenas quando type=map. |
Política GenerateJWT Política VerifyJWT |
<AdditionalClaims><Claim>
* Estes elementos suportam o modelo de mensagem apenas quando type=map. |
Política HTTPModifier | <Set> elementos secundários:
|
Política de MessageLogging |
|
Política de validação da OAS | elemento
|
Política RaiseFault |
|
Política de SAMLAssertion | <Template>
* Apenas quando a assinatura da política é |
Política de textos destacados de serviços |
|
<TargetEndpoint>
elementos que aceitam modelos de mensagens
<HTTPTargetConnection> elementos |
Elementos secundários que suportam modelos de mensagens |
---|---|
<SSLInfo> |
<Enabled> , <KeyAlias> , <KeyStore> ,
<TrustStore> , <ClientAuthEnabled> ,
<CLRStore>
|
<LocalTargetConnection> |
<ApiProxy> , <ProxyEndpoint> , <Path> |
<Path> |
N/A |
<URL> |
Sem elementos subordinados. Consulte a secção Modelos de URL para ver a utilização. |
Sintaxe do modelo de mensagem
Esta secção explica as regras que tem de seguir para usar modelos de mensagens.
Use chavetas para denotar variáveis
Coloque os nomes das variáveis entre chavetas { }. Se a variável não existir, é devolvida uma string vazia na saída. No entanto, pode especificar valores predefinidos nos modelos de mensagens (valores que são substituídos se a variável não for resolvida). Consulte o artigo Definir valores predefinidos em modelos de mensagens.
Tenha em atenção que incluir toda a string do modelo de mensagem entre aspas é permitido, mas opcional. Por exemplo, os dois modelos de mensagens seguintes são equivalentes:
<Set> <Headers> <Header name="x-h1">"Hello {user.name}"</Header> <Header name="x-h1">Hello {user.name}</Header> </Headers> </Set>
Não são permitidos espaços em expressões de funções
Não são permitidos espaços em nenhuma parte das expressões de funções de modelos de mensagens. Por exemplo:
Permitido:
{substring(alpha,0,4)} {createUuid()} {randomLong(10)}
Não permitido:
{substring( alpha, 0, 4 )} { createUuid( ) } {randomLong( 10 )}
As funções aninhadas não são suportadas
A chamada de uma função dentro de outra função num modelo não é suportada. Por exemplo, não pode usar:
{substring({timeFormat('yyyy-MM-dd','1494390266')},0,4)}
Inclua literais de strings em funções de modelos entre aspas simples
Quando fornecer literais de strings em funções, coloque-os entre aspas simples em vez de aspas duplas.
Por exemplo,{replaceAll('BEARER: 1234','^Bearer ','TOKEN:')}
Evite usar carateres especiais em literais de strings
Evite carateres especiais, como ":", "/", "\", "<" ou ">", em literais de strings. Estes carateres podem causar erros. Se um literal de string exigir carateres especiais, atribua o valor a uma variável através de uma política de Python ou JavaScript e, em seguida, use a variável no modelo.
Definir valores predefinidos em modelos de mensagens
Se não for possível resolver uma variável baseada em modelos, o Apigee substitui-a por uma string vazia. No entanto, pode especificar um valor predefinido da seguinte forma:
<Header name="x-h1">Test message. id = {request.header.id:Unknown}</Header>
No exemplo acima, se não for possível resolver a variável request.header.id
, o respetivo valor é substituído por Unknown
. Por exemplo:
Test message. id = Unknown
Modelos de URLs
O elemento URL
suporta a utilização de modelos seguindo a mesma sintaxe que outros elementos.
Este exemplo mostra um URL criado com variáveis:
<URL>{targeturl}</URL>
Este exemplo mostra um valor predefinido para o protocolo:
<URL>{protocol:https}://{site:google.com}/path</URL>
Sintaxe antiga para payloads JSON
Nas versões do Apigee anteriores ao lançamento na nuvem 16.08.17, não podia usar chavetas para denotar referências de variáveis em payloads JSON. Nessas versões mais antigas, tinha de usar os atributos variablePrefix
e variableSuffix
para especificar carateres delimitadores e usá-los para incluir nomes de variáveis, da seguinte forma:
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo","type":"@variable_name#"} </Payload> </Set>
Embora a Apigee recomende que use a sintaxe de chavetas mais recente, a sintaxe mais antiga continua a funcionar.
Usar funções de modelos de mensagens
A Apigee fornece um conjunto de funções que pode usar em modelos de mensagens para aplicar escape, codificar, aplicar hash e formatar variáveis de string, conforme descrito abaixo.
Exemplo: toLowerCase()
Use a função integrada toLowerCase()
para transformar uma variável de string em
minúsculas:
<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>
Se a variável de fluxo foo.bar
for resolvida, os respetivos carateres vão estar todos em minúsculas.
Se foo.bar
não for resolvido, o valor predefinido FOO
é substituído e convertido em carateres em minúsculas. Por exemplo:
Test header: foo
Exemplo: escapeJSON()
Aqui está um exemplo de utilização interessante: suponhamos que a sua app de back-end devolve uma resposta JSON que contém carateres de escape válidos. Por exemplo:
{ "code": "INVALID", "user_message": "Invalid value for \"logonId\" check your input." }
Suponhamos que quer devolver esta mensagem ao autor da chamada cliente numa carga útil personalizada. A forma habitual de o fazer é extrair a mensagem do payload de resposta de destino e usar AssignMessage para a adicionar a uma resposta de proxy personalizada (ou seja, enviá-la de volta para o cliente).
Segue-se a política ExtractVariables que extrai as informações user_message
para uma variável denominada standard.systemMessage
:
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
Agora, segue-se uma política AssignMessage perfeitamente válida que adiciona a variável extraída ao payload de resposta (a resposta do proxy):
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{standard.systemMessage}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
Infelizmente, existe um problema. A política ExtractVariables removeu os carateres de aspas com escape em torno de parte da mensagem. Isto significa que a resposta devolvida ao cliente é JSON inválido. Isto não é claramente o que pretendia!
{ "systemMessage": "Invalid value for "logonId" check your input." }
Para contornar este problema, pode modificar a política AssignMessage para usar uma função de modelo de mensagem que escape as aspas no JSON por si. Esta função, escapeJSON()
, escapa a quaisquer aspas ou outros carateres especiais que ocorram numa expressão JSON:
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{escapeJSON(standard.systemMessage)}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
A função escapa às aspas incorporadas, o que resulta num JSON válido, que é exatamente o que pretendia:
{ "systemMessage": "Invalid value for \"logonId\" check your input.", }
Um modelo de mensagem é uma funcionalidade de substituição de strings dinâmicas que pode usar em determinadas políticas e
em definições de <TargetEndpoint>
. As funções de modelos de mensagens permitem-lhe realizar operações úteis, como hash, manipulação de strings, escape de carateres e outras, num modelo de mensagem.
Por exemplo, na seguinte política AssignMessage, a função toLowerCase()
is
usada num modelo de mensagem:
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo>response</AssignTo> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Test header: Hello, {toLowerCase(user.name)}</Header> </Headers> </Set> </AssignMessage>
Esta secção descreve as funções de modelos de mensagens, os respetivos argumentos e resultados. Este tópico pressupõe que conhece os modelos de mensagens e os contextos em que são usados.
Funções hash
Calcula um valor hash e devolve a representação de string desse hash.
Funções hash hexadecimais
Calcula um valor de hash e devolve a representação de string desse hash como um número hexadecimal.
Sintaxe
Função | Descrição |
---|---|
md5Hex(string) |
Calcula um hash MD5 expresso como um número hexadecimal. |
sha1Hex(string) |
Calcula um hash SHA1 expresso como um número hexadecimal. |
sha256Hex(string) |
Calcula um hash SHA256 expresso como um número hexadecimal. |
sha384Hex(string) |
Calcula um hash SHA384 expresso como um número hexadecimal. |
sha512Hex(string) |
Calcula um hash SHA512 expresso como um número hexadecimal. |
Argumentos
string
: as funções de hash usam um único argumento de string sobre o qual o algoritmo de hash é calculado. O argumento pode ser uma string literal
(entre aspas simples) ou uma variável de fluxo
de string.
Exemplos
Chamada de função:
sha256Hex('abc')
Resultado:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Chamada de função:
var str = 'abc'; sha256Hex(str)
Resultado:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Funções hash Base64
Calcula um valor de hash e devolve a representação de string desse hash como um valor codificado em Base64.
Sintaxe
Função | Descrição |
---|---|
md5Base64(string)
|
Calcula um hash MD5 expresso como um valor codificado em Base64. |
sha1Base64(string)
|
Calcula um hash SHA1 expresso como um valor codificado em Base64. |
sha256Base64(string)
|
Calcula um hash SHA256 expresso como um valor codificado em Base64. |
sha384Base64(string)
|
Calcula um hash SHA384 expresso como um valor codificado em Base64. |
sha512Base64(string)
|
Calcula um hash SHA512 expresso como um valor codificado em Base64. |
Argumentos
string
: As funções de hash selecionam um único argumento de string no qual o algoritmo hash é calculado. O argumento pode ser uma string literal
(entre aspas simples) ou uma variável
de fluxo de string.
Exemplos
Chamada de função:
sha256Base64('abc')
Resultado:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
Chamada de função:
var str = 'abc'; sha256Base64(str)
Resultado:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
Funções de string
Realize operações em strings num modelo de mensagem.
Funções de codificação Base64
Codifique e descodifique strings através do esquema de codificação Base64.
Sintaxe
Função | Descrição |
---|---|
encodeBase64(string)
|
Codifica uma string através da codificação Base64. Por exemplo: encodeBase64(value) , quando value contém
abc , a função devolve a string: YWJj
|
decodeBase64(string)
|
Descodifica uma string codificada em Base64. Por exemplo: decodeBase64(value) quando value contém
aGVsbG8sIHdvcmxk , a função devolve a string hello, world .
|
Argumentos
string
: a string a codificar ou descodificar. Pode ser uma string literal
(delimitada por aspas simples) ou uma variável
de fluxo de string.
Exemplo
<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>
Funções de conversão de maiúsculas/minúsculas
Converter uma string em todas as letras maiúsculas ou minúsculas.
Sintaxe
Função | Descrição |
---|---|
toUpperCase(string)
|
Converte uma string em letras maiúsculas. |
toLowerCase(string)
|
Converte uma string em minúsculas. |
Argumentos
string
: a string a converter. Pode ser uma string literal
(delimitada por aspas simples) ou uma variável
de fluxo de string.
Exemplo
<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>
Função substring
Devolve os carateres entre o índice inicial e final da string especificada.
Sintaxe
substring(str,start_index,end_index)
Argumentos
str
: uma string literal (entre aspas simples) ou uma variável de fluxo de string.start_index
: o índice inicial na string.end_index
: (Opcional) O índice final na string. Se não for fornecido, o índice final é o fim da string.
Exemplos
Para os exemplos seguintes, suponha que estas variáveis de fluxo existem:
Nome da variável | Valor |
---|---|
alpha
|
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
seven
|
7 |
Seguem-se os resultados das chamadas de funções que usam estas variáveis:
Expressão do modelo de mensagem | Resultado |
---|---|
{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
|
Função Substituir tudo
Aplica uma expressão regular a uma string e, para todas as correspondências, substitui a correspondência por um valor de substituição.
Sintaxe
replaceAll(string,regex,value)
Argumentos
- string: uma string literal (entre aspas simples) ou uma variável de fluxo de string na qual fazer substituições.
- regex: uma expressão regular.
- valor: o valor para substituir todas as correspondências de regex na string.
Exemplos
Para os exemplos seguintes, suponha que estas variáveis de fluxo existem:
Nome da variável | Valor |
---|---|
header
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
regex1
|
"^Bearer "
|
replacement
|
"TOKEN: "
|
Seguem-se os resultados das chamadas de funções que usam estas variáveis:
Expressão do modelo de mensagem | Resultado |
---|---|
{replaceAll(header,'9993','')}
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-
|
{replaceAll(header,regex1,'')}
|
ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
{replaceAll(header,regex1,replacement)}
|
TOKEN: ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
Função Replace First
Substitui apenas a primeira ocorrência da correspondência da expressão regular especificada na string.
Sintaxe
replaceFirst(string,regex,value)
Argumentos
string
: uma string literal (entre aspas simples) ou uma variável de fluxo de string na qual fazer substituições.regex
: uma expressão regular.value
: o valor para substituir as correspondências de regex na string.
Funções de escape e codificação de carateres
Funções que escapam ou codificam carateres especiais numa string.
Sintaxe
Função | Descrição |
---|---|
escapeJSON(string)
|
Usa a barra invertida para escapar às aspas duplas. |
escapeXML(string)
|
Substitui os sinais de maior e menor, o apóstrofo, as aspas duplas e os sinais de "e comercial" pelas respetivas entidades XML. Use para documentos XML 1.0. |
escapeXML11(string) |
Funciona da mesma forma que escapeXML, mas para entidades XML v1.1. Consulte as notas de utilização abaixo. |
encodeHTML(string)
|
Codifica o apóstrofe, os sinais de maior e menor, e o "E" comercial. |
Argumentos
string
: a string a escapar. Pode ser uma string literal
(delimitada por aspas simples)
ou uma variável de fluxo de string.
Notas de utilização
O XML 1.1 pode representar determinados carateres de controlo, mas não pode representar o byte nulo nem os pontos de código substitutos Unicode não emparelhados, mesmo após a fuga. A função escapeXML11()
remove os carateres que não se enquadram nos seguintes intervalos:
[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
A função escapeXML11()
escapa carateres nos seguintes intervalos:
[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
Exemplos
Suponha que existe uma variável de fluxo denominada food com este valor: "bread"
& "butter"
. Em seguida, a função:
{escapeHTML(food)}
Resultados em:
"bread" & "butter"
Funções de formato de hora
Devolve uma representação de string da hora, formatada em UTC.
Sintaxe
Função | Descrição |
---|---|
timeFormat(format,str)
|
Devolve a data formatada em UTC. DEPRECATED: devolve a data formatada no fuso horário local. |
timeFormatMs(format,str)
|
Devolve a data formatada em UTC. DEPRECATED: devolve a data formatada no fuso horário local. |
timeFormatUTC(format,str)
|
Devolve a data formatada em UTC. |
timeFormatUTCMs(format,str)
|
Devolve a data formatada em UTC. |
Argumentos
format
: uma string de formato de data/hora. Pode ser uma string literal (delimitada por aspas simples) ou uma variável de string. Use uma variável em vez de um literal quando o formato incluir dois pontos. Consulte a nota anterior nesta secção.str
: uma string ou uma variável de fluxo de strings que contém um valor de tempo. O valor pode estar em segundos desde epoch ou milissegundos desde epoch para timeFormatMs.
Exemplos
Suponha os seguintes valores e que o fuso horário local é o do Pacífico:
epoch_time_ms = 1494390266000
epoch_time = 1494390266
fmt1 = yyyy-MM-dd
fmt2 = yyyy-MM-dd HH-mm-ss
fmt3 = yyyyMMddHHmmss
As funções devolvem os seguintes resultados:
Função | Resultado |
---|---|
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 |
Funções de cálculo de HMAC
As funções de cálculo de HMAC oferecem uma alternativa à utilização da política de HMAC para calcular um HMAC. As funções são úteis quando realiza um cálculo HMAC em cascata, como quando a saída de um HMAC é usada como a chave para um segundo HMAC.
Sintaxe
Função | Descrição |
---|---|
hmacSha224(key,valueToSign[,keyencoding[,outputencoding]])
|
Calcula um HMAC com a função hash SHA-224. |
hmacSha256(key,valueToSign[,keyencoding[,outputencoding]])
|
Codifica um HMAC com a função hash SHA-256. |
hmacSha384(key,valueToSign[,keyencoding[,outputencoding]])
|
Codifica um HMAC com a função hash SHA-384. |
hmacSha512(key,valueToSign[,keyencoding[,outputencoding]])
|
Codifica um HMAC com a função hash SHA-512. |
hmacMd5(key,valueToSign[,keyencoding[,outputencoding]])
|
Codifica um HMAC com a função hash MD5. |
hmacSha1(key,valueToSign[,keyencoding[,outputencoding]])
|
Codifica um HMAC com o algoritmo de encriptação SHA-1. |
Argumentos
- key: (obrigatório) especifica a chave secreta, codificada como uma string, usada para calcular o HMAC.
- valueToSign: (obrigatório) especifica a mensagem a assinar. Deve ser uma string.
- keyencoding: (opcional) a string da chave secreta é descodificada de acordo com esta codificação especificada. Valores válidos:
hex
,base16
,base64
,utf-8
. Predefinição:utf-8
- outputencoding: (opcional) especifica o algoritmo de codificação a usar para a saída.
Valores válidos:
hex
,base16
,base64
. Os valores não são sensíveis a maiúsculas e minúsculas;hex
ebase16
são sinónimos. Predefinição:base64
Exemplos
Este exemplo usa a política AssignMessage para calcular um HMAC-256 e atribuí-lo a uma variável de fluxo:
<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>
Este exemplo ilustra como gerar um HMAC em cascata que pode ser usado com o processo de assinatura da assinatura AWS v4. O exemplo usa a política AssignMessage para gerar os cinco níveis de HMAC em cascata usados para calcular uma assinatura para a assinatura v4 da AWS:
<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>
Outras funções
Função CREATE_UUID
Gera e devolve um UUID.
Sintaxe
createUuid()
Argumentos
Nenhum.
Exemplo
{createUuid()}
Resultado de exemplo:
ec3ca9be-d1e1-4ef4-aee4-4a58f3130db8
Função de gerador longo aleatório
Devolve um número inteiro longo aleatório.
Sintaxe
randomLong(args)
Argumentos
- Se não forem especificados argumentos, a função devolve um número inteiro longo aleatório, calculado pela classe Java SecureRandom.
- Se estiver presente um argumento, é tratado como o valor mínimo do cálculo.
- Se estiver presente um segundo argumento, é tratado como o valor máximo do cálculo.
Exemplo
{randomLong()}
Resulta em algo semelhante ao seguinte:
5211338197474042880
Gerador de texto de regex
Gere uma sequência de texto que corresponda a uma determinada expressão regular.
Sintaxe
xeger(regex)
Argumento
regex
: uma expressão regular.
Exemplo
Este exemplo gera uma string de sete dígitos sem zeros:
xeger( '[1-9]{7}' )
Exemplo de resultado:
9857253
Função de coalescência nula
A função firstnonnull()
devolve o valor do argumento mais à esquerda que não seja nulo.
Sintaxe
firstnonnull(var1,varn)
Argumento
var1
: uma variável de contexto.
varn
: uma ou mais variáveis de contexto. Pode definir o argumento mais à direita como uma string para fornecer um valor alternativo (um valor que é definido se nenhum dos argumentos à esquerda estiver definido).
Exemplos
A tabela seguinte ilustra como usar a função:
Modelo | Var1 | Var2 | Var3 | Resultado |
---|---|---|---|---|
{firstnonnull(var1,var2)}
|
Não definido | foo
|
N/A | foo
|
{firstnonnull(var1,var2)}
|
foo
|
bar
|
N/A | foo
|
{firstnonnull(var1,var2)}
|
foo
|
Não definido | N/A | foo
|
{firstnonnull(var1,var2,var3)}
|
foo
|
bar
|
baz
|
foo
|
{firstnonnull(var1,var2,var3)}
|
Não definido | bar
|
baz
|
bar
|
{firstnonnull(var1,var2,var3)}
|
Não definido | Não definido | baz
|
baz
|
{firstnonnull(var1,var2,var3)}
|
Não definido | Não definido | Não definido | null
|
{firstnonnull(var1)}
|
Não definido | N/A | N/A | null
|
{firstnonnull(var1)}
|
foo
|
N/A | N/A | foo
|
{firstnonnull(var1,var2)}
|
""
|
bar
|
N/A | ""
|
{firstnonnull(var1,var2,'fallback value')}
|
null
|
null
|
fallback value
|
fallback value
|
Função XPath
Aplica uma expressão XPath a uma variável XML.
Sintaxe
xpath(xpath_expression,xml_string[,datatype])
Argumentos
xpath_expression
: uma expressão XPath.
xml_string
: uma variável de fluxo ou uma string que contém XML.
datatype
: (Opcional) Especifica o tipo de retorno pretendido da consulta. Os valores válidos são nodeset
, node
, number
, boolean
ou string
. O valor predefinido é nodeset
. Normalmente, a predefinição é a escolha certa.
Exemplo 1
Suponhamos que estas variáveis de contexto definem uma string XML e uma expressão XPath:
xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>" xpath = "/tag/tagid"
A função xpath()
é usada numa política AssignMessage, da seguinte forma:
<AssignMessage> <AssignVariable> <Name>extracted_tag</Name> <Template>{xpath(xpath,xml)}</Template> </AssignVariable> </AssignMessage>
A função devolve o valor <tagid>250397</tagid>
. Este valor é colocado na variável de contexto denominada extracted_tag
.
Exemplo 2: espaços de nomes XML
Para especificar um espaço de nomes, acrescente parâmetros adicionais, cada um deles uma string semelhante a
prefix:namespaceuri
. Por exemplo, uma função xpath()
que seleciona o elemento secundário de um corpo SOAP pode ser semelhante a esta:
<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>
Para espaços de nomes adicionais, pode adicionar até 10 parâmetros à função xpath()
.
Em vez de especificar expressões XPath com carateres especiais como um literal de string, use uma variável para incluir essa string na função. Consulte o artigo Evite usar carateres especiais em literais de strings para ver detalhes.
{xpath(xpathexpression,xml,ns1)}
Exemplo 3: especificar um tipo de devolução pretendido
O terceiro parâmetro opcional transmitido à função xpath()
especifica o tipo de retorno pretendido da consulta.
Algumas consultas XPath podem devolver valores numéricos ou booleanos. Por exemplo, a função count()
devolve um número. Esta é uma consulta XPath válida:
count(//Record/Fields/Pair)
Esta consulta válida devolve um valor booleano:
count(//Record/Fields/Pair)>0
Nesses casos, invoque a função xpath()
com um terceiro parâmetro que especifique o tipo:
{xpath(expression,xml,'number')} {xpath(expression,xml,'boolean')}
Se o terceiro parâmetro contiver dois pontos, é interpretado como um argumento de espaço de nomes.
Caso contrário, é tratado como o tipo de retorno desejado. Neste caso, se o terceiro parâmetro não for um dos valores válidos (ignorando a capitalização), a função xpath()
devolve por predefinição um conjunto de nós.
Função JSON Path
Avalia uma expressão JSON Path em relação a uma variável JSON.
Sintaxe
jsonPath(json-path,json-var,want-array)
Argumentos
- (Obrigatório)
json-path
: (String) Uma expressão JSON Path. - (Obrigatório)
json-var
: (string) Uma variável de fluxo ou uma string que contém JSON. - (Opcional)
want-array
: (string) se este parâmetro estiver definido comotrue
e se o conjunto de resultados for uma matriz, são devolvidos todos os elementos da matriz. Se for definido para qualquer outro valor ou se este parâmetro for omitido, é devolvido apenas o elemento zero de uma matriz de conjunto de resultados. Se o conjunto de resultados não for uma matriz, então este terceiro parâmetro, se estiver presente, é ignorado.
Pode usar variáveis para qualquer um dos argumentos. Se usar strings fixas, coloque-as entre aspas simples.
Exemplo 1
Se este for o modelo de mensagem:
The address is {jsonPath('$.results[?(@.name == "Mae West")].address.line1',the_json_variable)}
e the_json_variable
contém:
{ "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" } ] }
O resultado da função é:
The address is 1060 West Addison Street
O valor de retorno desta consulta jsonPath é uma matriz que contém um único elemento.
Por predefinição, a função jsonPath no Apigee assume que quer um único valor para utilização na interpolação de strings. Por conseguinte, o Apigee devolve apenas o elemento zero da matriz. Para pedir
a matriz completa, chame a função com true
como o terceiro parâmetro, conforme mostrado no
exemplo seguinte.
Exemplo 2
Se este for o modelo de mensagem:
{jsonPath('$.config.quota[?(@.operation=="ManageOrder")].appname',the_json_variable,true)}
e the_json_variable
contém:
{ "config": { "quota": [ { "appname": "A", "operation": "ManageOrder", "value": "900" }, { "appname": "B", "operation": "ManageOrder", "value": "1000" }, { "appname": "B", "operation": "SubmitOrder", "value": "800" } ] } }
O resultado da função é:
["A","B"]
Neste caso, o terceiro parâmetro da função está definido como true
. Por conseguinte, a função jsonPath devolve a matriz completa, na sintaxe de matriz JSON, em vez do elemento zero.
Exemplo 3
Se the_json_variable
contiver:
{ "config": { "quota": [ { "appname": "A", "operation": "ManageOrder", "value": "900" }, { "appname": "B", "operation": "ManageOrder", "value": "1000" }, { "appname": "B", "operation": "SubmitOrder", "value": "800" } ] } }
e the_query
contém:
$.config.quota[?(@.operation=="ManageOrder")].appname
O resultado do modelo de mensagem: {jsonPath(the_query,the_json_variable,true)}
é ["A","B"]
A utilização de uma variável para a consulta permite-lhe criar uma consulta no tempo de execução, usando dados dinâmicos.
Pode fazê-lo com o elemento <AssignVariable>
na política AssignMessage.
Por exemplo, supondo que a variável operationname
contém o valor
ManageOrder
, a seguinte política define the_query
para a consulta
mostrada acima.
<AssignMessage> <AssignVariable> <Name>the_query</Name> <Template>$.config.quota[?(@.operation=="{operationname}")].appname</Template> </AssignVariable> </AssignMessage>