Estás viendo la documentación de Apigee Edge.
Ve a la
Documentación de Apigee X. información
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 evaluadas por la canalización de procesamiento de Apigee Edge. 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 sentencias condicionales con Edge. 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 condiciones con el operador Y para aplicar más de una a la vez. Por ejemplo, el
Las siguientes condiciones se evalúan como true
solo si el URI de la solicitud coincide.
/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
Con declaraciones condicionales, puedes controlar la ejecución de flujos con nombre en ProxyEndpoints y TargetEndpoints. Ten en cuenta que solo los campos “con nombre” los flujos se pueden ejecutar de manera condicional. Flujos previos y los flujos posteriores (solicitudes y respuestas) en ProxyEndpoints y TargetEndpoints se ejecutan para cada y, por lo tanto, proporcionan un estado de “seguridad ante fallas” capacidades de integración.
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 único elemento 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 Edge se basa en expresiones regulares tal como se implementan 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 Edge, convertido en >. |
>= o >= |
GreaterThanOrEquals |
Superior o igual a Si usas >= cuando defines la condición en la IU de Edge, se convertirá en >=. |
< |
LesserThan |
Menor que. La IU de Edge no admite el símbolo < literal. |
<= |
LesserThanOrEquals |
Menor que o igual que La IU de Edge no admite el signo <= 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 mediante el símbolo "*" comodines. La coincidencia distingue mayúsculas de minúsculas. Para ver ejemplos, consulta Coincidencia de patrones con condicionales. |
~/ |
MatchesPath , LikePath |
Coincide con una expresión de ruta. La coincidencia distingue mayúsculas de minúsculas. Para ver ejemplos, consulta Coincidencia de patrones con condicionales. |
=| |
StartsWith |
Coincide con los primeros caracteres de una string. La coincidencia distingue mayúsculas de minúsculas. |
Operandos
Apigee Edge adapta los operandos a un tipo de datos común antes de compararlos. Por ejemplo, si el
el código de estado de respuesta es 404, la expresión response.status.code = "400"
y el
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” o "F" (flotante, por ejemplo, 3.142f, 91.1F)
- “d” o “D” (doble, por ejemplo, 3.142d, 100.123D)
- “l” o “L” (largo, 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>