Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
O quê
A política AssignMessage pode alterar uma mensagem de pedido ou resposta existente, ou criar uma nova mensagem de pedido ou resposta durante o fluxo do proxy de API. A política permite-lhe realizar as seguintes ações nessas mensagens:
- Adicione novos parâmetros de formulário, cabeçalhos ou parâmetros de consulta a uma mensagem
- Copie propriedades existentes de uma mensagem para outra
- Remova cabeçalhos, parâmetros de consulta, parâmetros de formulário e payloads de mensagens de uma mensagem
- Defina o valor das propriedades numa mensagem
AssignMessage também lhe permite definir variáveis de contexto arbitrárias, independentemente de qualquer uma das operações acima que possam aplicar-se a uma mensagem.
Com o AssignMessage, pode adicionar, alterar ou remover propriedades do pedido ou da resposta. Em alternativa, pode usar AssignMessage para criar uma mensagem de pedido ou resposta personalizada e transmiti-la a um destino alternativo, conforme descrito em Criar mensagens de pedido personalizadas.
Esta política é uma política extensível e a utilização desta política pode ter implicações de custo ou utilização, consoante a sua licença do Apigee. Para ver informações sobre os tipos de políticas e as implicações de utilização, consulte Tipos de políticas.
A política AssignMessage pode criar ou alterar variáveis de fluxo com os seguintes elementos secundários:
A ordem pela qual organiza os elementos <Add>
, <Copy>
, <Set>
e <Remove>
é importante. A política executa essas ações pela ordem em que aparecem na configuração da política. Se precisar de remover todos os cabeçalhos e, em seguida, definir um cabeçalho específico, deve incluir o elemento <Remove>
antes do elemento <Set>
.
<AssignMessage>
elemento
Define uma política AssignMessage.
Valor predefinido | Consulte o separador Política predefinida abaixo |
Obrigatório? | Obrigatória |
Tipo | Objeto complexo |
Elemento principal | N/A |
Elementos subordinados |
<Add> <AssignTo> <AssignVariable> <Copy> <DisplayName> <IgnoreUnresolvedVariables> <Remove> <Set> |
O elemento <AssignMessage>
usa a seguinte sintaxe:
Sintaxe
O elemento <AssignMessage>
usa a seguinte sintaxe:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- All AssignMessage child elements are optional --> <Add> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Add> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> <AssignVariable> <Name>VARIABLE_NAME</Name> <PropertySetRef>SOURCE_VARIABLE</PropertySetRef> <Ref>SOURCE_VARIABLE</Ref> <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL> <Template>MESSAGE_TEMPLATE</Template> or <Template ref='TEMPLATE_VARIABLE'></Template> <Value>VARIABLE_VALUE</Value> </AssignVariable> <Copy source="VARIABLE_NAME"> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <!-- Copy all headers --> <Headers/> <!-- or, copy specific headers by name --> <Headers> <Header name="HEADER_NAME"/> <!-- or --> <Header name="HEADER_NAME">[false|true]</Header> ... </Headers> <Path>[false|true]</Path> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> <StatusCode>[false|true]</StatusCode> <Verb>[false|true]</Verb> <Version>[false|true]</Version> </Copy> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Remove all form parameters --> <FormParams/> <!-- or, remove specific form parameters by name --> <FormParams> <FormParam name="FORMPARAM_NAME"/> <!-- or --> <FormParam name="FORMPARAM_NAME">[false|true]</FormParam> ... </FormParams> <!-- Remove all headers --> <Headers/> <!-- or, remove specific headers by name --> <Headers> <Header name="HEADER_NAME"/> <!-- or --> <Header name="HEADER_NAME">[false|true]</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Remove all query parameters --> <QueryParams/> <!-- or, remove specific query parameters by name --> <QueryParams> <QueryParam name="QUERYPARAM_NAME"/> <!-- or --> <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam> ... </QueryParams> </Remove> <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <Path>PATH</Path> <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX" variableSuffix="SUFFIX">NEW_PAYLOAD</Payload> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Política predefinida
O exemplo seguinte mostra as predefinições quando adiciona uma política AssignMessage ao seu fluxo na IU do Apigee. Provavelmente, nunca vai querer que todos os elementos de configuração apresentados aqui sejam visíveis.
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <DisplayName>Assign Message-1</DisplayName> <Properties/> <Copy source="request"> <Headers/> <QueryParams/> <FormParams/> <Payload/> <Verb/> <StatusCode/> <Path/> </Copy> <Remove> <Headers> <Header name="h1"/> </Headers> <QueryParams> <QueryParam name="q1"/> </QueryParams> <FormParams> <FormParam name="f1"/> </FormParams> <Payload/> </Remove> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <!-- <Verb>GET</Verb> --> <Path/> </Set> <AssignVariable> <Name>name</Name> <Value/> <Ref/> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Quando insere uma nova política AssignMessage na IU do Apigee, o modelo contém marcadores de posição para todas as operações possíveis. Normalmente, seleciona as operações que quer realizar com esta política e remove os restantes elementos secundários. Por exemplo, se quiser realizar uma operação de cópia, use o elemento
<Copy>
e remova <Add>
, <Remove>
e outros elementos subordinados da política para a tornar mais legível.
Este elemento tem os seguintes atributos comuns a todas as políticas:
Atributo | Predefinição | Obrigatório? | Descrição |
---|---|---|---|
name |
N/A | Obrigatório |
O nome interno da política. O valor do atributo Opcionalmente, use o elemento |
continueOnError |
falso | Opcional | Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas. Definido como true para que a execução do fluxo continue mesmo depois de uma política falhar. Veja também:
|
enabled |
verdadeiro | Opcional | Defina como true para aplicar a política. Defina como false para desativar a política. A política não é aplicada, mesmo que permaneça anexada a um fluxo. |
async |
falso | Descontinuado | Este atributo foi descontinuado. |
A tabela seguinte apresenta uma descrição geral dos elementos subordinados de
<AssignMessage>
:
Elemento secundário | Obrigatório? | Descrição |
---|---|---|
Operações comuns | ||
<Add> |
Opcional | Adiciona informações ao objeto de mensagem especificado pelo elemento
<AssignTo> .
Para substituir cabeçalhos ou parâmetros existentes, use o elemento |
<Copy> |
Opcional | Copia informações da mensagem especificada pelo atributo source para o objeto de mensagem especificado pelo elemento <AssignTo> . |
<Remove> |
Opcional | Elimina os elementos especificados da variável de mensagem especificada no elemento <AssignTo> . |
<Set> |
Opcional | Substitui os valores das propriedades existentes no pedido ou na resposta, que é especificado pelo elemento <AssignTo> .
|
Outros elementos secundários | ||
<AssignTo> |
Opcional | Especifica em que mensagem a política AssignMessage opera. Pode ser o pedido ou a resposta padrão, ou pode ser uma nova mensagem personalizada. |
<AssignVariable> |
Opcional | Atribui um valor a uma variável de fluxo. Se a variável não existir, o comando
<AssignVariable> cria-a. |
<IgnoreUnresolvedVariables> |
Opcional | Determina se o processamento é interrompido quando é encontrada uma variável não resolvida. |
Cada um destes elementos secundários é descrito nas secções que se seguem.
Exemplos
Os exemplos seguintes mostram algumas das formas como pode usar a política AssignMessage:
1: Adicione um cabeçalho
O exemplo seguinte adiciona um cabeçalho ao pedido com o elemento
<Add>
:
<AssignMessage name="AM-add-headers-1"> <Add> <Headers> <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header> </Headers> </Add> <AssignTo>request</AssignTo> </AssignMessage>
2: remova a carga útil
O exemplo seguinte elimina o payload da resposta com o elemento <Remove>
:
<AssignMessage name="AM-remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo>response</AssignTo> </AssignMessage>
3: Modificar resposta
O exemplo seguinte modifica um objeto de resposta existente adicionando-lhe um cabeçalho:
<AssignMessage name="AM-modify-response"> <Set> <Headers> <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
Este exemplo não cria uma nova mensagem. Em vez disso, modifica uma mensagem de resposta existente adicionando um cabeçalho HTTP.
Uma vez que este exemplo especifica response
como o nome da variável no elemento
<AssignTo>
, esta política modifica o objeto de resposta que foi originalmente
definido com os dados devolvidos pelo servidor de destino.
O cabeçalho HTTP adicionado à mensagem de resposta por esta política é derivado de uma variável preenchida pela política LookupCache. Por conseguinte, a mensagem de resposta modificada por esta política Assign Message contém um cabeçalho HTTP que indica se os resultados foram extraídos da cache ou não. A definição de cabeçalhos na resposta pode ser útil para depurar e resolver problemas.
4: defina conteúdo dinâmico
Pode usar AssignMessage para incorporar conteúdo dinâmico no payload das mensagens de resposta e de pedido.
Para incorporar variáveis de fluxo num payload XML, coloque a variável designada entre chavetas, como neste exemplo: {prefix.name}
.
O exemplo seguinte incorpora o valor da variável de fluxo do cabeçalho HTTP user-agent
num elemento XML denominado User-agent
:
<AssignMessage name="AM-set-dynamic-content"> <AssignTo>response</AssignTo> <Set> <Payload contentType="text/xml"> <User-agent>{request.header.user-agent}</User-agent> </Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
Para payloads JSON, pode inserir variáveis através dos atributos variablePrefix
e variableSuffix
com carateres delimitadores, conforme mostrado no seguinte exemplo:
<AssignMessage name="AM-set-payload"> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> { "user-agent": "@request.header.user-agent#" } </Payload> </AssignMessage>
Para ver uma lista completa das variáveis de fluxo, consulte o artigo Referência de variáveis de fluxo.
Também pode usar chavetas para inserir variáveis.
5: Remova o parâmetro de consulta
O exemplo seguinte remove o parâmetro de consulta apikey
do pedido:
<AssignMessage name="AM-remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
É uma prática recomendada remover o parâmetro de consulta apikey
da mensagem de pedido quando usa a política VerifyAPIKey para autenticação do utilizador. Isto é feito para impedir que as informações importantes confidenciais sejam transmitidas ao destino de back-end.
6: Definir/gerar variáveis
O exemplo seguinte usa três políticas AssignMessage:
- Cria três variáveis de fluxo no pedido, com valores estáticos
- Obtém as variáveis de fluxo dinamicamente numa segunda política no fluxo de pedidos
- Define-os no payload da resposta
<!-- Policy #1: Set variables in the request --> <AssignMessage name="AM-set-variables"> <!-- Create a variable named myAppSecret --> <AssignVariable> <Name>myAppSecret</Name> <Value>42</Value> </AssignVariable> <!-- Create a variable named config.environment --> <AssignVariable> <Name>config.environment</Name> <Value>test</Value> </AssignVariable> <!-- Create a variable named config.protocol --> <AssignVariable> <Name>config.protocol</Name> <Value>gopher</Value> </AssignVariable> </AssignMessage>
Na primeira política, o elemento <AssignVariable>
cria e define três variáveis no pedido. Cada elemento <Name>
especifica
um nome de variável e <Value>
especifica o valor.
A segunda política usa o elemento <AssignVariable>
para ler os valores e cria três novas variáveis:
<!-- Policy #2: Get variables from the request --> <AssignMessage continueOnError="false" enabled="true" name="get-variables"> <AssignTo createNew="false" transport="http" type="request"/> <!-- Get the value of myAppSecret and create a new variable, secret --> <AssignVariable> <Name>secret</Name> <Ref>myAppSecret</Ref> <Value>0</Value> </AssignVariable> <!-- Get the value of config.environment and create a new variable, environment --> <AssignVariable> <Name>environment</Name> <Ref>config.environment</Ref> <Value>default</Value> </AssignVariable> <!-- Get the value of config.protocol and create a new variable, protocol --> <AssignVariable> <Name>protocol</Name> <Ref>config.protocol</Ref> <Value>default</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Na segunda política, o elemento <Ref>
faz referência à variável de origem e os elementos <Name>
especificam os nomes das novas variáveis. Se a variável
referenciada pelo elemento <Ref>
não for acessível, pode usar o valor
especificado pelo elemento <Value>
.
Para experimentar este conjunto de políticas:
- Adicione as políticas n.º 1 e n.º 2 ao fluxo de pedidos. Certifique-se de que coloca a política n.º 1 antes da política n.º 2.
- Adicione a terceira política no fluxo de resposta.
- A terceira política usa o elemento
<Set>
para adicionar as variáveis à resposta. O exemplo seguinte cria uma carga útil XML na resposta que o Edge devolve ao cliente:<!-- Policy #3: Add variables to the response --> <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload"> <DisplayName>put-em-in-the-payload</DisplayName> <Set> <Payload contentType="application/xml"> <wrapper> <secret>{secret}</secret> <config> <environment>{environment}</environment> <protocol>{protocol}</protocol> </config> </wrapper> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Tenha em atenção que a sintaxe para aceder às variáveis de fluxo em
<Set>
é envolvê-las em chavetas.Certifique-se de que define o atributo
contentType
do elemento<Payload>
comoapplication/xml
. - Envie um pedido ao seu proxy de API; por exemplo:
curl -vL https://ahamilton-eval-test.apigee.net/myproxy
Opcionalmente, pode encaminhar os resultados através de um utilitário, como
xmllint
, para que o XML seja apresentado numa estrutura bem formatada:curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -
O corpo da resposta deve ter o seguinte aspeto:
42 test gopher
7: Obtenha os cabeçalhos das respostas ServiceCallout
No exemplo seguinte, suponhamos que existe uma política ServiceCallout no pedido do proxy de API
e que a resposta do callout contém vários cabeçalhos com o mesmo nome
(Set-Cookie
). Supondo que a variável de resposta do Service Callout é a predefinição
calloutResponse
, a política seguinte obtém o valor do cabeçalho Set-Cookie
.
<AssignMessage name="AM-Payload-from-SC-header"> <Set> <Payload contentType="application/json"> {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"} </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo>response</AssignTo> </AssignMessage>
Para apresentar uma lista de todos os valores dos cabeçalhos, use a seguinte variável:
{calloutResponse.header.Set-Cookie.values}
8: Armazene e remova parâmetros de formulário, cabeçalhos e parâmetros de consulta
Se quiser usar <Remove>
para eliminar os cabeçalhos, os parâmetros de consulta ou os parâmetros de formulário, mas
manter o acesso aos respetivos valores mais tarde no fluxo da política, pode armazenar os respetivos valores através de <AssignVariable>
.
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-StoreAndRemove"> <DisplayName>AM-StoreAndRemove</DisplayName> <AssignVariable> <Name>var_grant_type</Name> <Ref>request.formparam.grant_type</Ref> </AssignVariable> <Remove> <Headers/> <FormParams/> <Payload/> </Remove> <Set> <Headers> <Header name="Content-Type">application/x-www-form-urlencoded</Header> <Header name="Accept">application/json</Header> <Header name="Grant-Type">{var_grant_type}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Cada elemento secundário nesta referência tem exemplos adicionais. Para ver ainda mais exemplos, consulte o exemplo AssignMessage no GitHub.
Referência de elemento secundário
Esta secção descreve os elementos subordinados de <AssignMessage>
.
<Add>
Adiciona informações ao pedido ou à resposta, que são especificadas pelo elemento <AssignTo>
.
O elemento <Add>
adiciona novas propriedades à mensagem que não existem na mensagem original. Tenha em atenção que o <Set>
também oferece esta funcionalidade. Para alterar os valores das propriedades existentes, use o elemento <Set>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Tipo complexo |
Elemento principal |
<AssignMessage>
|
Elementos subordinados |
<FormParams> <Headers> <QueryParams> |
O elemento <Add>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Add> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Add> </AssignMessage>
Exemplo 1
O exemplo seguinte modifica a mensagem de pedido obtendo os valores de três parâmetros da string de consulta do pedido inicial e definindo-os como parâmetros de formulário no pedido de ponto final de destino e, finalmente, removendo todos os parâmetros da string de consulta original:
<AssignMessage name="AM-add-formparams-3"> <Add> <FormParams> <FormParam name="username">{request.queryparam.name}</FormParam> <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam> <FormParam name="default_language">{request.queryparam.lang}</FormParam> </FormParams> </Add> <Remove> <QueryParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte usa o elemento <Headers>
para adicionar um cabeçalho partner-id
ao pedido que vai ser enviado para o ponto final de destino:
<AssignMessage name="AM-add-headers-1"> <Add> <Headers> <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header> </Headers> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 3
O exemplo seguinte usa o elemento <QueryParams>
para adicionar um único parâmetro de consulta com um valor estático ao pedido:
<AssignMessage name="AM-add-queryparams-1"> <Add> <QueryParams> <QueryParam name="myParam">42</QueryParam> </QueryParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Este exemplo usa <Add>
no fluxo prévio do pedido. Se analisar os resultados numa ferramenta, como a vista geral de depuração, o pedido para https://example-target.com/get
torna-se https://example-target.com/get?myParam=42
.
Os elementos secundários de <Add>
suportam a substituição de strings dinâmicas, conhecida como
modelos de mensagens.
<FormParams>
(filho de <Add>
)
Adiciona novos parâmetros de formulário à mensagem de pedido. Este elemento não tem efeito numa mensagem de resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <FormParam> elementos |
Elemento principal |
<Add>
|
Elementos subordinados |
<FormParam> |
O elemento <FormParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Add> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> </Add> </AssignMessage>
Exemplo 1
O exemplo seguinte adiciona um único parâmetro de formulário (answer
) e um valor estático (42
) ao pedido:
<AssignMessage name="AM-add-formparams-1"> <Add> <FormParams> <FormParam name="answer">42</FormParam> </FormParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte obtém o valor do parâmetro de consulta name
e
adiciona-o ao pedido como um parâmetro de formulário e, em seguida, remove o parâmetro de consulta:
<AssignMessage name="AM-Swap-QueryParam-to-FormParams"> <Add> <FormParam name="name">{request.queryparam.name}</FormParam> </Add> <Remove> <QueryParam name="name"/> </Remove> </AssignMessage>
Tenha em atenção que este exemplo não especifica um destino com <AssignTo>
. Esta política adiciona o parâmetro
apenas ao pedido.
Exemplo 3
O exemplo seguinte adiciona vários parâmetros de formulário ao pedido:
<AssignMessage name="AM-add-formparams-3"> <Add> <FormParams> <FormParam name="username">{request.queryparam.name}</FormParam> <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam> <FormParam name="default_language">{request.queryparam.lang}</FormParam> </FormParams> </Add> <Remove> <QueryParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Este exemplo obtém os parâmetros da string de consulta do pedido de origem e adiciona-os como parâmetros de formulário com nomes diferentes. Em seguida, remove os parâmetros de consulta originais. O Apigee envia o pedido modificado para o ponto final de destino.
Pode usar a vista geral de depuração para analisar o fluxo. Vai ver que o corpo do pedido contém os dados do formulário codificados por URL, que foram originalmente transmitidos como parâmetros da string de consulta:
username=nick&zip_code=90210&default_language=en
Pode usar o <FormParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbo HTTP: POST
- Tipo de mensagem: pedido
- Uma (ou ambas) das seguintes opções:
- Dados do formulário: definidos para algum valor ou "" (a string vazia). Por exemplo, com
curl
, adicione-d ""
ao seu pedido. - Cabeçalho
Content-Length
: definido como 0 (se não existirem dados no pedido original; caso contrário, o comprimento atual, em bytes). Por exemplo, comcurl
adicione-H "Content-Length: 0"
ao seu pedido.
- Dados do formulário: definidos para algum valor ou "" (a string vazia). Por exemplo, com
Por exemplo:
curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded" https://ahamilton-eval-test.apigee.net/am-test
Quando adiciona <FormParams>
, o Apigee define o cabeçalho Content-Type
do pedido como
application/x-www-form-urlencoded
antes de enviar a mensagem para o serviço de destino.
<Headers>
(filho de <Add>
)
Adiciona novos cabeçalhos ao pedido ou à resposta especificada, que é especificada pelo elemento <AssignTo>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <Header> elementos |
Elemento principal |
<Add>
|
Elementos subordinados |
<Header> |
O elemento <Headers>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Add> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> </Add> </AssignMessage>
Exemplo 1
O exemplo seguinte adiciona um cabeçalho partner-id
à mensagem de pedido e
atribui o valor da variável de fluxo verifyapikey.VAK-1.developer.app.partner-id
a esse cabeçalho.
<AssignMessage name="AM-add-headers-1"> <Add> <Headers> <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header> </Headers> </Add> <AssignTo>request</AssignTo> </AssignMessage>
<QueryParams>
(filho de <Add>
)
Adiciona novos parâmetros de consulta ao pedido. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <QueryParam> elementos |
Elemento principal |
<Add>
|
Elementos subordinados |
<QueryParam> |
O elemento <QueryParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Add> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Add> </AssignMessage>
Exemplo 1
O exemplo seguinte adiciona o parâmetro de consulta myParam
ao pedido e atribui-lhe o valor
42
:
<AssignMessage name="AM-add-queryparams-1"> <Add> <QueryParams> <QueryParam name="myParam">42</QueryParam> </QueryParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Pode usar o <QueryParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbos HTTP:
GET
,POST
,PATCH
,DELETE
- Tipo de mensagem: pedido
Além disso, só pode definir parâmetros de consulta quando o atributo type
do elemento <AssignTo>
for uma mensagem de pedido. A definição destas no objeto de resposta não tem efeito.
Se definir uma matriz vazia de parâmetros de consulta na sua política
(<Add><QueryParams/></Add>
), a política não adiciona parâmetros
de consulta. Isto é o mesmo que omitir <QueryParams>
.
<AssignTo>
Determina em que objeto a política AssignMessage opera. As opções são as seguintes:
- Mensagem de pedido: o
request
recebido pelo proxy da API - Mensagem de resposta: o
response
devolvido pelo servidor de destino - Mensagem personalizada: um objeto de pedido ou resposta personalizado
Tenha em atenção que, em alguns casos, não pode alterar o objeto sobre o qual a política AssignMessage atua.
Por exemplo, não pode usar <Add>
nem <Set>
para adicionar ou alterar parâmetros de consulta
(<QueryParams>
) ou parâmetros de formulário (<FormParams>
) na resposta. Só pode manipular os parâmetros de consulta e os parâmetros de formulário no pedido.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignMessage>
|
Elementos subordinados | Nenhum |
Se não especificar <AssignTo>
ou se especificar o elemento <AssignTo>
, mas não especificar um valor de texto para o elemento, a política atua no pedido ou na resposta predefinidos, que se baseiam no local onde a política é executada. Se a política for executada no fluxo de pedidos, afeta a mensagem de pedido. Se for executada no fluxo de respostas, a política afeta a resposta por predefinição.
O elemento <AssignTo>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignTo createNew="[true|false]" transport="http" type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo> </AssignMessage>
Exemplo 1
O exemplo seguinte não especifica nenhuma mensagem no texto do elemento <AssignTo>
. Isto implica que a política vai agir na mensagem request
ou response
, consoante o local onde a política é executada.
<AssignMessage name="assignto-1"> <AssignTo createNew="false" transport="http" type="request"/> <!-- no-op --> ... </AssignMessage>
Se especificar createNew="false"
e não fornecer explicitamente um nome de mensagem, os outros atributos de <AssignTo>
são irrelevantes. Neste caso, pode
querer omitir completamente o elemento <AssignTo>
.
Exemplo 2
O exemplo seguinte cria um novo objeto de pedido, substituindo o objeto existente:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> ... </AssignMessage>
Quando cria um novo objeto de pedido ou resposta, os outros elementos da política AssignMessage (como <Add>
, <Set>
e <Copy>
) atuam nesse novo objeto de pedido ou resposta.
Pode aceder ao novo objeto de pedido noutras políticas mais tarde no fluxo ou enviar o novo objeto de pedido para um serviço externo com uma política ServiceCallout.
Exemplo 3
O exemplo seguinte cria um novo objeto de pedido denominado MyRequestObject
:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </AssignMessage>
Quando cria um novo objeto de pedido ou resposta, os outros elementos da política AssignMessage (como <Add>
, <Set>
e <Copy>
) atuam nesse novo objeto de pedido.
Pode aceder ao novo objeto de pedido por nome noutras políticas mais tarde no fluxo ou enviar o novo objeto de pedido para um serviço externo com uma política ServiceCallout.
A tabela seguinte descreve os atributos de <AssignTo>
:
Atributo | Descrição | Obrigatório? | Tipo |
---|---|---|---|
createNew |
Determina se esta política cria uma nova mensagem quando atribui valores. Se Se
Se
|
Opcional | Booleano |
transport |
Especifica o tipo de transporte para o tipo de mensagem de pedido ou resposta. O valor predefinido é |
Opcional | String |
type |
Especifica o tipo da nova mensagem quando createNew é true . Os valores
válidos são request ou response .
O valor predefinido é |
Opcional | String |
<AssignVariable>
Atribui um valor a uma variável de fluxo de destino (como uma variável cujo valor é definido pela política AssignMessage). Se a variável de fluxo não existir, o elemento <AssignVariable>
cria-a. Pode usar vários elementos AssignVariable na política AssignMessage. São
executadas por ordem de apresentação na configuração da política.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Tipo complexo |
Elemento principal |
<AssignMessage>
|
Elementos subordinados |
<Name> (obrigatório)<PropertySetRef> <Ref> <ResourceURL> <Template> <Value> |
O valor que atribui à variável do fluxo de destino pode ser um dos seguintes:
- String literal: use o elemento filho
<Value>
para especificar um valor de string literal para a variável de fluxo de destino. - Variável de fluxo: use o elemento filho
<Ref>
para especificar o valor de uma variável de fluxo existente para a variável de fluxo de destino. Para ver uma lista completa das variáveis de fluxo que podem ser usadas como origem, consulte a referência de variáveis de fluxo. - Property set: use o elemento filho
<PropertySetRef>
para obter o valor de um par de nome/chave de property set e armazene-o numa variável de fluxo. Permite-lhe aceder dinamicamente a conjuntos de propriedades. - URL do recurso: use o elemento filho
<ResourceURL>
para especificar um URL para um recurso de texto, do tipo XSL, XSD, WSDL, JavaScript ou OpenAPI Spec. Isto atribui o conteúdo do recurso à variável de fluxo com nome. - Modelo de mensagem: use o elemento secundário
<Template>
para especificar um modelo de mensagem para a variável de fluxo de destino.
A ordem de precedência destes elementos secundários é: ResourceURL, Template, Ref, Value, PropertySetRef.
O elemento <AssignVariable>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Name>VARIABLE_NAME</Name> <PropertySetRef>SOURCE_VARIABLE</PropertySetRef> <Ref>SOURCE_VARIABLE</Ref> <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL> <Template>MESSAGE_TEMPLATE</Template> or <Template ref='TEMPLATE_VARIABLE'></Template> <Value>VARIABLE_VALUE</Value> </AssignVariable> </AssignMessage>
Use o elemento <Ref>
para especificar a variável de origem. Se a variável referenciada por <Ref>
não for acessível, o Apigee usa o valor especificado pelo elemento <Value>
. Se definir
<Template>
, tem prioridade sobre os elementos irmãos
<Ref>
e <Value>
.
Exemplo 1
O exemplo seguinte define o valor de uma nova variável, myvar
, para o valor literal 42
:
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Exemplo 2
O exemplo seguinte atribui o valor da variável de fluxo
request.header.user-agent
à variável de fluxo de destino myvar
e o valor do parâmetro de consulta country
à variável de fluxo de destino
Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Se qualquer uma das atribuições falhar, o Apigee atribui o valor ErrorOnCopy
à variável de fluxo de destino.
Se as variáveis de fluxo myvar
ou Country
não existirem,
<AssignVariable>
cria-as.
Exemplo 3
O exemplo seguinte usa o elemento secundário <Template>
para concatenar duas variáveis de contexto
com uma string literal (um hífen) entre elas:
<AssignMessage name='AV-via-template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Exemplo 4
O exemplo seguinte usa <AssignVariable>
para desativar o comportamento predefinido de propagação do sufixo do caminho do pedido de proxy para o pedido de destino:
<AssignMessage name='AM-PathSuffixFalse'> <AssignVariable> <Name>target.copy.pathsuffix</Name> <Value>false</Value> </AssignVariable> </AssignMessage>
Uma utilização comum de <AssignVariable>
é definir um valor predefinido para um parâmetro de consulta, um cabeçalho ou
outro valor que possa ser transmitido com o pedido. Isto é feito com uma combinação dos elementos secundários <Ref>
e <Value>
. Para mais
informações, consulte os exemplos para <Ref>
.
<Name>
(filho de <AssignVariable>
)
Especifica o nome da variável de fluxo de destino, ou seja, a variável cujo valor é definido pela política AssignMessage. Se a variável com o nome indicado em <Name>
não existir, a política cria uma com esse nome.
Valor predefinido | N/A |
Obrigatório? | Obrigatória |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
O elemento <Name>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Name>VARIABLE_NAME</Name> </AssignVariable> </AssignMessage>
Exemplo 1
O exemplo seguinte especifica a variável de destino como myvar
e define-a
para o valor literal 42
:
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Se myvar
não existir, <AssignVariable>
cria-o.
<PropertySetRef>
(filho de <AssignVariable>
)
Este elemento permite-lhe obter dinamicamente o valor de um par de nome/chave do conjunto de propriedades. Para saber mais sobre os conjuntos de propriedades, consulte o artigo Usar conjuntos de propriedades.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
Um conjunto de propriedades consiste num par de nome/chave.
Por exemplo: propset1.id=12345
,
onde propset1
é o nome do conjunto de propriedades, id
é uma chave e
12345
é o valor da chave.
O elemento secundário PropertySetRef
permite-lhe selecionar nomes e/ou chaves de conjuntos de propriedades dinamicamente. Suponha que tem 200 regras de encaminhamento num ficheiro de conjunto de propriedades. Pode aceder às regras do conjunto de propriedades
da seguinte forma, em que routingrules
é o nome do conjunto de propriedades e rule1
,
rule2
e rulen
são chaves:
propertyset.routingrules.rule1 propertyset.routingrules.rule2 propertyset.routingrules.rulen
Para aceder a estas propriedades num fluxo de proxy de API, tem de saber que regra quer selecionar no momento da conceção. No entanto, suponha que o nome da regra está no cabeçalho ou no payload do pedido. Uma forma de selecionar a regra é usar uma política de JavaScript com código como o seguinte:
context.getVariables("propertyset.routingrules." + ruleName); //assuming ruleName was populated earlier.
Por outro lado, a funcionalidade AssignMessage PropertySetRef
permite-lhe selecionar uma chave de propriedade dinamicamente sem
introduzir JavaScript.
Pode usar uma combinação de variáveis de fluxo e valores de strings literais no elemento <PropertySetRef>
. Consulte os exemplos para ver mais detalhes.
O elemento <PropertySetRef>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <PropertySetRef>SOURCE_VARIABLE</PropertySetRef> </AssignVariable> </AssignMessage>
Exemplo 1
Este exemplo atribui o valor de uma chave definida de propriedade a uma variável de fluxo. Neste caso,
o nome do conjunto de propriedades é obtido a partir do cabeçalho propset_name
, a chave é fornecida
no cabeçalho propset_key
e o valor atribuído à chave é armazenado na variável
flow_variable
.
<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage"> <DisplayName>Assign Message-1</DisplayName> <Properties/> <AssignVariable> <Name>flow_variable</Name> <PropertySetRef>{request.header.propset_name}.{request.header.propset_key}</PropertySetRef> </AssignVariable> </AssignMessage>
Pode usar qualquer combinação de variáveis de fluxo e strings literais no elemento <PropertySetRef>
.
Exemplo 2
Este exemplo atribui o valor de uma chave definida de propriedade a uma variável de fluxo através de um nome de chave fixo (string literal). Neste caso, o nome do conjunto de propriedades é obtido a partir do cabeçalho propset_name
, a chave é a string literal key1
e o valor atribuído à chave é armazenado na variável flow_variable
.
<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage"> <DisplayName>Assign Message-1</DisplayName> <Properties/> <AssignVariable> <Name>flow_variable</Name> <PropertySetRef>{request.header.propset_name}.key1</PropertySetRef> </AssignVariable> </AssignMessage>
Pode usar qualquer combinação de variáveis de fluxo e strings literais no elemento <PropertySetRef>
.
<Ref>
(filho de <AssignVariable>
)
Especifica a origem da atribuição como uma variável de fluxo. A variável de fluxo pode ser uma das variáveis de fluxo predefinidas (conforme listado na referência de variáveis de fluxo) ou uma variável de fluxo personalizada que criou.
O valor de <Ref>
é sempre interpretado como uma variável de fluxo. Não pode especificar uma string literal como o valor. Em alternativa, use o elemento <Value>
para atribuir um valor de string literal.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
Quando especifica uma variável de fluxo com <Ref>
, omita os
parênteses {}
que normalmente usaria para referenciar uma variável de fluxo. Por exemplo, para definir o valor da nova variável com o valor da variável client.host
flow:
DO specify the variable name without brackets: <Ref>client.host</Ref> DO NOT use brackets: <Ref>{client.host}</Ref>
Para definir um valor predefinido para a variável de fluxo de destino, use <Value>
em combinação com <Ref>
. Se a variável de fluxo especificada por
<Ref>
não existir, não puder ser lida ou for nula, o Apigee atribui o valor
de <Value>
à variável de fluxo de destino.
O elemento <Ref>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Name>VARIABLE_NAME</Name> <Ref>SOURCE_VARIABLE</Ref> </AssignVariable> </AssignMessage>
Exemplo 1
O exemplo seguinte atribui o valor da variável de fluxo
request.header.user-agent
à variável de fluxo de destino myvar
e
o valor do parâmetro de consulta country
à variável Country
:
<AssignMessage name="assignvariable-4"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> </AssignMessage>
Neste exemplo, o Apigee não tem um valor predefinido (ou alternativo) especificado para nenhuma das atribuições.
Exemplo 2
O exemplo seguinte atribui o valor da variável de fluxo request.header.user-agent
à variável de fluxo de destino myvar
e o valor
do parâmetro de consulta country
à variável Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Neste exemplo, se os valores da request.header.user-agent
variável de fluxo
ou do parâmetro de consulta Country
forem nulos, ilegíveis ou com formato incorreto, o Apigee atribui
o valor ErrorOnCopy
às novas variáveis.
Exemplo 3
Um exemplo de utilização comum de <AssignVariable>
é definir o valor predefinido de um parâmetro de consulta, um cabeçalho ou outro valor que possa ser transmitido com o pedido. Por exemplo, cria
um proxy de API meteorológica em que o pedido recebe um único parâmetro de consulta denominado w
. Este parâmetro contém o ID da cidade para a qual quer saber o estado do tempo. O URL do pedido tem o seguinte formato:
http://myCO.com/v1/weather/forecastrss?w=CITY_ID
Para definir um valor predefinido para w
, crie uma política AssignMessage como a seguinte:
<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3"> <AssignTo createNew="false" transport="http" type="request"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignVariable> <Name>request.queryparam.w</Name> <Ref>request.queryparam.w</Ref> <Value>12797282</Value> </AssignVariable> </AssignMessage>
Neste exemplo, <AssignVariable>
recebe o valor de request.queryparam.w
e atribui-o a si próprio. Se a variável de fluxo for nula, o que significa que o parâmetro de consulta w
foi omitido do pedido, este exemplo usa o valor predefinido do elemento <Value>
. Por conseguinte, pode fazer um pedido a este proxy da API que omite o parâmetro de consulta w
:
http://myCO.com/v1/weather/forecastrss
…e continuar a fazer com que o proxy da API devolva um resultado válido.
O valor de <Ref>
tem de ser uma variável de fluxo, como uma propriedade de um objeto request
, response
ou target
, ou o nome de uma variável de fluxo personalizada.
Se especificar uma variável de fluxo que não existe para o valor de <Ref>
,
e o valor de <IgnoreUnresolvedVariables>
for false
, o Apigee gera um erro.
<ResourceURL>
(filho de <AssignVariable>
)
Especifica o URL de um recurso de texto
como a origem da atribuição de variáveis. O Apigee carrega a variável de fluxo especificada em
<Name>
com o conteúdo do recurso referenciado. O recurso pode ser do tipo XSD, XSL, WSDL, JavaScript, conjunto de propriedades ou especificação OpenAPI.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
Se o recurso especificado por <ResourceURL>
não existir, então: se o valor de
<IgnoreUnresolvedVariables>
for true
, o Apigee
atribui o valor null
à variável de fluxo de destino. No entanto, se o valor de
<IgnoreUnresolvedVariables>
for false
, o Apigee gera um erro.
O elemento <ResourceURL>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Name>VARIABLE_NAME</Name> <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL> </AssignVariable> </AssignMessage>
O valor de texto assume um valor de string e é interpretado como um modelo de mensagem. Qualquer uma das seguintes opções é válida:
jsc://my-js-file.js wsdl://{variable-goes-here} {variable-goes-here}
Exemplo 1
O exemplo seguinte atribui o valor de um recurso JSON, carregado no proxy na pasta jsc
, à variável de fluxo assigned-variable
:
<AssignMessage name='AM-From-ResourceURL-Proxy-JSC'> <AssignVariable> <Name>assigned-variable</Name> <ResourceURL>jsc://settings.json</ResourceURL> </AssignVariable> </AssignMessage>
Exemplo 2
O exemplo seguinte atribui o valor de um recurso de especificação da OpenAPI, carregado no proxy
na pasta oas
, à variável de fluxo assigned-variable
e, em seguida, define
esse valor como Payload
no corpo da resposta:
<AssignMessage name='AM-Response'> <AssignVariable> <Name>assigned-variable</Name> <ResourceURL>oas://Fulfillment.yaml</ResourceURL> </AssignVariable> <Set> <Payload contentType='application/yaml'>{assigned-variable}</Payload> </Set> </AssignMessage>
<Template>
(filho de <AssignVariable>
)
Especifica um modelo de mensagem. Um modelo de mensagem permite-lhe fazer a substituição de strings variáveis quando a política é executada e pode combinar strings literais com nomes de variáveis entre chavetas. Além disso, os modelos de mensagens suportam funções, como a conversão de maiúsculas/minúsculas e a anulação de carateres especiais.
Use o atributo ref
para especificar uma variável de fluxo em que o valor da variável
é um modelo de mensagem. Por exemplo, pode armazenar um modelo de mensagem como um
atributo personalizado
numa app de programador. Quando o Apigee identifica a app de programador depois de validar a chave de API
ou o token de segurança (através de uma política adicional), o elemento <AssignVariable>
pode usar o modelo de mensagem do atributo personalizado da app, que está disponível
como uma variável de fluxo da política de segurança. O exemplo seguinte pressupõe que o modelo de mensagem está disponível num atributo personalizado denominado message_template
na app do programador que faz a chamada API, em que a política VerifyAPIKey foi usada para validar a chave da API da app:
<Template ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
O elemento <Template>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Template>MESSAGE_TEMPLATE</Template> or <Template ref='TEMPLATE_VARIABLE'></Template> </AssignVariable> </AssignMessage>
Exemplo 1
O exemplo seguinte usa a sintaxe de modelos de mensagens para concatenar duas variáveis de contexto com uma string literal (um hífen) entre elas:
<AssignMessage name='AV-via-template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Exemplo 2
O exemplo seguinte especifica uma variável de fluxo, em que o valor da variável é um modelo de mensagem predefinido. Use esta opção se quiser injetar um modelo predefinido no momento da execução sem ter de modificar a política:
<AssignMessage name='AV-via-template-indirectly'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template ref='my_template_variable'/> </AssignVariable> </AssignMessage>
Exemplo 3
O exemplo seguinte especifica uma variável de fluxo e um valor de texto. Neste caso, se a variável referenciada não for nula, esse valor é usado como o modelo. Se o valor referenciado for nulo, o valor de texto (neste caso, {system.uuid}-{messageid}
) é usado como o modelo. Este padrão é útil para fornecer um valor override
, em que, em alguns casos, quer substituir o modelo predefinido (a parte de texto) por valores definidos dinamicamente. Por exemplo, uma declaração condicional pode obter um valor
de um mapa de chaves-valores e definir a variável referenciada para esse valor:
<AssignMessage name='AV-template-with-fallback'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Template ref='my_variable'>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
<Value>
(filho de <AssignVariable>
)
Define o valor da variável do fluxo de destino definida com <AssignVariable>
. O valor é sempre interpretado como uma string literal. Não pode usar uma variável de fluxo como valor, mesmo que envolva o valor entre parênteses ({}
). Em alternativa, para usar uma variável de fluxo, use <Ref>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos subordinados | Nenhum |
Quando usado em combinação com o elemento <Ref>
, <Value>
funciona como o valor predefinido (ou alternativo). Se <Ref>
não for especificado, não for resolvível ou for nulo, é usado o valor de <Value>
.
O elemento <Value>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <AssignVariable> <Name>VARIABLE_NAME</Name> <Value>VARIABLE_VALUE</Value> </AssignVariable> </AssignMessage>
Exemplo 1
O exemplo seguinte define o valor da variável de fluxo de destino, myvar
,
para o valor literal 42
:
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Exemplo 2
O exemplo seguinte atribui o valor da variável de fluxo
request.header.user-agent
à variável de fluxo myvar
e o valor
do parâmetro de consulta country
à variável Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Se qualquer uma das atribuições falhar, <AssignVariable>
atribui o valor ErrorOnCopy
à variável de fluxo de destino.
<Copy>
Copia os valores da mensagem especificada pelo atributo source
para a mensagem especificada pelo elemento <AssignTo>
. Se não especificar um destino com <AssignTo>
, esta política copia os valores para o pedido ou a resposta, consoante o ponto do fluxo em que esta política é executada.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<AssignMessage>
|
Elementos subordinados |
<FormParams> <Headers> <Path> <Payload> <QueryParams> <StatusCode> <Verb> <Version> |
Se não especificar elementos subordinados abaixo do elemento <Copy>
, todas as partes da mensagem de origem designada são copiadas.
O elemento <Copy>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="POLICY_NAME" >
<Copy source="VARIABLE_NAME">
<!-- Can also be an empty array (<FormParams/>) -->
<FormParams>
<FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
...
</FormParams>
<!-- Copy all headers -->
<Headers/>
<!-- or, copy specific headers by name -->
<Headers>
<Header name="HEADER_NAME"/>
<!-- or -->
<Header name="HEADER_NAME">[false|true]</Header>
...
</Headers>
<Path>[false|true]</Path>
<Payload>[false|true]</Payload>
<!-- Can also be an empty array (<QueryParams/>) -->
<QueryParams>
<QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
...
</QueryParams>
<StatusCode>[false|true]</StatusCode>
<Verb>[false|true]</Verb>
<Version>[false|true]</Version>
</Copy>
<!-- Used as the destination for the <Copy>
values -->
<AssignTo createNew="[true|false]" transport="http"
type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
</AssignMessage>
Exemplo 1
O exemplo seguinte copia um cabeçalho, três parâmetros de formulário, o caminho e todos os parâmetros de consulta
da mensagem request
para um novo pedido personalizado denominado newRequest
:
<AssignMessage name="AM-copy-1"> <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo> <Copy source="request"> <Headers> <Header name="Header_Name_1"/> </Headers> <FormParams> <FormParam name="Form_Param_Name_1"/> <FormParam name="Form_Param_Name_2"/> <FormParam name="Form_Param_Name_3"/> </FormParams> <Path>true</Path> <QueryParams/> </Copy> </AssignMessage>
Uma vez que elementos como <Payload>
e <Verb>
não estão presentes, a política não copia essas partes da mensagem.
Exemplo 2
O exemplo seguinte remove primeiro tudo na mensagem response
existente e, em seguida,
copia todos os valores de uma mensagem diferente denominada secondResponse
para a mensagem
response
:
<AssignMessage name='AM-Copy-Response'> <AssignTo>response</AssignTo> <!-- first remove any existing values --> <Remove/> <!-- then copy everything from the designated message --> <Copy source="secondResponse"/> </AssignMessage>
O elemento <Copy>
tem um único atributo:
Atributo | Descrição | Obrigatório? | Tipo |
---|---|---|---|
fonte |
Especifica o objeto de origem da cópia.
|
Opcional | String |
<FormParams>
(filho de <Copy>
)
Copia os parâmetros do formulário do pedido especificado pelo elemento <Copy>
, atributo source
, para o pedido especificado pelo elemento <AssignTo>
. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de elementos <FormParam> ou uma matriz vazia |
Elemento principal |
<Copy>
|
Elementos subordinados |
<FormParam> |
O elemento <FormParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte copia um único parâmetro de formulário do pedido para o
pedido personalizado MyCustomRequest
:
<AssignMessage name="AM-copy-formparams-1"> <Copy source="request"> <FormParams> <FormParam name="paramName">Form param value 1</FormParam> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte copia todos os parâmetros do formulário para o pedido personalizado
MyCustomRequest
:
<AssignMessage name="AM-copy-formparams-2"> <Copy source="request"> <FormParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 3
O exemplo seguinte copia três parâmetros de formulário para o pedido personalizado
MyCustomRequest
:
<AssignMessage name="AM-copy-formparams-3"> <Copy source="request"> <FormParams> <FormParam name="paramName1"/> <FormParam name="paramName2"/> <FormParam name="paramName3"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 4
Se existirem vários parâmetros de formulário com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="AM-copy-formparams-4"> <Copy source="request"> <FormParams> <FormParam name="f1"/> <FormParam name="f2"/> <FormParam name="f3.2"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Este exemplo copia f1
, f2
e o segundo valor de f3
. Se f3
tiver apenas um valor, não é copiado.
Pode usar <Copy>
/<FormParams>
apenas quando os seguintes critérios forem cumpridos:
- O tipo de mensagem para a origem e o destino é pedido
- O verbo HTTP para a origem e o destino é
POST
ouPUT
- A mensagem de origem tem o cabeçalho
Content-Type
definido comoapplication/x-www-form-urlencoded
.
Quando copia <FormParams>
, <Copy>
define o cabeçalho Content-Type
na mensagem de destino (designada pelo elemento <AssignTo>
)
para application/x-www-form-urlencoded
.
<Headers>
(filho de <Copy>
)
Copia os cabeçalhos HTTP de da mensagem de pedido ou resposta especificada pelo elemento <Copy>
, atributo source
, para a mensagem de pedido ou resposta especificada pelo elemento <AssignTo>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Uma matriz de elementos <Header> ou uma matriz vazia |
Elemento principal |
<Copy>
|
Elementos subordinados |
<Header> |
O elemento <Headers>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <!-- Copy all headers --> <Headers/> <!-- or, copy specific headers by name --> <Headers> <Header name="HEADER_NAME"/> <!-- or --> <Header name="HEADER_NAME">[false|true]</Header> ... </Headers> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte copia o cabeçalho user-agent
do pedido para o objeto de pedido personalizado novo:
<AssignMessage name="AM-copy-headers-1"> <Copy source="request"> <Headers> <Header name="user-agent"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 2
Para copiar todos os cabeçalhos, use um elemento <Headers>
vazio, como mostra o exemplo seguinte:
<AssignMessage name="AM-copy-headers-2"> <Copy source="request"> <Headers/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 3
Se existirem vários cabeçalhos com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="AM-copy-headers-3"> <Copy source="request"> <Headers> <Header name="h1"/> <Header name="h2"/> <Header name="h3.2"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Este exemplo copia h1
, h2
e o segundo valor de h3
. Se h3
tiver apenas um valor, não é copiado.
<Path>
(filho de <Copy>
)
Determina se o caminho deve ser copiado do pedido de origem para o pedido de destino. Este elemento não tem efeito numa resposta.
Se true
, esta política copia o caminho de da mensagem de pedido especificada pelo elemento <Copy>
, o atributo source
, para a mensagem de pedido especificada pelo elemento <AssignTo>
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos subordinados | Nenhum |
O elemento <Path>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <Path>[false|true]</Path> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte indica que o AssignMessage deve copiar o caminho do pedido de origem para o novo objeto de pedido personalizado:
<AssignMessage name="copy-path-1"> <Copy source="request"> <Path>true</Path> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Pode usar <Copy>
/<Path>
apenas quando os seguintes critérios forem cumpridos:
- O tipo de mensagem para a origem e o destino é pedido
<Payload>
(filho de <Copy>
)
Determina se a carga útil deve ser copiada da origem para o destino. A origem e o destino podem ser pedidos ou respostas.
Se true
, esta política copia a carga útil de a mensagem especificada pelo elemento <Copy>
, o atributo source
, para a mensagem especificada pelo elemento <AssignTo>
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos subordinados | Nenhum |
O elemento <Payload>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <Payload>[false|true]</Payload> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte define <Payload>
como true
para que a carga útil do pedido seja
copiada do pedido para a resposta:
<AssignMessage name="AM-copy-payload-1"> <Copy source="request"> <Payload>true</Payload> </Copy> <AssignTo>response</AssignTo> </AssignMessage>
<QueryParams>
(filho de <Copy>
)
Copia os parâmetros de string de consulta do pedido especificado pelo elemento <Copy>
, atributo source
, para o pedido especificado pelo elemento <AssignTo>
. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Uma matriz de elementos <QueryParam> ou uma matriz vazia |
Elemento principal |
<QueryParam>
|
Elementos subordinados | Nenhum |
O elemento <QueryParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte copia o parâmetro de consulta my_param
do pedido para um novo objeto de pedido personalizado:
<AssignMessage name="copy-queryparams-1"> <Copy source="request"> <QueryParams> <QueryParam name="my_param"/> </QueryParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte copia todos os parâmetros de consulta do pedido para um novo objeto de pedido personalizado:
<AssignMessage name="copy-queryparams-2"> <Copy source="request"> <QueryParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Exemplo 3
Se existirem vários parâmetros de consulta com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="copy-queryparams-3"> <Copy source="request"> <QueryParams> <QueryParam name="qp1"/> <QueryParam name="qp2"/> <QueryParam name="qp3.2"/> </QueryParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Este exemplo copia qp1
, qp2
e o segundo valor de qp3
. Se qp3
tiver apenas um valor, este não é copiado.
Pode usar <Copy>
/<QueryParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbos HTTP:
GET
,PUT
,POST
,PATCH
eDELETE
- O tipo de mensagem para a origem e o destino é pedido
<StatusCode>
(filho de <Copy>
)
Determina se o código de estado é copiado da resposta de origem para a resposta de destino. Este elemento não tem efeito num pedido.
Se true
, esta política copia o código de estado da mensagem de resposta especificada pelo elemento <Copy>
, o atributo source
para a mensagem de resposta especificada pelo elemento <AssignTo>
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos subordinados | Nenhum |
O elemento <StatusCode>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <StatusCode>[false|true]</StatusCode> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte define <StatusCode>
como true
, o que copia o código de estado
do objeto de resposta predefinido para um objeto de resposta personalizado novo:
<AssignMessage name="copy-statuscode-1"> <Copy source="response"> <StatusCode>true</StatusCode> </Copy> <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo> </AssignMessage>
Só pode usar <StatusCode>
quando as mensagens de origem e destino são do tipo resposta.
Uma utilização comum de <StatusCode>
é definir o código de estado da resposta do proxy para um valor diferente do recebido do destino.
<Verb>
(filho de <Copy>
)
Determina se o verbo HTTP é copiado do pedido de origem para o pedido de destino. Este elemento não tem efeito numa resposta.
Se true
, copia o verbo encontrado no atributo source
do elemento <Copy>
para o pedido especificado no elemento <AssignTo>
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos subordinados | Nenhum |
O elemento <Verb>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <Verb>[false|true]</Verb> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte define <Verb>
como true
, o que copia o verbo do pedido predefinido para um novo pedido personalizado:
<AssignMessage name="copy-verb-1"> <Copy source="request"> <Verb>true</Verb> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Pode usar <Copy>
/<Verb>
apenas quando os seguintes critérios forem cumpridos:
- O tipo de mensagem para a origem e o destino é pedido
<Version>
(filho de <Copy>
)
Determina se a versão HTTP é copiada do pedido de origem para o pedido de destino. Este elemento não tem efeito numa resposta.
Se true
, copia a versão HTTP encontrada no atributo source
do elemento <Copy>
para o objeto especificado pelo elemento <AssignTo>
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos subordinados | Nenhum |
O elemento <Version>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Copy source="VARIABLE_NAME"> <Version>[false|true]</Version> </Copy> </AssignMessage>
Exemplo 1
O exemplo seguinte define <Version>
como true
no pedido, o que copia a versão do objeto de pedido predefinido para um novo objeto de pedido personalizado:
<AssignMessage name="copy-version-1"> <Copy source="request"> <Version>true</Version> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Pode usar <Copy>
/<Version>
apenas quando os seguintes critérios forem cumpridos:
- O tipo de mensagem para a origem e o destino é pedido
<DisplayName>
Use em conjunto com o atributo name
para etiquetar a política no editor de proxy da IU de gestão com um nome diferente e mais natural.
O elemento <DisplayName>
é comum a todas as políticas.
Valor predefinido | N/A |
Obrigatório? | Opcional. Se omitir <DisplayName> , é usado o valor do atributo name da política. |
Tipo | String |
Elemento principal | <PolicyElement> |
Elementos subordinados | Nenhum |
O elemento <DisplayName>
usa a seguinte sintaxe:
Sintaxe
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Exemplo
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
O elemento <DisplayName>
não tem atributos nem elementos subordinados.
<IgnoreUnresolvedVariables>
Determina se o processamento é interrompido quando é encontrada uma variável não resolvida.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<AssignMessage>
|
Elementos subordinados | Nenhum |
Definido como true
para ignorar as variáveis não resolvidas e continuar o processamento; caso contrário, false
. O valor predefinido é false
.
Definir <IgnoreUnresolvedVariables>
como true
é diferente de definir o <AssignMessage>
's
continueOnError
como true
, uma vez que é específico para definir e obter valores de
variáveis. Se definir continueOnError
como true
, o Apigee ignora todos os erros e não apenas os erros encontrados ao usar variáveis.
O elemento <IgnoreUnresolvedVariables>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> </AssignMessage>
Exemplo 1
O exemplo seguinte define <IgnoreUnresolvedVariables>
como true
:
<AssignMessage name="AM-Set-Headers"> <Set> <Headers> <Header name='new-header'>{possibly-defined-variable}<Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Uma vez que <IgnoreUnresolvedVariables>
está definido como true
, se
a variável possibly-defined-variable
não estiver definida, esta política
não gera uma falha.
<Remove>
Remove cabeçalhos, parâmetros de consulta, parâmetros de formulário e/ou a carga útil da mensagem de uma mensagem. Uma etiqueta <Remove>
vazia remove tudo da mensagem.
A mensagem afetada pode ser um pedido ou uma resposta. Especifica a mensagem sobre a qual o <Remove>
atua através do elemento <AssignTo>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Tipo complexo |
Elemento principal |
<AssignMessage>
|
Elementos subordinados |
<FormParams> <Headers> <Payload> <QueryParams> |
Um exemplo de utilização comum para <Remove>
é eliminar um parâmetro de consulta ou um cabeçalho que contenha informações confidenciais do objeto de pedido recebido para evitar transmiti-lo ao servidor de back-end.
O elemento <Remove>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Remove all form parameters --> <FormParams/> <!-- or, remove specific form parameters by name --> <FormParams> <FormParam name="FORMPARAM_NAME"/> <!-- or --> <FormParam name="FORMPARAM_NAME">[false|true]</FormParam> ... </FormParams> <!-- Remove all headers --> <Headers/> <!-- or, remove specific headers by name --> <Headers> <Header name="HEADER_NAME"/> <!-- or --> <Header name="HEADER_NAME">[false|true]</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Remove all query parameters --> <QueryParams/> <!-- or, remove specific query parameters by name --> <QueryParams> <QueryParam name="QUERYPARAM_NAME"/> <!-- or --> <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Exemplo 1
O exemplo seguinte remove o corpo da mensagem da resposta:
<AssignMessage name="AM-remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo>response</AssignTo> </AssignMessage>
No fluxo de resposta, esta política remove o corpo da resposta, devolvendo apenas cabeçalhos HTTP ao cliente.
Exemplo 2
O exemplo seguinte remove todos os parâmetros de formulário e um parâmetro de consulta do objeto request
:
<AssignMessage name="AM-remove-2"> <Remove> <!-- Empty (<FormParams/>) removes all form parameters --> <FormParams/> <QueryParams> <QueryParam name="qp1"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 3
O exemplo seguinte remove tudo de um objeto de mensagem:
<AssignMessage name="AM-remove-3"> <Remove/> <AssignTo>request</AssignTo> </AssignMessage>
Normalmente, só o faz se for usar o elemento <Set>
ou o elemento
<Copy>
para definir alguns valores de substituição na mensagem.
<FormParams>
(filho de <Remove>
)
Remove os parâmetros de formulário especificados do pedido. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de elementos <FormParam> ou uma matriz vazia |
Elemento principal |
<Remove>
|
Elementos subordinados |
<FormParam> |
O elemento <FormParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Remove all form parameters --> <FormParams/> <!-- or, remove specific form parameters by name --> <FormParams> <FormParam name="FORMPARAM_NAME"/> <!-- or --> <FormParam name="FORMPARAM_NAME">[false|true]</FormParam> ... </FormParams> </Remove> </AssignMessage>
Exemplo 1
O exemplo seguinte remove três parâmetros de formulário do pedido:
<AssignMessage name="AM-remove-formparams-1"> <Remove> <FormParams> <FormParam name="form_param_1"/> <FormParam name="form_param_2"/> <FormParam name="form_param_3"/> </FormParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte remove todos os parâmetros de formulário do pedido:
<AssignMessage name="AM-remove-formparams-2"> <Remove> <FormParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 3
Se existirem vários parâmetros de formulário com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="AM-remove-formparams-3"> <Remove> <FormParams> <FormParam name="f1"/> <FormParam name="f2"/> <FormParam name="f3.2"/> </FormParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Este exemplo remove f1
, f2
e o segundo valor de f3
. Se f3
tiver apenas um valor, este não é removido.
Pode usar o <FormParams>
apenas quando os seguintes critérios forem cumpridos:
- Tipo de mensagem: pedido
Content-Type
:application/x-www-form-urlencoded
<Headers>
(filho de <Remove>
)
Remove os cabeçalhos HTTP especificados do pedido ou da resposta, que são especificados pelo elemento <AssignTo>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de elementos <Header> ou uma matriz vazia |
Elemento principal |
<Remove>
|
Elementos subordinados |
<Header> |
O elemento <Headers>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Remove all headers --> <Headers/> <!-- or, remove specific headers by name --> <Headers> <Header name="HEADER_NAME"/> <!-- or --> <Header name="HEADER_NAME">[false|true]</Header> ... </Headers> </Remove> </AssignMessage>
Exemplo 1
O exemplo seguinte remove o cabeçalho user-agent
do pedido:
<AssignMessage name="AM-remove-one-header"> <Remove> <Headers> <Header name="user-agent"/> </Headers> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte remove todos os cabeçalhos do pedido:
<AssignMessage name="AM-remove-all-headers"> <Remove> <Headers/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 3
Se existirem vários cabeçalhos com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="AM-remove-headers-3"> <Remove> <Headers> <Header name="h1"/> <Header name="h2"/> <Header name="h3.2"/> </Headers> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Este exemplo remove h1
, h2
e o segundo valor de h3
do pedido. Se h3
tiver apenas um valor, não é removido.
<Payload>
(filho de <Remove>
)
Determina se <Remove>
elimina a carga útil no pedido ou na resposta, que é
especificada pelo elemento <AssignTo>
. Defina como true
para
limpar o payload; caso contrário, false
. O valor predefinido é false
.
Valor predefinido | Falso |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<Remove>
|
Elementos subordinados | Nenhum |
O elemento <Payload>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <Payload>[false|true]</Payload> </Remove> </AssignMessage>
Exemplo 1
O exemplo seguinte define <Payload>
como true
para que o payload do pedido seja
limpo:
<AssignMessage name="AM-remove-payload-1"> <Remove> <Payload>true</Payload> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
<QueryParams>
(filho de <Remove>
)
Remove os parâmetros de consulta especificados do pedido. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de elementos <QueryParam> ou uma matriz vazia |
Elemento principal |
<Remove>
|
Elementos subordinados |
<QueryParam> |
O elemento <QueryParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <!-- Can also be empty to remove everything from the message (<Remove/>) --> <Remove> <!-- Remove all query parameters --> <QueryParams/> <!-- or, remove specific query parameters by name --> <QueryParams> <QueryParam name="QUERYPARAM_NAME"/> <!-- or --> <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Exemplo 1
O exemplo seguinte remove o parâmetro de consulta apikey
do pedido:
<AssignMessage name="AM-remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte remove todos os parâmetros de consulta do pedido:
<AssignMessage name="AM-remove-queryparams-2"> <Remove> <QueryParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 3
Se existirem vários parâmetros de consulta com o mesmo nome, use a seguinte sintaxe:
<AssignMessage name="AM-remove-queryparams-3"> <Remove> <QueryParams> <QueryParam name="qp1"/> <QueryParam name="qp2"/> <QueryParam name="qp3.2"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Este exemplo remove qp1
, qp2
e o segundo valor de qp3
do pedido. Se
qp3
tiver apenas um valor, não é removido.
Pode usar o <QueryParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbos HTTP:
GET
,POST
,PATCH
,DELETE
- Tipo de mensagem: pedido
<Set>
Define informações na mensagem de pedido ou resposta, que são especificadas pelo elemento <AssignTo>
. <Set>
substitui os cabeçalhos ou os parâmetros de consulta ou de formulário que já existem na mensagem original, ou adiciona novos se não existirem.
Os cabeçalhos e os parâmetros de consulta e de formulário
numa mensagem HTTP podem conter vários valores. Para adicionar valores adicionais a um cabeçalho ou um parâmetro, use o elemento <Add>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Tipo complexo |
Elemento principal |
<AssignMessage>
|
Elementos subordinados |
<Authentication> <FormParams> <Headers> <Payload> <Path> <QueryParams> <StatusCode> <Verb> <Version> |
O elemento <Set>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> <Path>PATH</Path> <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX" variableSuffix="SUFFIX">NEW_PAYLOAD</Payload> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define um cabeçalho específico. Quando esta política é anexada no fluxo de pedidos, permite que o sistema a montante receba um cabeçalho adicional que não foi incluído no pedido de entrada original.
<AssignMessage name="AM-Set-Header"> <Set> <Headers> <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header> </Headers> </Set> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O exemplo seguinte substitui o payload de uma resposta, bem como o cabeçalho Content-Type
.
<AssignMessage name="AM-Overwrite-Payload"> <Set> <Payload contentType="application/json">{ "status" : 42 }</Payload> </Set> <AssignTo>response</AssignTo> </AssignMessage>
<Authentication> (elemento secundário de <Set>
)
Gera um token de acesso Google OAuth 2.0
ou um token de ID OpenID Connect
emitido pela Google e define-o no cabeçalho Authorization
. Isto é útil quando o proxy tem de fazer chamadas autenticadas para serviços Google e serviços personalizados em execução em determinados produtos do Google Cloud, como o Cloud Functions e o Cloud Run.
A utilização deste elemento requer passos de configuração e implementação descritos no artigo
Usar a autenticação Google. Com a configuração adequada, a política cria um token para si e adiciona-o ao cabeçalho adequado no pedido.
Os elementos filhos, GoogleAccessToken
e GoogleIDToken
, permitem-lhe
configurar a política para gerar um token do Google OAuth ou do OpenID Connect. seleciona um destes elementos secundários com base no requisito do serviço que quer chamar.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Tipo complexo |
Elemento principal |
<Set>
|
Elementos subordinados |
<HeaderName> <GoogleAccessToken> <GoogleIdToken> |
O elemento Authentication
usa a seguinte sintaxe:
Sintaxe
<AssignMessage> ... <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> --EITHER-- <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> <GoogleAccessToken> --OR-- <GoogleIDToken> <Audience ref="FLOW_VARIABLE">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </Set> ... </AssignMessage>
Usar o token de acesso
O exemplo seguinte mostra o elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Usar token de ID
O exemplo seguinte mostra o elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
Usar HeaderName
O exemplo seguinte mostra o elemento HeaderName
:
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<HeaderName> (elemento subordinado de <Authentication>
)
Por predefinição, quando existe uma configuração de autenticação, o Apigee gera um token de autorização
e injeta-o no cabeçalho Authorization
na mensagem enviada para o sistema de destino.
O elemento HeaderName
permite especificar o nome de um cabeçalho diferente para conter esse token de portador. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<Authentication>
|
Elementos subordinados |
Nenhum |
O elemento HeaderName
usa a seguinte sintaxe:
Sintaxe
<AssignMessage> ... <Authentication> <HeaderName>HEADER_NAME</HeaderName> <GoogleAccessToken> ... </GoogleAccessToken> </Authentication> ... </AssignMessage>
Com string estática
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado Authorization
que é enviado para o sistema de destino. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Com referência a variáveis
Neste exemplo, o token de autorização gerado é adicionado, por predefinição, a um cabeçalho denominado Authorization
que é enviado para o sistema de destino. Se my-variable
tiver um valor, esse valor é usado em vez da string predefinida. O cabeçalho Authorization
, se estiver presente, é deixado inalterado e também enviado no pedido.
<Authentication> <HeaderName ref='my-variable'>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scopes>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> >/GoogleAccessToken> </Authentication>
<GoogleAccessToken> (elemento subordinado de <Authentication>
)
Gera tokens Google OAuth 2.0 para fazer chamadas autenticadas aos serviços Google. Os tokens OAuth da Google podem ser usados para chamar muitos tipos de serviços Google, como o Cloud Logging e o Secret Manager.
Valor predefinido | N/A |
Obrigatório? | Tem de estar presente o elemento subordinado GoogleAccessToken ou GoogleIDToken . |
Tipo | String |
Elemento principal |
<Authentication>
|
Elementos subordinados |
<Scopes> |
O elemento GoogleAccessToken
usa a seguinte sintaxe:
Sintaxe
<AssignMessage> ... <Authentication> <GoogleAccessToken> <Scopes> <Scope>SCOPE_1</Scope> ... </Scopes> >/GoogleAccessToken> </Authentication> ... </AssignMessage>
Exemplo 1
O exemplo seguinte mostra o elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<Scopes> (elemento secundário de <GoogleAccessToken>
)
Identifica os âmbitos a incluir na chave de acesso OAuth 2.0. Para mais informações, consulte o artigo
Âmbitos do OAuth 2.0 para APIs Google. Pode adicionar um ou mais <Scope>
elementos secundários
a este elemento.
Valor predefinido | N/A |
Obrigatório? | Obrigatória |
Tipo | String |
Elemento principal |
<GoogleAccessToken>
|
Elementos subordinados |
<Scope> |
O elemento Scopes
usa a seguinte sintaxe:
<Scopes> <Scope>SCOPE_1</Scope> <Scope>SCOPE_2</Scope> ... </Scopes>
<Scope> (elemento subordinado de <Scopes>
)
Especifica um âmbito da API Google válido. Para mais informações, consulte o artigo Âmbitos do OAuth 2.0 para APIs Google.
Valor predefinido | N/A |
Obrigatório? | É necessário, pelo menos, um valor. |
Tipo | String |
Elemento principal |
<Scopes>
|
Elementos subordinados |
Nenhum |
O elemento Scope
usa a seguinte sintaxe:
<Scope>SCOPE_1</Scope>
<GoogleIDToken> (elemento secundário de <GoogleAccessToken>
)
Gera tokens OpenID Connect emitidos pela Google para fazer chamadas autenticadas aos serviços Google.
Valor predefinido | N/A |
Obrigatório? | Tem de estar presente o elemento subordinado GoogleAccessToken ou GoogleIDToken . |
Tipo | String |
Elemento principal |
<Authentication>
|
Elementos subordinados |
<Audience> |
O elemento GoogleIDToken
usa a seguinte sintaxe:
Sintaxe
<AssignMessage> ... <Authentication> <GoogleIDToken> <Audience ref="FLOW_VARIABLE_NAME">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </AssignMessage>
Exemplo 1
O exemplo seguinte mostra o elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
<Audience> (elemento secundário de <GoogleAccessToken>
)
O público-alvo do token de autenticação gerado, como a API ou a conta à qual o token concede acesso.
Se o valor de Audience
estiver vazio ou a variável ref
não for resolvida para um valor válido e
useTargetUrl
for true
, o URL do destino (excluindo quaisquer
parâmetros de consulta) é usado como público-alvo. Por predefinição, useTargetUrl
é false
.
Valor predefinido | N/A |
Obrigatório? | Obrigatória |
Tipo | String |
Elemento principal | |
Elementos subordinados |
Nenhum |
O elemento Audience
usa a seguinte sintaxe:
<Audience>TARGET_URL</Audience> or: <Audience ref='FLOW_VARIABLE_NAME'/>
<FormParams>
(filho de <Set>
)
Substitui os parâmetros de formulário existentes num pedido e substitui-os pelos novos valores que especificar com este elemento. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <FormParam> elementos |
Elemento principal |
<Set>
|
Elementos subordinados |
<FormParam> |
O elemento <FormParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <FormParams> <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam> ... </FormParams> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define um parâmetro de formulário denominado myparam
com o valor da variável request.header.myparam
num novo pedido personalizado:
<AssignMessage name="AM-set-formparams-1"> <Set> <FormParams> <FormParam name="myparam">{request.header.myparam}</FormParam> </FormParams> </Set> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Pode usar o <FormParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbo HTTP:
POST
- Tipo de mensagem: pedido
Se definir parâmetros de formulário vazios na sua política
(<Set><FormParams/></Set>
), a política não adiciona parâmetros
de formulário. Isto é o mesmo que omitir o <FormParams>
.
Quando usa o <Set>
com o <FormParams>
, o Apigee altera o Content-Type
da mensagem para
application/x-www-form-urlencoded
.
<Headers>
(filho de <Set>
)
Substitui os cabeçalhos HTTP existentes no pedido ou na resposta, que é especificado pelo elemento <AssignTo>
.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <Header> elementos |
Elemento principal |
<Set>
|
Elementos subordinados |
<Header> |
O elemento <Headers>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Headers> <Header name="HEADER_NAME">HEADER_VALUE</Header> ... </Headers> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define o cabeçalho x-ratelimit-remaining
para o valor da variável ratelimit.Quota-1.available.count
:
<AssignMessage name="AM-Set-RateLimit-Header"> <Set> <Headers> <Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header> </Headers> </Set> <AssignTo>response</AssignTo> </AssignMessage>
Se definir cabeçalhos vazios na sua política (<Set><Headers/></Set>
), a política não define cabeçalhos. Isto
tem o mesmo efeito que omitir <Headers>
.
<Path>
(filho de <Set>
)
<Payload>
(filho de <Set>
)
Define o corpo da mensagem para um pedido ou uma resposta, que é especificado pelo elemento <AssignTo>
. O payload pode ser qualquer tipo de conteúdo válido, como texto simples, JSON ou XML.
Valor predefinido | string vazia |
Obrigatório? | Opcional |
Tipo | String |
Elemento principal |
<Set>
|
Elementos subordinados | Nenhum |
O elemento <Payload>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX" variableSuffix="SUFFIX">NEW_PAYLOAD</Payload> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define uma carga útil de texto simples:
<AssignMessage name="AM-set-payload-1"> <Set> <Payload contentType="text/plain">42</Payload> </Set> </AssignMessage>
Exemplo 2
O exemplo seguinte define um payload JSON:
<AssignMessage name="AM-set-payload-2"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set> </AssignMessage>
Exemplo 3
O exemplo seguinte insere valores de variáveis no payload colocando os nomes das variáveis entre chavetas:
<AssignMessage name="AM-set-payload-3"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set> </AssignMessage>
Nas versões mais antigas do Apigee, por exemplo, antes do lançamento na nuvem 16.08.17, não podia usar chavetas para indicar referências de variáveis em payloads JSON. Nessas versões, tinha de usar os atributos variablePrefix
e variableSuffix
para especificar carateres delimitadores e usá-los para envolver nomes de variáveis, da seguinte forma:
<AssignMessage name="AM-set-payload-3b"> <Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set> </AssignMessage>
Esta sintaxe mais antiga continua a funcionar.
Exemplo 4
O conteúdo de <Payload>
é tratado como um modelo de mensagem. Isto significa que a política AssignMessage substitui as variáveis envolvidas em chavetas pelo valor das variáveis referenciadas no tempo de execução.
O exemplo seguinte usa a sintaxe de chavetas para definir parte da carga útil para um valor de variável:
<AssignMessage name="AM-set-payload-4"> <Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </root> </Payload> </Set> </AssignMessage>
A tabela seguinte descreve os atributos de <Payload>
:
Atributo | Descrição | Presença | Tipo |
---|---|---|---|
contentType |
Se for especificado, o valor de |
Opcional | String |
variablePrefix |
Especifica opcionalmente o delimitador inicial numa variável de fluxo. O valor predefinido é "{". Para mais informações, consulte a referência de variáveis de fluxo. | Opcional | Char |
variableSuffix |
Especifica opcionalmente o delimitador final numa variável de fluxo. O valor predefinido é "}". Para mais informações, consulte a referência de variáveis de fluxo. | Opcional | Char |
<QueryParams>
(filho de <Set>
)
Substitui os parâmetros de consulta existentes no pedido por novos valores. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | Matriz de <QueryParam> elementos |
Elemento principal |
<Set>
|
Elementos subordinados |
<QueryParam> |
O elemento <QueryParams>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <QueryParams> <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam> ... </QueryParams> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define o parâmetro de consulta address
para o valor da variável request.header.address
:
<AssignMessage name="AM-set-queryparams-1"> <Set> <QueryParams> <QueryParam name="address">{request.header.address}</QueryParam> </QueryParams> </Set> </AssignMessage>
Pode usar <Set>
/<QueryParams>
apenas quando os seguintes critérios forem cumpridos:
- Verbos HTTP:
GET
,PUT
,POST
,PATCH
eDELETE
- Tipo de mensagem: pedido
Se definir parâmetros de consulta vazios na sua política
(<Set><QueryParams/></Set>
), a política não define parâmetros de consulta. Isto é o mesmo que omitir <QueryParams>
.
<StatusCode>
(filho de <Set>
)
Define o código de estado na resposta. Este elemento não tem efeito num pedido.
Valor predefinido | "200" (quando o atributo createNew de <AssignTo> está definido como "true") |
Obrigatório? | Opcional |
Tipo | String ou VARIABLE |
Elemento principal |
<Set>
|
Elementos subordinados | Nenhum |
O elemento <StatusCode>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define um código de estado simples:
<AssignMessage name="AM-set-statuscode-404"> <Set> <StatusCode>404</StatusCode> </Set> <AssignTo>response</AssignTo> </AssignMessage>
Exemplo 2
O conteúdo de <StatusCode>
é tratado como um modelo de mensagem. Isto significa que um nome de variável entre chavetas será substituído no momento da execução pelo valor da variável referenciada, como mostra o exemplo seguinte:
<AssignMessage name="set-statuscode-2"> <Set> <StatusCode>{calloutresponse.status.code}</StatusCode> </Set> <AssignTo>response</AssignTo> </AssignMessage>
Pode usar <Set>
/<StatusCode>
apenas quando os seguintes critérios forem cumpridos:
- Tipo de mensagem: resposta
<Verb>
(filho de <Set>
)
Define o verbo HTTP no pedido. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String ou VARIABLE |
Elemento principal |
<Set>
|
Elementos subordinados | Nenhum |
O elemento <Verb>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define um verbo simples no pedido:
<AssignMessage name="AM-set-verb-1"> <Set> <Verb>POST</Verb> </Set> <AssignTo>request</AssignTo> </AssignMessage>
Exemplo 2
O conteúdo de <Verb>
é tratado como um modelo de mensagem. Isto significa que um nome de variável
entre chavetas é substituído no momento da execução pelo valor da variável
referenciada.
O exemplo seguinte usa uma variável para preencher um verbo:
<AssignMessage name="AM-set-verb-to-dynamic-value"> <Set> <Verb>{my_variable}</Verb> </Set> <AssignTo>request</AssignTo> </AssignMessage>
Pode usar <Set>
/<Verb>
apenas quando os seguintes critérios forem cumpridos:
- Tipo de mensagem: pedido
<Version>
(filho de <Set>
)
Define a versão HTTP num pedido. Este elemento não tem efeito numa resposta.
Valor predefinido | N/A |
Obrigatório? | Opcional |
Tipo | String ou VARIABLE |
Elemento principal |
<Set>
|
Elementos subordinados | Nenhum |
O elemento <Version>
usa a seguinte sintaxe:
Sintaxe
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Exemplo 1
O exemplo seguinte define o número da versão como 1.1
:
<AssignMessage name="AM-set-version-1"> <Set> <Version>1.1</Version> </Set> </AssignMessage>
Exemplo 2
O exemplo seguinte usa uma variável entre chavetas para definir o número da versão:
<AssignMessage name="AM-set-version-2"> <Set> <Version>{my_version}</Version> </Set> <AssignTo>request</AssignTo> </AssignMessage>
O conteúdo de <Version>
é tratado como um modelo de mensagem. Isto significa que um nome de variável entre chavetas é substituído no tempo de execução pelo valor da variável referenciada.
Pode usar <Set>
/<Version>
apenas quando os seguintes critérios forem cumpridos:
- Tipo de mensagem: pedido
Crie mensagens de pedido personalizadas
Pode usar AssignMessage para criar uma mensagem de pedido personalizada. Depois de criar um pedido personalizado, pode usá-lo das seguintes formas:
- Aceder às respetivas variáveis noutras políticas
- Transmiti-lo a um serviço externo
Para criar uma mensagem de pedido personalizada, use o elemento <AssignTo>
na sua política AssignMessage. Defina createNew
como true
e especifique o nome da nova mensagem no corpo do elemento, como mostra o exemplo seguinte:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </AssignMessage>
Por predefinição, o Apigee não faz nada com a mensagem de pedido personalizada. Depois de o criar, o Apigee continua o fluxo com o pedido original. Para usar o pedido personalizado, adicione uma política, como a política ServiceCallout, ao seu proxy e faça referência explícita à mensagem de pedido criada recentemente na configuração dessa política. Isto permite-lhe transmitir o pedido personalizado para um ponto final de serviço externo.
Os exemplos seguintes criam mensagens de pedido personalizadas:
Exemplo 1
O exemplo seguinte cria um objeto de pedido personalizado com AssignMessage:
<AssignMessage name="AssignMessage-3"> <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo> <Copy> <Headers> <Header name="user-agent"/> </Headers> </Copy> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.addy}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
Este exemplo:
- Cria um novo objeto de mensagem de pedido denominado
MyCustomRequest
. - Em MyCustomRequest, esta política:
- Copia o valor do cabeçalho HTTP
user-agent
do pedido recebido para a nova mensagem. Uma vez que<Copy>
não especifica o atributosource
, o Apigee usa a mensagemrequest
como a origem a partir da qual copiar. - Define o parâmetro de consulta
address
na mensagem personalizada para o valor do parâmetro de consultaaddy
do pedido recebido. - Define o verbo HTTP como
GET
.
- Copia o valor do cabeçalho HTTP
- Define
<IgnoreUnresolvedVariables>
comofalse
. Quando<IgnoreUnresolvedVariables>
éfalse
, se uma das variáveis referenciadas na configuração da política não existir, o Apigee entra no estado de falha no fluxo da API.
Exemplo 2
Segue-se outro exemplo que demonstra como criar um objeto de pedido personalizado com AssignMessage:
<AssignMessage name="AssignMessage-2"> <AssignTo createNew="true" type="request">partner.request</AssignTo> <Set> <Verb>POST</Verb> <Payload contentType="text/xml"> <request><operation>105</operation></request> </Payload> </Set> </AssignMessage>
Este exemplo cria um novo pedido personalizado denominado partner.request
. Em seguida, define os valores
<Verb>
e <Payload>
no novo pedido.
Pode aceder às várias propriedades de uma mensagem personalizada noutra política AssignMessage que ocorra mais tarde no fluxo. O exemplo seguinte obtém o valor de um cabeçalho de uma resposta personalizada denominada e coloca-o num novo cabeçalho na mensagem de pedido:
<AssignMessage name="AM-Copy-Custom-Header"> <AssignTo>request</AssignTo> <Set> <Headers> <Header name="injected-approval-id">{MyCalloutResponse.header.approval-id}</Header> </Headers> </Set> </AssignMessage>
Códigos de erro
Esta secção descreve os códigos de falha e as mensagens de erro devolvidas, bem como as variáveis de falha definidas pelo Apigee quando esta política aciona um erro. Estas informações são importantes para saber se está a desenvolver regras de falhas para tratar falhas. Para saber mais, consulte o artigo O que precisa de saber acerca dos erros de políticas e o artigo Processamento de falhas.
Erros de tempo de execução
Estes erros podem ocorrer quando a política é executada.
Código de falha | Estado de HTTP | Causa | Corrigir |
---|---|---|---|
steps.assignmessage.SetVariableFailed |
500 |
A política não conseguiu definir uma variável. Veja a string de falha para o nome da variável não resolvida. | |
steps.assignmessage.VariableOfNonMsgType |
500 |
Este erro ocorre se o atributo As variáveis de tipo de mensagem representam pedidos e respostas HTTP completos. As variáveis de fluxo incorporadas do Apigee |
build |
steps.assignmessage.UnresolvedVariable |
500 |
Este erro ocorre se uma variável especificada na política AssignMessage for:
|
build |
Erros de implementação
Estes erros podem ocorrer quando implementa um proxy que contém esta política.
Nome do erro | Causa | Corrigir |
---|---|---|
InvalidIndex |
Se o índice especificado nos elementos <Copy> e/ou <Remove> da política AssignMessage
for 0 ou um número negativo, a implementação do proxy da API falha.
|
build |
InvalidVariableName |
Se o elemento filho <Name> estiver vazio ou não for especificado no elemento <AssignVariable> ,
a implementação do proxy de API falha porque não existe um nome de variável válido ao qual
atribuir um valor. É necessário um nome de variável válido.
|
build |
InvalidPayload |
Um payload especificado na política é inválido. |
Variáveis de falha
Estas variáveis são definidas quando esta política aciona um erro no tempo de execução. Para mais informações, consulte o artigo O que precisa de saber sobre os erros de políticas.
Variáveis | Onde | Exemplo |
---|---|---|
fault.name="FAULT_NAME" |
FAULT_NAME é o nome da falha, conforme indicado na tabela Erros de tempo de execução acima. O nome da falha é a última parte do código de falha. | fault.name Matches "UnresolvedVariable" |
assignmessage.POLICY_NAME.failed |
POLICY_NAME é o nome especificado pelo utilizador da política que gerou a falha. | assignmessage.AM-SetResponse.failed = true |
Exemplo de resposta de erro
{ "fault":{ "detail":{ "errorcode":"steps.assignmessage.VariableOfNonMsgType" }, "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message" } }
Exemplo de regra de falha
<FaultRule name="Assign Message Faults"> <Step> <Name>AM-CustomNonMessageTypeErrorResponse</Name> <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition> </Step> <Step> <Name>AM-CustomSetVariableErrorResponse</Name> <Condition>(fault.name = "SetVariableFailed")</Condition> </Step> <Condition>(assignmessage.failed = true) </Condition> </FaultRule>
Esquemas
Cada tipo de política é definido por um esquema XML (.xsd
). Para referência, os esquemas de políticas
estão disponíveis no GitHub.
Tópicos relacionados
Exemplos de funcionamento da política AssignMessage estão disponíveis nos exemplos da plataforma de APIs.
Para ver um exemplo mais avançado de como substituir o target.url
do elemento ProxyEndpoint
, consulte este artigo da comunidade do Apigee.
Para ver um caminho definido em ação numa política ServiceCallout, consulte este exemplo de aprendizagem prática nos exemplos do GitHub do Apigee. Basta clonar o repositório e
seguir as instruções nesse tópico. O exemplo usa AssignMessage para definir um caminho de pedido e, em seguida, usa uma política ServiceCallout
para fazer o pedido a um serviço externo.