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 entorno de ejecución. Las condiciones definen operaciones en variables, que se evalúan mediante la canalización de procesamiento de Apigee. Las declaraciones condicionales son booleanas y siempre se evalúan como true
o false
.
Descripción general de las Condiciones
En esta sección, se describe cómo y dónde usar declaraciones condicionales con Apigee. Además, las siguientes secciones describen la sintaxis:
Estructura de las declaraciones 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 las 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 declaraciones condicionales
Puedes usar las condiciones para controlar el comportamiento en los siguientes casos:
Ejecución de políticas
Mediante las declaraciones condicionales, puedes controlar la aplicación de las políticas. Un caso de uso común es la transformación condicional de los mensajes de respuesta, basados en el encabezado HTTP o el contenido del mensaje.
En el siguiente ejemplo, se transforma de forma condicional XML a JSON según el encabezado Accept
:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Ejecución del flujo
Mediante las declaraciones condicionales, puedes controlar la ejecución de flujos con nombre en ProxyEndpoints
y TargetEndpoints
. Ten en cuenta que solo los flujos con nombre pueden ejecutarse condicionalmente. Los flujos previos y posteriores (la solicitud y la respuesta) en ProxyEndpoints
y TargetEndpoints
se ejecutan para cada transacción y, por lo tanto, proporcionan capacidades no condicionales a prueba de fallas.
Por ejemplo, para ejecutar un flujo de solicitud condicional basado en el verbo HTTP del mensaje de la solicitud y el flujo de respuesta condicional basado en un código de estado HTTP (potencial) que representa 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 la ruta de extremo de destino
Mediante las declaraciones condicionales, puedes controlar el extremo de destino que invoca la configuración de extremo del proxy. Una regla de enrutamiento reenvía una solicitud a un extremo de destino específico. Cuando existe más de un extremo de destino disponible, la regla de enrutamiento se evalúa para su condición y, si es verdadero, la solicitud se reenvía al extremo de destino con nombre.
Por ejemplo, para enrutar los mensajes de forma condicional a extremos de destino designados según 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>
Consulta las variables de flujo para obtener más información.
Expresiones de ruta de acceso
Las expresiones de ruta de acceso se usan para hacer coincidir las rutas de URI, mientras que usa *
para representar un elemento único de ruta y **
para representar varios niveles de URI.
Por ejemplo:
Patrón | Rutas de acceso de URI de muestra que coinciden |
---|---|
/*/a/ |
/x/a/ o /y/a/ |
/*/a/* |
/x/a/b o /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/*/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
En las declaraciones condicionales, puedes usar variables de flujo integradas y variables personalizadas. Para obtener más información, consulte:
- Referencia de variables de flujo: Una lista completa de las variables integradas
- Política ExtractVariables: Instrucciones para configurar variables personalizadas
Operadores
Cuando uses operadores, observa las siguientes restricciones:
- Los operadores no se pueden usar como nombres de variables.
- Se requiere un carácter de espacio antes y después de un operador.
- Para incluir un operador en una variable, el nombre de una variable debe estar entre comillas simples.
Por ejemplo,
'request.header.help!me'
- No se admiten los operadores aritméticos (
+ * - / %
). - La prioridad de Java se usa para los operadores.
- Apigee depende de expresiones regulares como se las implementa en
java.util.regex
.
En la siguiente tabla, se enumeran los operadores compatibles. Puedes usar el símbolo o la palabra en tus expresiones:
Símbolo | Word | Descripción |
---|---|---|
! |
Not , not |
Operador unario (toma una sola entrada) |
= |
Equals , Is |
Igual a (distingue mayúsculas de minúsculas) |
!= |
NotEquals , IsNot |
No es igual (distingue mayúsculas de minúsculas) |
:= |
EqualsCaseInsensitive |
Igual, pero no distingue entre mayúsculas y minúsculas |
> o > |
GreaterThan |
Superior a Si usas > cuando defines la condición en la IU de Apigee, se convierte en > |
>= o >= |
GreaterThanOrEquals |
Superior o igual a Si usas >= cuando defines la condición en la IU de Apigee, se convierte en >=. |
< |
LesserThan |
Menor que. La IU de Apigee no es compatible con el literal <. |
<= |
LesserThanOrEquals |
Menor que o igual que La IU de Apigee no admite el literal <=. |
&& |
And , and |
Y |
|| |
Or |
El operador de 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 que cumple con |
~ |
Matches , Like |
Coincide con un patrón de estilo glob con el carácter comodín * . La coincidencia distingue mayúsculas de minúsculas. Para ver ejemplos, consulta Coincidencia de patrones. |
~/ |
MatchesPath , LikePath |
Coincide con una expresión de ruta. La coincidencia distingue mayúsculas de minúsculas. Para ver ejemplos, consulta Coincidencia de patrones. |
=| |
StartsWith |
Coincide con los primeros caracteres de una string. La coincidencia distingue mayúsculas de 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 la response.status.code = 400
son equivalentes.
Para los operandos numéricos, el tipo de datos se interpreta como un número entero, a menos que el valor se finalice 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 adaptaciones que se muestran en la siguiente tabla (el RHS hace referencia a la derecha de la ecuación y LHS es el lado izquierdo):
RHS LHS | Booleano | Entero | Long | Número de punto flotante | Doble | String | Comparable | Objeto |
---|---|---|---|---|---|---|---|---|
Booleano | Booleano | Entero | Long | Número de punto flotante | Doble | String | - | |
Entero | Entero | Entero | Long | Número de punto flotante | Doble | String | Comparable | - |
Long | Long | Long | Long | Número de punto flotante | Doble | String | Comparable | - |
Número de punto flotante | Número de punto flotante | Número de punto flotante | Número de punto flotante | Número de punto flotante | Doble | String | Comparable | - |
Doble | Doble | Doble | Doble | Doble | Doble | String | Comparable | - |
String | String | String | String | String | String | String | 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 (LHS) o en el lado derecho (RHS) del operando que se muestra:
Operador | LHS nulo | RHS nulo | LHS y RH nuloS |
---|---|---|---|
= , == , := |
falso | falso | true |
=| |
falso | falso | falso |
!= |
true | true | falso |
> o > |
true | falso | falso |
>= o >= |
falso | true | true |
< |
true | falso | falso |
<= |
true | falso | true |
~ |
falso | N/A | falso |
~~ |
falso | N/A | falso |
!~ |
true | falso | falso |
~/ |
falso | N/A | falso |
Literales
Además de los literales de string y numéricos, puedes usar los siguientes literales en las declaraciones 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>