Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Las condiciones permiten que los proxies de API se comporten de forma dinámica en el tiempo de ejecución. Las condiciones definen operaciones
en variables, que evalúa la canalización de procesamiento de Apigee. Las declaraciones condicionales
son booleanas y siempre se evalúan como true
o false
.
Resumen de las condiciones
En esta sección se describe cómo y dónde usar las instrucciones condicionales con Apigee. Además, en las siguientes secciones se describe la sintaxis:
Estructura de las instrucciones condicionales
La estructura básica de una instrucción condicional es la siguiente:
<Condition>variable.name operator "value"</Condition>
Por ejemplo:
<Condition>request.verb = "GET"</Condition>
Puedes combinar condiciones con AND
para aplicar más de una a la vez. Por ejemplo, las siguientes condiciones se evalúan como true
solo si el URI de la solicitud coincide con /statuses
y el verbo HTTP de la solicitud es GET
:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Dónde puedes usar las instrucciones condicionales
Puedes usar condiciones para controlar el comportamiento de los siguientes elementos:
Ejecución de políticas
Mediante instrucciones condicionales, puedes controlar la aplicación de las políticas. Un caso de uso habitual es la transformación condicional de los mensajes de respuesta en función del encabezado HTTP o del contenido del mensaje.
En el siguiente ejemplo se transforma XML en JSON de forma condicional en función del encabezado Accept
:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Ejecución del flujo
Con las instrucciones condicionales, puedes controlar la ejecución de los flujos con nombre en ProxyEndpoints
y TargetEndpoints
. Ten en cuenta que solo se pueden ejecutar flujos con nombre de forma condicional. Los preflows y los postflows (tanto de solicitud como de respuesta) de ProxyEndpoints
y TargetEndpoints
se ejecutan en cada transacción y, por lo tanto, proporcionan funciones a prueba de fallos incondicionales.
Por ejemplo, para ejecutar un flujo de solicitud condicional basado en el verbo HTTP del mensaje de solicitud y un flujo de respuesta condicional basado en un código de estado HTTP (potencial) que represente un error:
<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>
Selección de ruta de punto final de destino
Mediante instrucciones condicionales, puedes controlar el endpoint de destino invocado por la configuración del endpoint de proxy. Una regla de ruta reenvía una solicitud a un endpoint de destino concreto. Cuando hay más de un punto de conexión de destino disponible, se evalúa la condición de la regla de ruta y, si es verdadera, la solicitud se reenvía al punto de conexión de destino con el nombre indicado.
Por ejemplo, para enrutar mensajes de forma condicional a los endpoints de destino designados en función de Content-Type
, siga estos pasos:
<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>
Consulta más información sobre las variables y las condiciones de los flujos.
Expresiones de ruta
Las expresiones de ruta se usan para buscar coincidencias de rutas de URIs. Se usa *
para representar un solo elemento de ruta y **
para representar varios niveles de URI. También se pueden usar llaves {name}
para que coincida con un solo elemento de ruta y para que el lector lo entienda mejor. La variable name
solo se usa para mayor claridad y no rellena el valor coincidente en una variable de flujo.
Por ejemplo:
Patrón | Ejemplos de rutas de URI coincidentes |
---|---|
/*/a/ |
/x/a/ o /y/a/ |
/*/a/* |
/x/a/b o /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/{reader}/feed/ |
/x/a/b/feed/ o /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
%
se trata como un carácter de escape. El patrón %{user%}
coincide con {user}
, pero no con user
.
Variables
Puede usar tanto variables de flujo predefinidas como variables personalizadas en las instrucciones condicionales. Para obtener más información, consulta estos artículos:
- Referencia de variables de flujo: lista completa de las variables integradas
- Política ExtractVariables: instrucciones para definir variables personalizadas
Operadores
Cuando uses operadores, ten en cuenta las siguientes restricciones:
- Los operadores no se pueden usar como nombres de variables.
- Es obligatorio incluir un espacio antes y después de un operador.
- Para incluir un operador en una variable, el nombre de la variable debe escribirse entre comillas simples.
Por ejemplo,
'request.header.help!me'
. - No se admiten operadores aritméticos (
+ * - / %
). - La precedencia de Java se usa para los operadores.
- Apigee se basa en expresiones regulares tal como se implementan en
java.util.regex
.
En la siguiente tabla se enumeran los operadores admitidos. Puedes usar el símbolo o la palabra en tus expresiones:
Símbolo | Word | Descripción |
---|---|---|
! |
Not , not |
Operador unario (requiere una sola entrada) |
= |
Equals , Is |
Igual a (se distingue entre mayúsculas y minúsculas) |
!= |
NotEquals , IsNot |
No es igual a (se distingue entre mayúsculas y minúsculas) |
:= |
EqualsCaseInsensitive |
Es igual a, pero no distingue entre mayúsculas y minúsculas |
> o > |
GreaterThan |
Mayor que. Si usa > al definir la condición en la interfaz de usuario de Apigee, se convierte en >. |
>= o >= |
GreaterThanOrEquals |
Mayor o igual que. Si usa >= al definir la condición en la interfaz de usuario de Apigee, se convierte en >=. |
< |
LesserThan |
Menor que. La interfaz de usuario de Apigee no admite el carácter literal <. |
<= |
LesserThanOrEquals |
Menor o igual que. La interfaz de usuario de Apigee no admite el literal <=. |
&& |
And , and |
Y |
|| |
Or |
El operador Or no distingue entre mayúsculas y minúsculas. Por ejemplo, OR , Or y or son válidos. |
() |
Agrupa una expresión. ( abre la expresión y ) la cierra. |
|
~~ |
JavaRegex |
Coincide con una expresión regular compatible con |
~ |
Matches , Like |
Busca coincidencias con un patrón de estilo glob que utilice el carácter comodín * . La coincidencia distingue entre mayúsculas y minúsculas. Para ver ejemplos, consulta la sección
Coincidencia de patrones. |
~/ |
MatchesPath , LikePath |
Coincide con una expresión de ruta. La coincidencia distingue entre mayúsculas y minúsculas. Para ver ejemplos, consulta la sección Coincidencia de patrones. |
=| |
StartsWith |
Coincide con los primeros caracteres de una cadena. La coincidencia distingue entre mayúsculas y minúsculas. |
Operandos
Apigee adapta los operandos a un tipo de datos común antes de compararlos. Por ejemplo, si el código de estado de la respuesta es 404
, la expresión response.status.code = "400"
y response.status.code = 400
son equivalentes.
En el caso de los operandos numéricos, el tipo de datos se interpreta como un número entero, a menos que el valor termine de la siguiente manera:
f
oF
(float
, por ejemplo,3.142f, 91.1F
)d
oD
(double
, por ejemplo,3.142d, 100.123D
)l
oL
(long
, por ejemplo,12321421312L
)
En estos casos, el sistema realiza las adaptaciones que se muestran en la siguiente tabla (donde RHS hace referencia al lado derecho de la ecuación y LHS es el lado izquierdo):
RHS LHS | Booleano | Entero | Long | Flotante | Doble | Cadena | Comparable | Objeto |
---|---|---|---|---|---|---|---|---|
Booleano | Booleano | Entero | Long | Flotante | Doble | Cadena | - | |
Entero | Entero | Entero | Long | Flotante | Doble | Cadena | Comparable | - |
Long | Long | Long | Long | Flotante | Doble | Cadena | Comparable | - |
Flotante | Flotante | Flotante | Flotante | Flotante | Doble | Cadena | Comparable | - |
Doble | Doble | Doble | Doble | Doble | Doble | Cadena | Comparable | - |
Cadena | Cadena | Cadena | Cadena | Cadena | Cadena | Cadena | Comparable | - |
Comparable | Comparable | Comparable | Comparable | Comparable | Comparable | Comparable | Comparable | - |
Objeto | - | - | - | - | - | - | - | - |
Operandos nulos
En la siguiente tabla se muestra si las condiciones se evalúan como true
o false
cuando los valores son nulos en el lado izquierdo (LI) o en el lado derecho (LD) del operando mostrado:
Operador | Nulo de la parte izquierda | RHS nulo | LHS y RHS son nulos |
---|---|---|---|
= , == , := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> o > |
true | false | false |
>= o >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | N/A | false |
~~ |
false | N/A | false |
!~ |
true | false | false |
~/ |
false | N/A | false |
Literales
Además de los literales de cadena y numéricos, puede usar los siguientes literales en las instrucciones condicionales:
null
true
false
Por ejemplo:
request.header.host is null
flow.cachehit is true
Ejemplos
<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>