Referencia de las condiciones

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:

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 &gt; GreaterThan Superior a Si usas > cuando defines la condición en la IU de Apigee, se convierte en &gt;
>= o &gt;= GreaterThanOrEquals Superior o igual a Si usas >= cuando defines la condición en la IU de Apigee, se convierte en &gt;=.
&lt; LesserThan Menor que. La IU de Apigee no es compatible con el literal <.
&lt;= 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 javax.util.regex. La coincidencia distingue mayúsculas de minúsculas. Para ver ejemplos, consulta Coincidencia de patrones.

~ 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 o F (float, por ejemplo, 3.142f, 91.1F)
  • d o D (double, por ejemplo, 3.142d, 100.123D)
  • l o L (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 &gt; true falso falso
>= o &gt;= falso true true
&lt; true falso falso
&lt;= 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>