Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
As condições permitem que os proxies de API se comportem dinamicamente no tempo de execução. As condições definem operações
em variáveis, que são avaliadas pelo pipeline de processamento do Apigee. As declarações condicionais
são booleanas e são sempre avaliadas como true
ou false
.
Vista geral das condições
Esta secção descreve como e onde usar declarações condicionais com o Apigee. Além disso, as secções seguintes descrevem a sintaxe:
Estrutura das declarações condicionais
A estrutura básica de uma declaração condicional é:
<Condition>variable.name operator "value"</Condition>
Por exemplo:
<Condition>request.verb = "GET"</Condition>
Pode combinar condições com AND
para aplicar mais do que uma de cada vez. Por exemplo, as seguintes condições são avaliadas como true
apenas se o URI do pedido corresponder a /statuses
e o verbo HTTP do pedido for GET
:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Onde pode usar declarações condicionais
Pode usar condições para controlar o comportamento no seguinte:
Execução de políticas
Ao usar declarações condicionais, pode controlar a aplicação de políticas. Um exemplo de utilização comum é a transformação condicional de mensagens de resposta, com base no cabeçalho HTTP ou no conteúdo da mensagem.
O exemplo seguinte transforma condicionalmente XML em JSON com base no cabeçalho Accept
:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Execução do fluxo
Através de declarações condicionais, pode controlar a execução de fluxos com nome em ProxyEndpoints
e TargetEndpoints
. Tenha em atenção que só é possível executar condicionalmente fluxos denominados. Os preflows e os postflows (tanto o pedido como a resposta) em ProxyEndpoints
e TargetEndpoints
são executados para todas as transações e, por isso, oferecem capacidades de segurança incondicionais.
Por exemplo, para executar um fluxo de pedidos condicional com base no verbo HTTP da mensagem de pedido e um fluxo de respostas condicional com base num (potencial) código de estado HTTP que represente um erro:
<Flow name="GetRequests"> <Condition>request.verb = "GET"</Condition> <Request> <Step> <Condition>request.path MatchesPath "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
Seleção de trajeto do ponto final de destino
Através de declarações condicionais, pode controlar o ponto final de destino invocado pela configuração do ponto final do proxy. Uma regra de encaminhamento encaminha um pedido para um ponto final de destino específico. Quando estiver disponível mais do que um ponto final de destino, a regra de encaminhamento é avaliada quanto à respetiva condição e, se for verdadeira, o pedido é encaminhado para o ponto final de destino com o nome indicado.
Por exemplo, para encaminhar condicionalmente mensagens para pontos finais de destino designados com base em
Content-Type
:
<RouteRule name="default">
<!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
<Condition>request.header.Content-Type = "text/xml"</Condition>
<TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
Consulte as variáveis de fluxo e as condições para mais informações.
Expressões de caminho
As expressões de caminho são usadas para fazer corresponder caminhos de URI, usando *
para representar um único elemento de caminho
e **
para representar vários níveis de URI. As chavetas {name}
também podem ser usadas para corresponder a um único elemento do caminho e dar clareza ao leitor. A variável name
só é usada para esclarecimento e não preenche o valor correspondente numa variável de fluxo.
Por exemplo:
Padrão | Exemplos de caminhos de URI correspondentes |
---|---|
/*/a/ |
/x/a/ ou /y/a/ |
/*/a/* |
/x/a/b ou /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/{reader}/feed/ |
/x/a/b/feed/ ou /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
%
é tratado como um caráter de escape. O padrão
%{user%}
corresponde a {user}
, mas não a
user
.
Variáveis
Pode usar variáveis de fluxo integradas e variáveis personalizadas em declarações condicionais. Para mais informações, consulte:
- Referência das variáveis de fluxo: uma lista completa das variáveis incorporadas
- Política ExtractVariables: instruções sobre a definição de variáveis personalizadas
Operadores
Quando usar operadores, observe as seguintes restrições:
- Não é possível usar operadores como nomes de variáveis.
- É necessário um espaço antes e depois de um operador.
- Para incluir um operador numa variável, o nome da variável tem de estar entre aspas simples.
Por exemplo,
'request.header.help!me'
. - Os operadores aritméticos (
+ * - / %
) não são suportados. - A precedência do Java é usada para operadores.
- O Apigee baseia-se em expressões regulares implementadas em
java.util.regex
.
A tabela seguinte indica os operadores suportados. Pode usar o símbolo ou a palavra nas suas expressões:
Símbolo | Word | Descrição |
---|---|---|
! |
Not , not |
Operador unário (usa uma única entrada) |
= |
Equals , Is |
Igual a (sensível a maiúsculas e minúsculas) |
!= |
NotEquals , IsNot |
Não é igual a (sensível a maiúsculas e minúsculas) |
:= |
EqualsCaseInsensitive |
É igual a, mas não é sensível a maiúsculas e minúsculas |
> ou > |
GreaterThan |
Maior que. Se usar > ao definir a condição na IU do Apigee, é convertido em >. |
>= ou >= |
GreaterThanOrEquals |
Maior ou igual a. Se usar >= ao definir a condição na IU do Apigee, é convertido em >=. |
< |
LesserThan |
Inferior a. A IU do Apigee não suporta o literal <. |
<= |
LesserThanOrEquals |
Menor ou igual a. A IU do Apigee não suporta o literal <=. |
&& |
And , and |
E |
|| |
Or |
O operador Or não é sensível a maiúsculas e minúsculas. Por exemplo, OR , Or e or são todos válidos. |
() |
Agrupa uma expressão. O caráter ( abre a expressão e o caráter ) fecha-a. |
|
~~ |
JavaRegex |
Corresponde a uma expressão regular compatível com |
~ |
Matches , Like |
Corresponde a um padrão de estilo glob que usa o caráter universal * . A correspondência é
sensível a maiúsculas e minúsculas. Para ver exemplos, consulte
Correspondência de padrões. |
~/ |
MatchesPath , LikePath |
Corresponde a uma expressão de caminho. A correspondência é sensível a maiúsculas e minúsculas. Para ver exemplos, consulte Correspondência de padrões. |
=| |
StartsWith |
Corresponde aos primeiros carateres de uma string. A correspondência é sensível a maiúsculas e minúsculas. |
Operandos
O Apigee adapta os operandos a um tipo de dados comum antes de os comparar. Por exemplo, se o código de estado da resposta for 404
, a expressão response.status.code = "400"
e o response.status.code = 400
são equivalentes.
Para operandos numéricos, o tipo de dados é interpretado como número inteiro, a menos que o valor termine da seguinte forma:
f
ouF
(float
, por exemplo,3.142f, 91.1F
)d
ouD
(double
, por exemplo,3.142d, 100.123D
)l
ouL
(long
, por exemplo,12321421312L
)
Nestes casos, o sistema faz adaptações apresentadas na tabela seguinte (em que RHS se refere ao lado direito da equação e LHS é o lado esquerdo):
RHS LHS | Booleano | Número inteiro | Longo | Flutuante | Duplo | String | Comparável | Objeto |
---|---|---|---|---|---|---|---|---|
Booleano | Booleano | Número inteiro | Longo | Flutuante | Duplo | String | - | |
Número inteiro | Número inteiro | Número inteiro | Longo | Flutuante | Duplo | String | Comparável | - |
Longo | Longo | Longo | Longo | Flutuante | Duplo | String | Comparável | - |
Flutuante | Flutuante | Flutuante | Flutuante | Flutuante | Duplo | String | Comparável | - |
Duplo | Duplo | Duplo | Duplo | Duplo | Duplo | String | Comparável | - |
String | String | String | String | String | String | String | Comparável | - |
Comparável | Comparável | Comparável | Comparável | Comparável | Comparável | Comparável | Comparável | - |
Objeto | - | - | - | - | - | - | - | - |
Operandos nulos
A tabela seguinte mostra se as condições são avaliadas como true
ou
false
quando os valores são nulos no lado esquerdo (LHS) e/ou no lado direito (RHS)
do operando apresentado:
Operador | LHS nulo | RHS nulo | LHS e RHS nulos |
---|---|---|---|
= , == , := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> ou > |
true | false | false |
>= ou >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | N/A | false |
~~ |
false | N/A | false |
!~ |
true | false | false |
~/ |
false | N/A | false |
Literals
Além de literais de strings e numéricos, pode usar os seguintes literais em declarações condicionais:
null
true
false
Por exemplo:
request.header.host is null
flow.cachehit is true
Exemplos
<RouteRule name="default"> <Condition>request.header.content-type = "text/xml"</Condition> <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint> </RouteRule>
<Step> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
<Flow name="GetRequests"> <Condition>response.verb="GET"</Condition> <Request> <Step> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>