Referencia de configuración de proxy de API,Referencia de configuración de proxy de API

Esta página se aplica a Apigee y Apigee híbrido .

Ver la documentación de Apigee Edge .

Como desarrollador que trabaja con Apigee, sus principales actividades de desarrollo consisten en configurar proxies de API que funcionan como proxy para API o servicios backend. Este documento es una referencia de todos los elementos de configuración disponibles para la creación de proxies de API.

Si está aprendiendo cómo crear proxies de API, se recomienda que comience con el tema Creación de un proxy de API simple .

Edite la configuración del proxy de API utilizando uno de los siguientes métodos:

Estructura del directorio de configuración del proxy API

La estructura del directorio de configuración del proxy API se muestra a continuación:

Muestra la estructura de directorios donde apiproxy es la raíz. Directamente debajo del directorio apiproxy se encuentran los directorios de políticas, proxies, recursos y objetivos, así como el archivo weatherapi.xml.

Una configuración de proxy API consta del siguiente contenido:

Configuración base Configuración principal para un proxy API.
Punto final del proxy Configuraciones para la conexión HTTP entrante (desde las aplicaciones solicitantes a Apigee), flujos de solicitud y respuesta, y adjuntos de políticas.
Punto final de destino Configuraciones para la conexión HTTP saliente (desde Apigee al servicio backend), flujos de solicitud y respuesta, y adjuntos de políticas.
Flujos Canalizaciones de solicitud y respuesta de ProxyEndpoint y TargetEndpoint a las que se pueden adjuntar políticas.
Políticas Archivos de configuración con formato XML que se ajustan a los esquemas de políticas de Apigee.
Recursos Scripts, archivos JAR y archivos XSLT a los que hacen referencia las políticas para ejecutar lógica personalizada.

Configuración base

/apiproxy/weatherapi.xml

La configuración básica de un proxy de API, que define su nombre. Este nombre debe ser único dentro de la organización.

Configuración de muestra:

<APIProxy name="weatherapi">
</APIProxy>

Elementos de configuración base

Nombre Descripción Por defecto ¿Requerido?
APIProxy
name El nombre del proxy de API, que debe ser único dentro de la organización. Los caracteres permitidos en el nombre son los siguientes: A-Za-z0-9_- N / A
revision El número de revisión de la configuración del proxy de la API. No es necesario configurarlo explícitamente, ya que Apigee registra automáticamente la revisión actual del proxy de la API. N / A No
ConfigurationVersion La versión del esquema de configuración del proxy de API a la que se ajusta este proxy. Los únicos valores admitidos actualmente son majorVersion 4 y minorVersion 0. Esta configuración podría utilizarse en el futuro para permitir la evolución del formato del proxy de API. 4.0 No
Description Una descripción textual del proxy de la API. Si se proporciona, la descripción se mostrará en la interfaz de usuario de Apigee. N / A No
DisplayName Un nombre fácil de usar que puede ser diferente del atributo name de la configuración del proxy de API. N / A No
Policies Una lista de políticas en el directorio /policies de este proxy de API. Normalmente, solo verá este elemento cuando el proxy de API se creó mediante la interfaz de usuario de Apigee. Se trata simplemente de una configuración del manifiesto , diseñada para proporcionar visibilidad del contenido del proxy de API. N / A No
ProxyEndpoints Una lista de puntos finales de proxy en el directorio /proxies de este proxy de API. Normalmente, solo verá este elemento cuando el proxy de API se creó mediante la interfaz de usuario de Apigee. Se trata simplemente de una configuración del manifiesto , diseñada para proporcionar visibilidad del contenido del proxy de API. N / A No
Resources Una lista de recursos (JavaScript, Python, Java, XSLT) en el directorio /resources de este proxy de API. Normalmente, solo verá este elemento cuando el proxy de API se creó mediante la interfaz de usuario de Apigee. Se trata simplemente de una configuración del manifiesto , diseñada para proporcionar visibilidad del contenido del proxy de API. N / A No
Spec Identifica la especificación de OpenAPI asociada al proxy de API. El valor se establece en una URL o una ruta en el almacén de especificaciones.
N / A No
TargetServers Una lista de servidores de destino referenciados en cualquier punto final de destino de este proxy de API. Normalmente, solo verá este elemento cuando el proxy de API se creó con Apigee. Se trata simplemente de una configuración del manifiesto , diseñada para proporcionar visibilidad del contenido del proxy de API. N / A No
TargetEndpoints Una lista de puntos finales de destino en el directorio /targets de este proxy de API. Normalmente, solo verá este elemento cuando el proxy de API se creó mediante la interfaz de usuario de Apigee. Se trata simplemente de una configuración del manifiesto , diseñada para proporcionar visibilidad del contenido del proxy de API. N / A No

Punto final del proxy

La siguiente imagen muestra el flujo de solicitud/respuesta:

Muestra un cliente que llama a un servicio HTTP. La solicitud pasa por el extremo proxy y luego por el extremo de destino antes de ser procesada por el servicio HTTP. La respuesta pasa por el extremo de destino y luego por el extremo proxy antes de ser devuelta al cliente.

/apiproxy/proxies/default.xml

La configuración de ProxyEndpoint define la interfaz de entrada (de cara al cliente) para un proxy de API. Al configurar un punto final de proxy, se establece una configuración de red que define cómo las aplicaciones cliente ( apps ) deben invocar la API proxyizada.

La siguiente configuración de muestra de ProxyEndpoint se almacenaría en /apiproxy/proxies :

<ProxyEndpoint name="default">
  <PreFlow/>
  <Flows/>
  <PostFlow/>
  <HTTPProxyConnection>
    <BasePath>/weather</BasePath>
    <Properties/>
  </HTTPProxyConnection>
  <FaultRules/>
  <DefaultFaultRule/>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Los elementos de configuración necesarios en un punto final de proxy básico son:

Elementos de configuración de ProxyEndpoint

Nombre Descripción Por defecto ¿Requerido?
ProxyEndpoint
name El nombre del punto final del proxy. Debe ser único dentro de la configuración del proxy de la API cuando (en casos excepcionales) se definen varios puntos finales del proxy. Los caracteres permitidos en el nombre se limitan a los siguientes: A-Za-z0-9._\-$ % . N / A
PreFlow Define las políticas en el flujo PreFlow de una solicitud o respuesta. N / A
Flows
Define las políticas en los flujos condicionales de una solicitud o respuesta.
N / A
PostFlow
Define las políticas en el flujo PostFlow de una solicitud o respuesta.
N / A
HTTPProxyConnection Define la dirección de red y la ruta URI asociadas con el proxy API.
BasePath

Una cadena obligatoria que identifica de forma única la ruta URI utilizada por Apigee para enrutar los mensajes entrantes al proxy API adecuado.

BasePath es un fragmento de URI (por ejemplo /weather ) que se añade a la URL base de un proxy de API (por ejemplo, http://apifactory-test.apigee.net ). BasePath debe ser único dentro de un entorno. La unicidad se valida al generar o importar un proxy de API.

Uso de un comodín en las rutas base

Puede usar uno o más comodines "*" en las rutas base de los proxys de API. Por ejemplo, una ruta base de /team/*/members permite a los clientes llamar https://[host]/team/ blue /members y https://[host]/team/ green /members sin necesidad de crear nuevos proxies de API para dar soporte a nuevos equipos. Tenga en cuenta que /**/ no es compatible.

Importante: Apigee NO admite el uso del comodín "*" como primer elemento de una ruta base. Por ejemplo, NO se admite: /*/search . Iniciar la ruta base con un "*" puede provocar errores inesperados debido a la forma en que Apigee identifica las rutas válidas.

/
Properties Se puede definir un conjunto de opciones de configuración HTTP como propiedades de un <ProxyEndpoint> . Las propiedades disponibles incluyen las siguientes:
  • request.queryparams.ignore.content.type.charset

    Utilice la propiedad request.queryparams.ignore.content.type.charset para indicar al proxy que ignore el parámetro charset del encabezado Content-Type al procesar la URL de la solicitud. Por ejemplo:

    <Properties>
      <Property name="request.queryparams.ignore.content.type.charset">true</Property>
    </Properties>

    La siguiente tabla muestra un ejemplo de salida dependiendo de la configuración de la propiedad charset y la presencia del parámetro charset del encabezado Content-Type .

    Configuración de la propiedad Valor del encabezado Ejemplo de salida
    charset=false charset de caracteres no establecido [email protected]
    charset=false charset=utf-8 john.doe [email protected]
    charset=true y ningún charset charset en el encabezado. charset de caracteres no establecido [email protected]
    charset=true charset=utf-8 [email protected]
  • request.payload.parse.limit

    Utilice la propiedad request.payload.parse.limit para establecer el tamaño máximo de carga útil que se puede procesar en el flujo de solicitud, en megabytes (M).

    Por ejemplo:

    <Properties>
      <Property name="request.payload.parse.limit">30M</Property>
    </Properties>

    El límite mínimo configurable es de 10 M y el máximo, de 30 M. Si no se configura la propiedad, el límite predeterminado es de 10 M.

    Para obtener más información, consulte Tamaño de la carga útil del mensaje .

N / A No
FaultRules
Define cómo reacciona el punto final del proxy ante un error. Una regla de fallo especifica dos elementos:
  • Una condición que especifica la falla que se debe manejar según la categoría, subcategoría o nombre predefinido de la falla.
  • Una o más políticas que definen el comportamiento de la regla de falla para la condición correspondiente

Consulte Manejo de fallos .

N / A No
DefaultFaultRule

Maneja cualquier error (sistema, transporte, mensajería o política) que no sea manejado explícitamente por otra regla de falla.

Consulte Manejo de fallos .

N / A No
RouteRule Define el destino de los mensajes de solicitud entrantes tras su procesamiento por la canalización de solicitudes ProxyEndpoint. Normalmente, la RouteRule apunta a un endpoint de destino con nombre, un IntegrationEndpoint o una URL.
Name Atributo obligatorio que proporciona un nombre para la regla de ruta. Los caracteres permitidos en el nombre son los siguientes: A-Za-z0-9._\-$ % . Por ejemplo, Cat2 %_ es un nombre válido. N / A
Condition Una sentencia condicional opcional que se utiliza para el enrutamiento dinámico en tiempo de ejecución. Las reglas de ruta condicionales son útiles, por ejemplo, para habilitar el enrutamiento basado en contenido y así soportar el control de versiones del backend. N / A No
TargetEndpoint

Una cadena opcional que identifica una configuración de TargetEndpoint con nombre. Un endpoint de destino con nombre es cualquier endpoint de destino definido en el mismo proxy de API, en el directorio /targets .

Al nombrar un endpoint de destino, se indica dónde se deben reenviar los mensajes de solicitud tras ser procesados ​​por la canalización de solicitudes ProxyEndpoint. Tenga en cuenta que esta configuración es opcional.

Un endpoint proxy puede llamar a una URL directamente. Por ejemplo, un recurso JavaScript o Java, que funciona como cliente HTTP, puede realizar la función básica de un endpoint de destino: reenviar solicitudes a un servicio backend.

N / A No
URL Una cadena opcional que define una dirección de red saliente llamada por el punto final del proxy, omitiendo cualquier configuración de TargetEndpoint que pueda estar almacenada en /targets N / A No

Cómo configurar RouteRules

Un punto final de destino nombrado hace referencia a un archivo de configuración en /apiproxy/targets al cual RouteRule reenvía una solicitud después de ser procesada por el punto final del proxy.

Por ejemplo, la siguiente RouteRule hace referencia a la configuración /apiproxy/targets/myTarget.xml :

<RouteRule name="default">
  <TargetEndpoint>myTarget</TargetEndpoint>
</RouteRule>

Invocación directa de URL

Un endpoint proxy también puede invocar directamente un servicio backend. La invocación directa de URL omite cualquier configuración de TargetEndpoint con nombre en /apiproxy/targets . Por este motivo, TargetEndpoint es una configuración de proxy de API opcional, aunque, en la práctica, no se recomienda la invocación directa desde el endpoint proxy.

Por ejemplo, la siguiente RouteRule realiza una llamada HTTP a http://api.mycompany.com/v2 .

<RouteRule name="default">
  <URL>http://api.mycompany.com/v2</URL> 
</RouteRule>

Rutas condicionales

Las reglas de ruta se pueden encadenar para permitir el enrutamiento dinámico en tiempo de ejecución. Las solicitudes entrantes se pueden enrutar a configuraciones de TargetEndpoint con nombre, directamente a URL o a una combinación de ambas, según los encabezados HTTP, el contenido del mensaje, los parámetros de consulta o información contextual como la hora del día, la configuración regional, etc.

Las reglas de ruta condicionales funcionan como otras sentencias condicionales en Apigee. Consulte la referencia de condiciones y la referencia de variables de flujo .

Por ejemplo, la siguiente combinación de RouteRule evalúa primero la solicitud entrante para verificar el valor de un encabezado HTTP. Si el encabezado HTTP routeTo tiene el valor TargetEndpoint1 , la solicitud se reenvía al punto final de destino denominado TargetEndpoint1 . De lo contrario, la solicitud entrante se reenvía a http://api.mycompany.com/v2 .

<RouteRule name="MyRoute">
  <Condition>request.header.routeTo = "TargetEndpoint1"</Condition>
  <TargetEndpoint>TargetEndpoint1</TargetEndpoint>
</RouteRule>
<RouteRule name="default">
  <URL>http://api.mycompany.com/v2</URL>
</RouteRule>

Rutas nulas

Se puede definir una RouteRule nula para casos en los que no es necesario reenviar el mensaje de solicitud al endpoint de destino. Esto resulta útil cuando el endpoint proxy realiza todo el procesamiento necesario, por ejemplo, al usar JavaScript para llamar a un servicio externo o al recuperar datos de una búsqueda en el almacén de claves/valores de Apigee.

Por ejemplo, lo siguiente define una ruta nula:

<RouteRule name="GoNowhere"/>

Las rutas nulas condicionales pueden ser útiles. En el siguiente ejemplo, se configura una ruta nula para ejecutarse cuando el encabezado HTTP request.header.X-DoNothing tiene un valor distinto de null .

<RouteRule name="DoNothingOnDemand">
  <Condition>request.header.X-DoNothing != null</Condition>
</RouteRule>

Recuerde que las reglas de ruta se pueden encadenar, por lo que una ruta nula condicional normalmente sería un componente de un conjunto de reglas de ruta diseñadas para soportar el enrutamiento condicional.

Un uso práctico de una ruta nula condicional sería el soporte del almacenamiento en caché. Al usar el valor de la variable establecida por la política de caché, se puede configurar un proxy de API para que ejecute la ruta nula cuando se sirve una entrada desde la caché.

<RouteRule name="DoNothingUnlessTheCacheIsStale">
  <Condition>lookupcache.LookupCache-1.cachehit is true</Condition>
</RouteRule>

Punto final de destino

Muestra un cliente que llama a un servicio HTTP. La solicitud pasa por el extremo proxy y luego por el extremo de destino antes de ser procesada por el servicio HTTP. La respuesta pasa por el extremo de destino y luego por el extremo proxy antes de ser devuelta al cliente.

Un endpoint de destino es el equivalente saliente de un endpoint proxy. Un endpoint de destino funciona como cliente de un servicio backend o API: envía solicitudes y recibe respuestas.

Un proxy de API no necesita tener puntos de conexión de destino. Estos puntos de conexión se pueden configurar para llamar a URL directamente. Un proxy de API sin puntos de conexión de destino suele contener un punto de conexión que llama directamente a un servicio de backend o que está configurado para llamar a un servicio mediante Java o JavaScript.

Configuración de TargetEndpoint

/targets/default.xml

El punto final de destino define la conexión saliente de Apigee a otro servicio o recurso.

A continuación se muestra un ejemplo de configuración de TargetEndpoint:

<TargetEndpoint name="default">
  <PreFlow/>
  <Flows/>
  <PostFlow/>
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <SSLInfo/>
    <Authentication/>
  </HTTPTargetConnection>
  <FaultRules/>
  <DefaultFaultRule/>
  <ScriptTarget/>
  <LocalTargetConnection/>
</TargetEndpoint>

Elementos de configuración de TargetEndpoint

Un punto final de destino puede llamar a un objetivo de una de las siguientes maneras:

  • HTTPTargetConnection para llamadas HTTP o HTTPS
  • LocalTargetConnection para encadenamiento de proxy a proxy local

Configure solo uno de estos en un punto final de destino.

Nombre Descripción Por defecto ¿Requerido?
TargetEndpoint
name El nombre del punto final de destino, que debe ser único en la configuración del proxy de la API. El nombre del punto final de destino se utiliza en la regla de ruta ProxyEndpoint para dirigir las solicitudes de procesamiento saliente. Los caracteres permitidos en el nombre son los siguientes: A-Za-z0-9._\-$ % . N / A
PreFlow Define las políticas en el flujo PreFlow de una solicitud o respuesta. N / A
Flows
Define las políticas en los flujos condicionales de una solicitud o respuesta.
N / A
PostFlow
Define las políticas en el flujo PostFlow de una solicitud o respuesta.
N / A
HTTPTargetConnection

Con sus elementos secundarios, especifica un recurso de backend al que se accede a través de HTTP.

Si utiliza HTTPTargetConnection, no configure otros tipos de conexiones de destino (ScriptTarget o LocalTargetConnection).

Puedes usar el elemento secundario <Authentication> para realizar llamadas autenticadas a servicios de Google o servicios personalizados que se ejecutan en ciertos productos de Google Cloud, como Cloud Functions y Cloud Run . El uso del elemento <Authentication> requiere los pasos de configuración e implementación descritos en Uso de la autenticación de Google . Con una configuración correcta, la política crea un token de autenticación y lo añade a la solicitud de servicio. Consulta también Uso del elemento <Authentication> .

URL Define la dirección de red del servicio backend al cual el punto final de destino reenvía los mensajes de solicitud. N / A No
LoadBalancer

Define una o más configuraciones de TargetServer con nombre. Estas configuraciones se pueden usar para equilibrar la carga definiendo dos o más conexiones de configuración de endpoint.

También puede utilizar servidores de destino para desacoplar las configuraciones de proxy de API de las URL de los puntos finales del servicio backend concretos.

N / A No
Properties Se puede definir un conjunto de configuraciones HTTP opcionales como propiedades de un <TargetEndpoint> .

Utilice la propiedad response.payload.parse.limit para establecer el tamaño máximo de carga útil que se puede procesar en el flujo de respuesta, en megabytes (M).

Por ejemplo:

<Properties>
  <Property name="response.payload.parse.limit">15M</Property>
</Properties>

El límite mínimo configurable es de 10 M y el máximo, de 30 M. Si no se configura la propiedad, el límite predeterminado es de 10 M.

Para obtener más información, consulte Tamaño de la carga útil del mensaje .

N / A No
SSLInfo Opcionalmente, defina la configuración TLS/SSL en un endpoint de destino para controlar la conexión TLS/SSL entre el proxy de API y el servicio de destino. Consulte Configuración de TLS/SSL en el endpoint de destino . N / A No
LocalTargetConnection Con sus elementos secundarios, especifica un recurso al que se debe acceder localmente, sin pasar por características de red como el equilibrio de carga y los procesadores de mensajes.

Para especificar el recurso de destino, incluya el elemento secundario APIProxy (con el elemento ProxyEndpoint) o el elemento secundario Path.

Para obtener más información, consulte Encadenamiento de servidores proxy de API .

Si utiliza LocalTargetConnection, no configure otros tipos de conexiones de destino (HTTPTargetConnection o ScriptTarget).

APIProxy Especifica el nombre de un proxy de API que se usará como destino de las solicitudes. El proxy de destino debe pertenecer a la misma organización y entorno que el proxy que envía las solicitudes. Esta es una alternativa al uso del elemento Path. N / A No
ProxyEndpoint Se utiliza con APIProxy para especificar el nombre del punto final del proxy de destino. N / A No
Path Especifica la ruta del punto final de un proxy de API que se usará como destino de las solicitudes. El proxy de destino debe estar en la misma organización y entorno que el proxy que envía las solicitudes. Esta es una alternativa a usar APIProxy. N / A No
FaultRules
Define cómo reacciona el endpoint de destino ante un error. Una regla de fallo especifica dos elementos:
  • Una condición que especifica la falla que se debe manejar según la categoría, subcategoría o nombre predefinido de la falla.
  • Una o más políticas que definen el comportamiento de la regla de falla para la condición correspondiente

Consulte Manejo de fallos .

N / A No
DefaultFaultRule

Maneja cualquier error (sistema, transporte, mensajería o política) que no sea manejado explícitamente por otra FaultRule.

Consulte Manejo de fallos .

N / A No

Uso del elemento <Authentication>

El uso del elemento <Authentication> en <TargetEndpoint> es idéntico al uso del elemento <Authentication> en la política ServiceCallout. Tanto en <TargetEndpoint> como en ServiceCallout, <Authentication> es un subelemento de <HttpTargetConnection> . Para obtener más información, consulte el elemento Authentication en la Referencia de política de ServiceCallout.

Referencia de error del elemento <Authentication>

Si está utilizando el elemento <Authentication> , puede encontrar posibles mensajes de error y sugerencias para la solución de problemas de implementación y errores de tiempo de ejecución en la sección Errores de la documentación de la política ServiceCallout.

Ejemplos del elemento <Authentication>

El siguiente ejemplo muestra cómo llamar a un servicio implementado en Cloud Run como destino utilizando el elemento Authentication para generar un token OpenID Connect necesario para autenticar la llamada:

<TargetEndpoint name="TargetEndpoint-1">
  <HTTPTargetConnection>
      <Properties/>
      <URL>https://cloudrun-hostname.a.run.app/test</URL>
      <Authentication>
          <GoogleIDToken>
             <Audience>https://cloudrun-hostname.a.run.app/test</Audience>
          </GoogleIDToken>
     </Authentication>
  </HTTPTargetConnection>
</TargetEndpoint>

El siguiente ejemplo muestra cómo llamar a un TargetService que apunta a Cloud Run mediante el elemento Authentication para generar un token de OpenID Connect necesario para autenticar la llamada. El elemento HeaderName añade el token de portador generado a un encabezado llamado X-Serverless-Authorization que se envía al sistema de destino. El encabezado Authorization , si está presente, se deja sin modificar y también se envía en la solicitud.

<TargetEndpoint name="TargetEndpoint-1">
   <HTTPTargetConnection>
     <Authentication>
        <HeaderName>X-Serverless-Authorization</HeaderName>
        <GoogleIDToken>
            <Audience ref="flow.variable.audience">https://cloudrun-hostname.a.run.app</Audience>
        </GoogleIDToken>
     </Authentication>
      <LoadBalancer>
         <Server name="cloud-run-target" />
      </LoadBalancer>
   </HTTPTargetConnection>
</TargetEndpoint>

El siguiente ejemplo muestra cómo llamar a un TargetService que apunta al servicio Google Secret Manager . En este ejemplo, el elemento GoogleAccessToken está configurado para generar un token de autenticación de Google para autenticar la solicitud de destino:

<HTTPTargetConnection>
   <Authentication>
      <GoogleAccessToken>
        <Scopes>
          <Scope>https://www.googleapis.com/auth/cloud-platform</Scope>
        </Scopes>
      </GoogleAccessToken>
    </Authentication>
    <URL>
      https://secretmanager.googleapis.com/v1/projects/project-id/secrets/secret-id
    </URL>
</HTTPTargetConnection>

El siguiente ejemplo muestra cómo configurar automáticamente la audiencia del GoogleIDToken. Cuando useTargetUrl es true y la variable referenciada no se resuelve en una variable válida, se utiliza como audiencia la URL del destino (sin incluir los parámetros de consulta). Supongamos que la ruta de la solicitud es /foobar y la URL del servidor de destino es https://xyz.com ; la audiencia del GoogleIDToken se configurará automáticamente en https://xyz.com/foobar .

<TargetEndpoint name="TargetEndpoint-1">
  <HTTPTargetConnection>
    <Authentication>
      <GoogleIDToken>
        <Audience ref='myvariable' useTargetUrl="true"/>
      </GoogleIDToken>
    </Authentication>
    <LoadBalancer>
      <Server name="TS" />
    </LoadBalancer>
  </HTTPTargetConnection>
</TargetEndpoint>

Configuración del punto final de destino TLS/SSL

Los endpoints de destino suelen necesitar gestionar conexiones HTTPS con una infraestructura de backend heterogénea. Por ello, se admiten diversas opciones de configuración TLS/SSL.

Elementos de configuración de TargetEndpoint TLS/SSL

Nombre Descripción Por defecto ¿Requerido?
SSLInfo

El bloque <SSLInfo> se puede utilizar tanto para TLS/SSL unidireccional como bidireccional.

Enabled

Si se establece en true , especifica que la conexión de destino debe usar el protocolo SSL según los demás parámetros especificados en este bloque <SSLInfo> . Si se establece en false , especifica que la conexión de destino no debe usar SSL.

Sin embargo, si el bloque <HTTPTargetConnection> que lo encierra contiene un elemento <URL> que evalúa una cadena que empieza por https:// , se usará el protocolo SSL incluso si <Enabled> es falso. En este caso, se ignora todo el bloque <SSLInfo> .

Por el contrario, si hay un elemento <URL> que comienza con http:// , entonces el protocolo SSL no se utilizará incluso si <Enabled> es verdadero.

FALSO No
Enforce

Aplica SSL estricto entre Apigee y el backend de destino.

Si se establece como true , las conexiones fallarán para destinos con certificados no válidos, caducados, autofirmados, con nombres de host no coincidentes y con una raíz no confiable. Se devuelve un código de error 4xx o 5xx .

Si no se configura o se establece en false , el resultado de las conexiones a los backends de destino con certificados problemáticos depende de la configuración de <IgnoreValidationErrors> (ver más abajo). Una respuesta correcta ( 2xx ) puede ocurrir bajo ciertas condiciones si <IgnoreValidationErrors> se establece en true .

Puede anular el campo Enforce a nivel de entorno con la función SSLInfo.Enforce . Consulte Especificación de la aplicación de SSL a nivel de entorno .

false No
TrustStore

Un almacén de claves que contiene certificados de servidor raíz de confianza. Apigee considerará confiable al par remoto si la cadena de certificados que envía termina en un certificado contenido en este almacén de claves.

N / A No
ClientAuthEnabled

Si se establece como true , habilita TLS bidireccional (también conocido como TLS mutuo o mTLS) entre Apigee y el par remoto, ya sea el cliente API o el backend de destino.

Para habilitar TLS bidireccional generalmente es necesario configurar un almacén de confianza y un almacén de claves en Apigee.

false No
KeyStore Un almacén de claves que contiene claves privadas utilizadas para la autenticación de clientes salientes N / A Sí (si ClientAuthEnabled es verdadero)
KeyAlias El alias de la clave privada utilizada para la autenticación del cliente saliente N / A Sí (si ClientAuthEnabled es verdadero)
IgnoreValidationErrors

Indica si se ignoran los errores de validación. Si el sistema backend usa SNI y devuelve un certificado con un nombre distinguido (DN) del sujeto que no coincide con el nombre de host, no hay forma de ignorar el error y la conexión falla.

Nota : Si <Enforce> se establece como true , se ignora el valor de <IgnoreValidationErrors> .

false No
Ciphers

Cifrados compatibles para TLS/SSL saliente. Si no se especifica ningún cifrado, se permitirán todos los disponibles para la JVM.

Para restringir los cifrados, agregue los siguientes elementos que enumeran los cifrados admitidos:

<Ciphers>
 <Cipher>TLS_RSA_WITH_3DES_EDE_CBC_SHA</Cipher>    
 <Cipher>TLS_RSA_WITH_DES_CBC_SHA</Cipher>
</Ciphers>
N / A No
Protocols

Protocolos compatibles con TLS/SSL de salida. Si no se especifica ningún protocolo, se permitirán todos los protocolos disponibles para la JVM.

Para restringir protocolos, especifíquelos explícitamente. Por ejemplo, para permitir solo TLS v1.2 o TLS v1.3:

<Protocols>
 <Protocol>TLSv1.2</Protocol>
 <Protocol>TLSv1.3</Protocol>
</Protocols>
N / A No
CommonName

Apigee compara el valor aquí con el CN ​​(nombre común) o SAN (nombres alternativos del sujeto) en el certificado del par remoto.

N / A No

Especificación de la aplicación de SSL a nivel de entorno

Si SSLInfo.Enforce se establece como true o false , el valor especificado anula cualquier opción de aplicación granular especificada en los bloques <SSLInfo> en las configuraciones de TargetEndpoint o TargetServer.

Si no se configura SSLInfo.Enforce , la aplicación de SSL se determina mediante los valores especificados mediante el elemento <Enforce> dentro de cada bloque <SSLInfo> . Para más información, consulte Configuración de TLS/SSL TargetEndpoint.

En el siguiente ejemplo, SSLInfo.Enforce se establece en true . En el resultado, se puede ver que SSL se aplica en el entorno especificado.

VALUE=true
curl -Ss -v -X PUT \
    "https://apigee.googleapis.com/v1/organizations/MYORG/environments/MYENV" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer TOKEN" \
    -d '{
        "name": "MYENV",
        "properties": {
            "property": [{
                "name": "features.SSLInfo.Enforce",
                "value": "'"$VALUE"'"
            }]
        }
    }'
  

Producción:

{
  ...
  "properties": {
    "property": [
      {
        "name": "features.SSLInfo.Enforce",
        "value": "true"
      }
    ]
  },
  ...
}

Punto final de destino de muestra con autenticación de cliente saliente habilitada

<TargetEndpoint name="default">
  <HttpTargetConnection>
        <URL>https://myservice.com</URL>
    <SSLInfo>
      <Enabled>true</Enabled>
      <Enforce>true</Enforce>
      <ClientAuthEnabled>true</ClientAuthEnabled>
      <KeyStore>myKeystore</KeyStore>
      <KeyAlias>myKey</KeyAlias>
      <TrustStore>myTruststore</TrustStore>
    </SSLInfo>
  </HttpTargetConnection>
</TargetEndpoint>

Para obtener instrucciones detalladas, consulte Opciones para configurar TLS .

Uso de variables de flujo para establecer valores TLS/SSL dinámicamente

También puede configurar dinámicamente los detalles de TLS/SSL para cumplir con los requisitos flexibles de tiempo de ejecución. Por ejemplo, si su proxy se conecta a dos destinos potencialmente diferentes (un destino de prueba y uno de producción), puede configurar su proxy de API para que detecte programáticamente el entorno al que llama y establezca dinámicamente referencias al almacén de claves y al almacén de confianza adecuados. El artículo de la comunidad de Apigee "SSLInfo dinámico para TargetEndpoint mediante referencia de variables" explica este escenario con más detalle y proporciona ejemplos de proxy de API implementables.

En el siguiente ejemplo de cómo se configuraría la etiqueta <SSLInfo> en una configuración de TargetEndpoint, los valores se pueden proporcionar en tiempo de ejecución, por ejemplo, mediante una llamada de Java, una política de JavaScript o una política AssignMessage . Utilice las variables de mensaje que contengan los valores que desee configurar.

Las variables solo se permiten en los siguientes elementos.

<SSLInfo>
    <Enabled>{myvars.ssl.enabled}</Enabled>
    <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled>
    <KeyStore>{myvars.ssl.keystore}</KeyStore>
    <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias>
    <TrustStore>{myvars.ssl.trustStore}</TrustStore>
</SSLInfo>

Uso de referencias para establecer valores TLS/SSL dinámicamente

Al configurar un punto final de destino que usa HTTPS, debe tener en cuenta el caso en que el certificado TLS/SSL expire o un cambio en la configuración del sistema requiera actualizar el certificado.

Para obtener más información, consulte Manejo de certificados caducados .

Sin embargo, puede configurar opcionalmente el punto final de destino para que utilice una referencia al almacén de claves o al almacén de confianza. La ventaja de usar una referencia es que puede actualizarla para que apunte a un almacén de claves o de confianza diferente y así actualizar el certificado TLS/SSL sin tener que reiniciar los procesadores de mensajes.

Por ejemplo, a continuación se muestra un punto final de destino que utiliza una referencia al almacén de claves:

<SSLInfo>
  <Enabled>true</Enabled>
  <ClientAuthEnabled>false</ClientAuthEnabled>
  <KeyStore>ref://keystoreref</KeyStore>
  <KeyAlias>myKeyAlias</KeyAlias>
</SSLInfo>

Utilice la siguiente llamada a la API POST para crear la referencia denominada keystoreref :

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references" \
  -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -d '<ResourceReference name="keystoreref">
    <Refers>myTestKeystore</Refers>
    <ResourceType>KeyStore</ResourceType>
</ResourceReference>'

Donde $TOKEN se establece en su token de acceso de OAuth 2.0, como se describe en "Obtención de un token de acceso de OAuth 2.0" . Para obtener información sobre las opciones curl utilizadas en este ejemplo, consulte "Uso de curl" . Para obtener una descripción de las variables de entorno utilizadas, consulte "Configuración de variables de entorno para solicitudes de la API de Apigee" .

La referencia especifica el nombre del almacén de claves y su tipo.

Utilice la siguiente llamada API GET para ver la referencia:

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -H "Authorization: Bearer $TOKEN"

Donde $TOKEN se establece en su token de acceso de OAuth 2.0, como se describe en "Obtención de un token de acceso de OAuth 2.0" . Para obtener información sobre las opciones curl utilizadas en este ejemplo, consulte "Uso de curl" . Para obtener una descripción de las variables de entorno utilizadas, consulte "Configuración de variables de entorno para solicitudes de la API de Apigee" .

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -H "Authorization: Bearer $TOKEN"

Donde $TOKEN se establece en su token de acceso de OAuth 2.0, como se describe en "Obtención de un token de acceso de OAuth 2.0" . Para obtener información sobre las opciones curl utilizadas en este ejemplo, consulte "Uso de curl" . Para obtener una descripción de las variables de entorno utilizadas, consulte "Configuración de variables de entorno para solicitudes de la API de Apigee" .

Para cambiar posteriormente la referencia para que apunte a un almacén de claves diferente, asegurándose de que el alias tenga el mismo nombre, utilice la siguiente llamada PUT:

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -X PUT \
  -H "Authorization: Bearer $TOKEN" \
  -d '<ResourceReference name="keystoreref">
    <Refers>myNewKeystore</Refers>
    <ResourceType>KeyStore</ResourceType>
  </ResourceReference>'

Donde $TOKEN se establece en su token de acceso de OAuth 2.0, como se describe en "Obtención de un token de acceso de OAuth 2.0" . Para obtener información sobre las opciones curl utilizadas en este ejemplo, consulte "Uso de curl" . Para obtener una descripción de las variables de entorno utilizadas, consulte "Configuración de variables de entorno para solicitudes de la API de Apigee" .

TargetEndpoint con equilibrio de carga de destino

Los puntos finales de destino admiten el equilibrio de carga entre múltiples servidores de destino nombrados mediante tres algoritmos de equilibrio de carga.

Para obtener instrucciones detalladas, consulte Equilibrio de carga entre servidores back-end .

Punto final de integración

Un IntegrationEndpoint es un endpoint de destino que ejecuta específicamente integraciones de Apigee . Si ha configurado un IntegrationEndpoint, Apigee envía el objeto de solicitud a su plataforma de integración para su ejecución. Para ejecutar la integración, además de configurar el IntegrationEndpoint, también debe agregar la política SetIntegrationRequest en el flujo de proxy.

Puede configurar su integración para que se ejecute de forma síncrona o asíncrona configurando el elemento <AsyncExecution> en la configuración de IntegrationEndpoint. Para obtener más información, consulte Ejecución síncrona vs. asíncrona . Tras ejecutar la integración, Apigee guarda la respuesta en el mensaje de respuesta .

Configuración de IntegrationEndpoint

Para configurar un punto de integración como punto de destino, añada el elemento IntegrationEndpoint a la configuración de ProxyEndpoint. A continuación, se muestra un ejemplo de configuración de ProxyEndpoint:

<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>my-set-integration-request-policy</Name>
            </Step>
        </Request>
    </PreFlow>
    <Flows/>
    <PostFlow name="PostFlow"/>
    <HTTPProxyConnection>
        <BasePath>/integration-endpoint-test</BasePath>
        <Properties/>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <IntegrationEndpoint>my-int-endpoint</IntegrationEndpoint>
    </RouteRule>
</ProxyEndpoint>

En la configuración de ejemplo de ProxyEndpoint, Apigee realiza las siguientes tareas:

  1. En PreFlow, ejecuta la política denominada my-set-integration-request-policy , que establece el objeto de solicitud de integración y las variables del flujo de integración.
  2. Utiliza my-int-endpoint como punto final de destino, como se especifica en RouteRule .
  3. Lee el objeto de solicitud de integración creado por my-set-integration-request-policy .
  4. Envía la solicitud a la plataforma de integración de Apigee utilizando el objeto de solicitud y las variables de flujo establecidas por la política SetIntegrationRequest.
  5. Guarda la respuesta de la integración en el mensaje de respuesta.

El archivo XML que contiene la declaración <IntegrationEndpoint> estará disponible en el directorio APIGEE_BUNDLE_DIRECTORY /apiproxy/integration-endpoints/ . Si crea su proxy de API mediante la opción Develop > API Proxies > CREATE NEW > Integration target , Apigee almacena la declaración en el archivo /apiproxy/integration-endpoints/default.xml . Si crea el XML del punto final de integración desde la interfaz de usuario, puede asignarle un nombre personalizado.

El siguiente ejemplo muestra la declaración del elemento <IntegrationEndpoint> en el archivo XML:

<IntegrationEndpoint name="my-int-endpoint">
    <AsyncExecution>false</AsyncExecution>
</IntegrationEndpoint>

Elementos de configuración de IntegrationEndpoint

Nombre Descripción Por defecto ¿Requerido?
IntegrationEndpoint
name El nombre del punto final de integración. Los caracteres que se pueden usar en el nombre están restringidos a: A-Za-z0-9._\-$ % N / A
AsyncExecution Un valor booleano que especifica si la integración debe ejecutarse en modo síncrono o asíncrono. Para más información, consulte Ejecución síncrona vs. asíncrona . FALSO No

Ejecución sincrónica vs. asincrónica

Puede configurar la integración para que se ejecute en modo síncrono o asíncrono. Para comprender la diferencia entre los modos de ejecución síncrono y asíncrono, consulte <AsyncExecution> .

Utilice el elemento <AsyncExecution> dentro de </IntegrationEndpoint> para especificar la ejecución síncrona o asíncrona. Si <AsyncExecution> se establece en true , la integración se ejecuta asíncronamente. Si se establece en false , la integración se ejecuta síncronamente.

El siguiente ejemplo establece AsyncExecution en true :

<IntegrationEndpoint name="my-int-endpoint">
    <AsyncExecution>true</AsyncExecution>
</IntegrationEndpoint>

Políticas

El directorio /policies de un proxy API contiene todas las políticas disponibles para adjuntarse a los flujos en el proxy API.

Elementos de configuración de políticas

Nombre Descripción Por defecto ¿Requerido?
Policy
name

El nombre interno de la política. Los caracteres que puedes usar en el nombre están restringidos a: A-Za-z0-9._\-$ % . Sin embargo, la interfaz de usuario de Apigee aplica restricciones adicionales, como eliminar automáticamente los caracteres que no son alfanuméricos.

Opcionalmente, use el elemento <DisplayName> para etiquetar la política en el editor de proxy de UI Apigee con un nombre diferente en idioma natural.

N / A
enabled

Establezca como true para aplicar la política.

Establézcalo como false para desactivar la política. Esta no se aplicará aunque permanezca asociada a un flujo.

true No
continueOnError

Establézcalo como false para devolver un error cuando una política falla. Este es el comportamiento esperado para la mayoría de las políticas.

Establezca como true para que la ejecución del flujo continúe incluso después de que falle una política.

false No
async

Cuando se establece en true , la ejecución de la política se descarga en un hilo diferente, dejando el hilo principal libre para manejar solicitudes adicionales. Cuando se completa el procesamiento fuera de línea, el hilo principal regresa y termina de manejar el flujo de mensajes. En algunos casos, establecer Async en true mejora el rendimiento del proxy de la API. Sin embargo, el uso excesivo de Async puede dañar el rendimiento con demasiado cambio de hilo.

Para usar el comportamiento asincrónico en los proxies API, consulte el modelo de objeto JavaScript .

false No

Apego de política

La siguiente imagen muestra la secuencia de ejecución de flujos de proxy API:

Muestra a un cliente que llama a un servicio HTTP. La solicitud encuentra el   punto final proxy y punto final de destino, cada uno contiene pasos que desencadenan políticas. Después de la   El servicio HTTP devuelve la respuesta, la respuesta se procesa mediante el punto final de destino y luego el   Proxyendpoing antes de ser devuelto al cliente. Al igual que con la solicitud, la respuesta se procesa   por políticas dentro de los pasos.

Como se muestra arriba:

Las políticas se adjuntan como pasos de procesamiento a los flujos . El nombre de la política se utiliza para hacer referencia a la política que se aplicará como un paso de procesamiento. El formato de un archivo adjunto de políticas es el siguiente:

<Step><Name>MyPolicy</Name></Step>

Las políticas se aplican en el orden en que se unen a un flujo. Por ejemplo:

<Step><Name>FirstPolicy</Name></Step>
<Step><Name>SecondPolicy</Name></Step>

Elementos de configuración de archivos adjuntos de políticas

Nombre Descripción Por defecto ¿Requerido?
Step
Name El nombre de la política que se ejecutará por esta definición de paso. N / A
Condition Una declaración condicional que determina si la política se aplica o no. Si una política tiene una condición asociada, entonces la política solo se ejecuta si la declaración condicional se evalúa a verdaderas. N / A No

Flujos

ProxyEndpoint y TargetEndpoint definen una tubería para el procesamiento de mensajes de solicitud y respuesta. Una tubería de procesamiento consiste en un flujo de solicitud y un flujo de respuesta. Cada flujo de solicitud y flujo de respuesta se subdivide en un flujo previo, uno o más flujos condicionales o nombrados opcionales, y un posterior a la flujo.

  • Preflow: siempre se ejecuta. Se ejecuta antes de que fluya cualquier condicional.
  • Postflow: siempre se ejecuta. Se ejecuta después de cualquier flujo condicional.

Además, puede agregar un PostClientFlow al punto final proxy, que se ejecuta después de que la respuesta se devuelve a la aplicación del cliente solicitante. Solo la política de mensajería se puede adjuntar a este flujo. PostClientFlow reduce la latencia del proxy API y pone a disposición de la información para el registro que no se calcula hasta que la respuesta se devuelve al cliente, como el client.sent.start.timestamp y client.sent.end.timestamp . El flujo se usa principalmente para medir el intervalo de tiempo entre el inicio y el tiempo final de las campañas para el mensaje de respuesta.

Aquí hay un ejemplo de un flujo postclient con una política de registro de mensajes adjunta.

...
  <PostFlow name="PostFlow">
      <Request/>
      <Response/>
  </PostFlow>
  <PostClientFlow>
      <Request/>
      <Response>
          <Step>
              <Name>Message-Logging-1</Name>
          </Step>
      </Response>
  </PostClientFlow>
  ...

La tubería de procesamiento proxy API ejecuta flujos en la siguiente secuencia:

Solicitud de tubería:

  1. Solicitud de proxy Preflow
  2. Flujos condicionales de solicitud de solicitud (opcional)
  3. Postez de solicitud de solicitud de proxy
  4. Solicitud de objetivo Preflow
  5. Flujos condicionales de solicitud de objetivo (opcional)
  6. Solicitud de objetivo Postflow

Tubería de respuesta:

  1. Respuesta del objetivo Preflow
  2. Flujos condicionales de respuesta objetivo (opcional)
  3. Respuesta de destino Postflow
  4. Respuesta proxy Preflow
  5. Flujos condicionales de respuesta a proxy (opcional)
  6. Respuesta de poder Postflow
  7. Respuesta PostClientFlow (opcional)

Solo aquellos flujos con archivos adjuntos de políticas deben configurarse en las configuraciones ProxyendPoint o TargetEndpoint. Preflow y Postflow solo necesitan especificarse en una configuración ProxyendPoint o TargetEndpoint cuando se debe aplicar una política durante el procesamiento previo al flujo o después del flujo.

A diferencia de los flujos condicionales, el orden de los elementos previos al flujo y después del flujo no es importante: el proxy API siempre ejecutará cada uno en el punto apropiado de la tubería, independientemente de dónde aparezcan en la configuración del punto final.

Flujos condicionales

Los puntos finales de proxy y los puntos finales objetivo admiten un número ilimitado de flujos condicionales (también conocidos como flujos nombrados ).

Las pruebas de proxy API para la condición especificada en el flujo condicional y, si se cumple la condición, los pasos de procesamiento en el flujo condicional son ejecutados por el proxy API. Si no se cumple la condición, se omiten los pasos de procesamiento en el flujo condicional. Los flujos condicionales se evalúan en el orden definido en el proxy API y el primero cuya condición se cumple.

Al definir los flujos condicionales, obtiene la capacidad de aplicar pasos de procesamiento en un proxy API basado en:

  • URI de solicitud
  • Verbo http ( GET / PUT / POST / DELETE )
  • Valor de un parámetro de consulta, encabezado y parámetro de formulario
  • Muchos otros tipos de condiciones

Por ejemplo, el siguiente flujo condicional especifica que se ejecuta solo cuando la ruta de recursos de solicitud es /accesstoken . Cualquier solicitud entrante con la ruta /accesstoken hace que este flujo se ejecute, junto con cualquier política que esté conectada al flujo. Si la ruta de solicitud no incluye el sufijo /accesstoken , entonces el flujo no se ejecuta (aunque otro flujo condicional podría).

<Flows>
  <Flow name="TokenEndpoint">
    <Condition>proxy.pathsuffix MatchesPath "/accesstoken"</Condition>
    <Request>
      <Step>
        <Name>GenerateAccessToken</Name>
      </Step>
    </Request> 
  </Flow>
</Flows>   

Elementos de configuración de flujo

Nombre Descripción Por defecto ¿Requerido?
Flow Una tubería de procesamiento de solicitud o respuesta definida por un punto final proxy o punto final de destino
Name El nombre único del flujo. N / A
Condition Una declaración condicional que evalúa una o más variables para evaluar en verdadero o falso. Todos los flujos que no sean los tipos predefinidos de preflow y posflow deben definir una condición para su ejecución. Sin embargo, si incluye un solo flujo sin una condición al final de una secuencia de flujos, actuará como la declaración "más" al final de la secuencia de flujos. N / A
Request La tubería asociada con el procesamiento de mensajes de solicitud N / A No
Response La tubería asociada con el procesamiento de mensajes de respuesta N / A No

Procesamiento de pasos

Apigee hace cumplir el orden secuencial de los flujos condicionales. Los flujos condicionales se ejecutan de arriba a abajo. El primer flujo condicional cuya condición se evalúa a true se ejecuta, y solo se ejecuta un flujo condicional.

Por ejemplo, en la siguiente configuración de flujo, cualquier solicitud entrante que no incluya el sufijo de ruta /first o /second hará que el ThirdFlow ejecute, aplicando la política llamada Return404 .

<Flows>
  <Flow name="FirstFlow">
    <Condition>proxy.pathsuffix MatchesPath "/first"</Condition>
    <Request>
      <Step><Name>FirstPolicy</Name></Step>
    </Request>
  </Flow>
  <Flow name="SecondFlow">
    <Condition>proxy.pathsuffix MatchesPath "/second"</Condition>
    <Request>
      <Step><Name>FirstPolicy</Name></Step>
      <Step><Name>SecondPolicy</Name></Step>
    </Request>
  </Flow>
  <Flow name="ThirdFlow">
    <Request>
      <Step><Name>Return404</Name></Step>
    </Request>
  </Flow>
</Flows>

Recursos

Los "recursos" (archivos de recursos para su uso en proxies API) son scripts, código y transformaciones XSL que se pueden conectar a flujos utilizando políticas. Estos aparecen en la sección Scripts del Editor de proxy API en la UI de Apigee.

Consulte Gestión de recursos para los tipos de recursos compatibles.

Los recursos se pueden almacenar en un proxy API, un entorno o una organización. En cada caso, se hace referencia a un recurso por nombre en una política. Apigee resuelve el nombre moviéndose del proxy API, al medio ambiente, al nivel de organización.

Un recurso almacenado a nivel de organización puede ser referenciado por políticas en cualquier entorno. Un recurso almacenado a nivel de entorno puede ser referenciado por políticas en ese entorno. Un recurso almacenado en el nivel de proxy API solo puede referenciarse por políticas en ese proxy API.

,

Esta página se aplica a Apigee y Apigee híbrido .

Ver la documentación de Apigee Edge .

Como desarrollador que trabaja con Apigee, sus actividades principales de desarrollo implican la configuración de proxies de API que funcionan como proxies para API o servicios de backend. Este documento es una referencia de todos los elementos de configuración disponibles para usted al construir proxies API.

Si está aprendiendo a construir proxies API, se recomienda que comience con el tema construyendo un proxy de API simple .

Edite la configuración proxy de su API utilizando uno de los siguientes métodos:

Estructura del directorio de configuración proxy de API

La estructura del directorio de configuración del proxy API se muestra a continuación:

Muestra la estructura del directorio en la que la apiproxi es la raíz. Directamente debajo del     El directorio de apiproxy son las políticas, los proxies, los recursos y los directorios de objetivos, así como el     Weatherapi.xml archivo.

Una configuración proxy de API consiste en los siguientes contenidos:

Configuración base Configuración de configuración primaria para un proxy API.
Punto final del proxy Configuración para la conexión HTTP entrante (desde solicitar aplicaciones a Apigee), flujos de solicitud y respuesta, y archivos adjuntos de políticas.
Punto de destino Configuración para la conexión HTTP saliente (desde Apigee al servicio de backend), flujos de solicitud y respuesta, y archivos adjuntos de políticas.
Flujos Proxyendpoint y TargetEndpoint Solicitudes y tuberías de respuesta a las que se pueden conectar las políticas.
Políticas Archivos de configuración formatados en XML que se ajustan a los esquemas de políticas de Apigee.
Recursos Scripts, archivos JAR y archivos XSLT referenciados por políticas para ejecutar Logic personalizado.

Configuración base

/apiproxy/weatherapi.xml

La configuración base para un proxy API, que define el nombre del proxy API. El nombre debe ser único dentro de una organización.

Configuración de muestra:

<APIProxy name="weatherapi">
</APIProxy>

Elementos de configuración base

Nombre Descripción Por defecto ¿Requerido?
APIProxy
name El nombre del proxy API, que debe ser único dentro de una organización. Los caracteres que puede usar en el nombre están restringidos a los siguientes: A-Za-z0-9_- N / A
revision El número de revisión de la configuración del proxy API. No necesita establecer explícitamente el número de revisión, ya que Apigee rastrea automáticamente la revisión actual del proxy API. N / A No
ConfigurationVersion La versión del esquema de configuración del proxy API al que se ajusta este proxy API. El único valor compatible actualmente es Majorversion 4 y MinorVersion 0. Esta configuración se puede usar en el futuro para permitir la evolución del formato de proxy API. 4.0 No
Description Una descripción textual del proxy API. Si se proporciona, la descripción se mostrará en la interfaz de usuario de Apigee. N / A No
DisplayName Un nombre fácil de usar que puede ser diferente del atributo name de la configuración del proxy API. N / A No
Policies Una lista de políticas en el directorio /policies de este proxy API. Normalmente solo verá este elemento cuando se creó el proxy API utilizando la interfaz de usuario de Apigee. Esta es simplemente una configuración manifiesta , diseñada para proporcionar visibilidad sobre el contenido del proxy API. N / A No
ProxyEndpoints Una lista de puntos finales proxy en el directorio /proxies de este proxy API. Normalmente solo verá este elemento cuando se creó el proxy API utilizando la interfaz de usuario de Apigee. Esta es simplemente una configuración manifiesta , diseñada para proporcionar visibilidad sobre el contenido del proxy API. N / A No
Resources Una lista de recursos (JavaScript, Python, Java, XSLT) en el directorio /resources de este proxy API. Normalmente solo verá este elemento cuando se creó el proxy API utilizando la interfaz de usuario de Apigee. Esta es simplemente una configuración manifiesta , diseñada para proporcionar visibilidad sobre el contenido del proxy API. N / A No
Spec Identifica la especificación OpenAPI asociada con el proxy API. El valor se establece en una URL o en una ruta en el almacén de especificaciones.
N / A No
TargetServers Una lista de servidores de destino referenciados en cualquier punto final objetivo de este proxy API. Normalmente solo verá este elemento cuando se creó el proxy API usando Apigee. Esta es simplemente una configuración manifiesta , diseñada para proporcionar visibilidad sobre el contenido del proxy API. N / A No
TargetEndpoints Una lista de puntos finales objetivo en el directorio /targets de este proxy API. Normalmente solo verá este elemento cuando se creó el proxy API utilizando la interfaz de usuario de Apigee. Esta es simplemente una configuración manifiesta , diseñada para proporcionar visibilidad sobre el contenido del proxy API. N / A No

Punto final del proxy

La siguiente imagen muestra el flujo de solicitud/respuesta:

Muestra a un cliente que llama a un HTTP   servicio. La solicitud pasa por el punto final de proxy y luego el punto final de destino antes de ser   Procesado por el servicio HTTP. La respuesta pasa por el final de la endpo y luego el   punto final proxy antes de ser devuelto al cliente.

/apiproxy/proxies/default.xml

La configuración de proxyendpoint define la interfaz entrante (orientado al cliente) para un proxy API. Cuando configura un punto final proxy, está configurando una configuración de red que define cómo las aplicaciones del cliente ( APPS ) deben invocar la API proxy.

La siguiente configuración de proxyendpoint de muestra se almacenaría en /apiproxy/proxies :

<ProxyEndpoint name="default">
  <PreFlow/>
  <Flows/>
  <PostFlow/>
  <HTTPProxyConnection>
    <BasePath>/weather</BasePath>
    <Properties/>
  </HTTPProxyConnection>
  <FaultRules/>
  <DefaultFaultRule/>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Los elementos de configuración requeridos en un punto final de proxy básico son:

Elementos de configuración de proxyendpoint

Nombre Descripción Por defecto ¿Requerido?
ProxyEndpoint
name El nombre del punto final proxy. Debe ser único dentro de la configuración proxy de API, cuando (en casos raros) se definen múltiples puntos finales proxy. Los caracteres que puede usar en el nombre están restringidos a lo siguiente: A-Za-z0-9._\-$ % . N / A
PreFlow Define las políticas en el flujo previo al flujo de una solicitud o respuesta. N / A
Flows
Define las políticas en los flujos condicionales de una solicitud o respuesta.
N / A
PostFlow
Define las políticas en el flujo posterior al flujo de una solicitud o respuesta.
N / A
HTTPProxyConnection Define la dirección de red y la ruta URI asociada con el proxy API.
BasePath

Una cadena requerida que identifica de manera única la ruta URI utilizada por Apigee para enrutar los mensajes entrantes al proxy API adecuado.

El BasePath es un fragmento URI (por ejemplo /weather ) adjunto a la URL base de un proxy API (por ejemplo, http://apifactory-test.apigee.net ). Basepath debe ser único dentro de un entorno. La singularidad se valida cuando se genera o importe un proxy API.

Usando un comodín en los caminos base

Puede usar uno o más comodines "*" en las rutas base de proxy API. Por ejemplo, una ruta base de /team/*/members permite a los clientes llamar https://[host]/team/ blue /members y https://[host]/team/ green /members sin que necesite crear nuevos proxies de API para admitir nuevos equipos. Tenga en cuenta que / ** / no es compatible.

Importante: Apigee no admite el uso de un comodín "*" como el primer elemento de una ruta base. Por ejemplo, esto no es compatible: /*/search . Comenzar la ruta base con un "*" puede conducir a errores inesperados debido a la forma en que Apigee identifica rutas válidas.

/
Properties Un conjunto de configuraciones de configuración HTTP opcionales se puede definir como propiedades de A <ProxyEndpoint> . Las propiedades disponibles incluyen lo siguiente:
  • request.queryparams.ignore.content.type.charset

    Use la request.queryparams.ignore.content.type.charset de propiedad.querams.ignore.content.type.charset para decirle al proxy que ignore el parámetro charset del encabezado Content-Type al procesar la URL de la solicitud. Por ejemplo:

    <Properties>
      <Property name="request.queryparams.ignore.content.type.charset">true</Property>
    </Properties>

    La siguiente tabla muestra la salida de ejemplo dependiendo de la configuración de la propiedad charset y la presencia del parámetro charset del encabezado Content-Type .

    Configuración de propiedades Valor del encabezado Ejemplo de salida
    charset=false charset no establecido [email protected]
    charset=false charset=utf-8 John.doe [email protected]
    charset=true y sin parámetros de charset en el encabezado. charset no establecido [email protected]
    charset=true charset=utf-8 Param SET [email protected]
  • request.payload.parse.limit

    Use la propiedad de request.payload.parse.limit para establecer el tamaño máximo de carga útil que se puede procesar en el flujo de solicitud, en megabytes (m).

    Por ejemplo:

    <Properties>
      <Property name="request.payload.parse.limit">30M</Property>
    </Properties>

    El límite mínimo configurable es de 10 my el límite máximo configurable es de 30 m. Si la propiedad no está configurada, el límite predeterminado es de 10 m.

    Para obtener más información, consulte el tamaño de la carga útil del mensaje .

N / A No
FaultRules
Define cómo reacciona el punto final proxy a un error. Una regla de falla especifica dos elementos:
  • Una condición que especifica la falla que se manejará en función de la categoría predefinida, la subcategoría o el nombre de la falla
  • Una o más políticas que definen el comportamiento de la regla de falla para la condición correspondiente

Ver fallas de manejo .

N / A No
DefaultFaultRule

Maneja cualquier error (sistema, transporte, mensajería o política) que no sean manejados explícitamente por otra regla de falla.

Ver fallas de manejo .

N / A No
RouteRule Define el destino de los mensajes de solicitud de entrada después del procesamiento por la tubería de solicitud de proxyendpoint. Por lo general, el routerule apunta a un punto final objetivo con nombre, un punto de integración o una URL.
Name Atributo requerido, que proporciona un nombre para el routerule. Los caracteres que puede usar en el nombre están restringidos a lo siguiente: A-Za-z0-9._\-$ % . Por ejemplo, Cat2 %_ es un nombre legal. N / A
Condition Una declaración condicional opcional utilizada para el enrutamiento dinámico en tiempo de ejecución. Los routerules condicionales son útiles, por ejemplo, para habilitar el enrutamiento basado en el contenido para admitir la versiones de back-end. N / A No
TargetEndpoint

Una cadena opcional que identifica una configuración de TargetEndpoint con nombre. Un punto final de destino con nombre es cualquier punto final objetivo definido en el mismo proxy API en el directorio /targets ).

Al nombrar un punto final objetivo, indica dónde se deben reenviar los mensajes de solicitud después del procesamiento de la tubería de solicitud de Proxyendpoint. Tenga en cuenta que esta es una configuración opcional.

Un punto final proxy puede llamar a una URL directamente. Por ejemplo, un recurso JavaScript o Java, que funciona en el papel de un cliente HTTP, puede realizar el deber básico de un punto final objetivo, que es reenviar las solicitudes a un servicio de backend.

N / A No
URL Una cadena opcional que define una dirección de red saliente llamada por el punto final proxy, evitando cualquier configuración de TargetEndpoint que pueda almacenarse en /targets N / A No

Cómo configurar los routerules

Un punto final de destino con nombre se refiere a un archivo de configuración en /apiproxy/targets a los que el routerule reenvía una solicitud después del procesamiento por el punto final proxy.

Por ejemplo, el siguiente routerule se refiere a la configuración /apiproxy/targets/myTarget.xml :

<RouteRule name="default">
  <TargetEndpoint>myTarget</TargetEndpoint>
</RouteRule>

Invocación de URL directo

Un punto final proxy también puede invocar directamente un servicio de backend. La invocación de URL directa omite cualquier configuración de TargetEndpoint nombrada en /apiproxy/targets ). Por esta razón, TargetEndpoint es una configuración de proxy API opcional, aunque, en la práctica, no se recomienda la invocación directa desde el punto final proxy.

Por ejemplo, el siguiente routerule hace una llamada http a http://api.mycompany.com/v2 .

<RouteRule name="default">
  <URL>http://api.mycompany.com/v2</URL> 
</RouteRule>

Rutas condicionales

Los routerules se pueden encadenar para admitir el enrutamiento dinámico en tiempo de ejecución. Las solicitudes entrantes se pueden enrutar a las configuraciones de TargetEndpoint nombradas, directamente a URL, o a una combinación de los dos, basadas en encabezados HTTP, contenido de mensajes, parámetros de consulta o información contextual como hora del día, localidad, etc.

Los routerules condicionales funcionan como otras declaraciones condicionales en Apigee. Ver Condiciones Referencia de referencia y flujo de variables .

Por ejemplo, la siguiente combinación de routerule evalúa primero la solicitud entrante para verificar el valor de un encabezado HTTP. Si la routeTo de encabezado HTTP tiene el valor TargetEndpoint1 , entonces la solicitud se reenvía al punto final de destino llamado TargetEndpoint1 . Si no, entonces la solicitud de entrada se reenvía a http://api.mycompany.com/v2 .

<RouteRule name="MyRoute">
  <Condition>request.header.routeTo = "TargetEndpoint1"</Condition>
  <TargetEndpoint>TargetEndpoint1</TargetEndpoint>
</RouteRule>
<RouteRule name="default">
  <URL>http://api.mycompany.com/v2</URL>
</RouteRule>

Rutas nulas

Se puede definir un routerule nulo para admitir escenarios en los que el mensaje de solicitud no necesita reenviarse al punto final de destino. Esto es útil cuando el punto final proxy realiza todo el procesamiento necesario, por ejemplo, mediante el uso de JavaScript para llamar a un servicio externo o recuperar datos de una búsqueda al almacén de clave/valor Apigee.

Por ejemplo, lo siguiente define una ruta nula:

<RouteRule name="GoNowhere"/>

Las rutas nulas condicionales pueden ser útiles. En el siguiente ejemplo, una ruta nula está configurada para ejecutar cuando un encabezado HTTP request.header.X-DoNothing tiene un valor que no sea null .

<RouteRule name="DoNothingOnDemand">
  <Condition>request.header.X-DoNothing != null</Condition>
</RouteRule>

Recuerde, se pueden encadenar los routerules, por lo que una ruta nula condicional típicamente sería un componente de un conjunto de routerules diseñados para soportar el enrutamiento condicional.

Un uso práctico de una ruta nula condicional sería apoyo del almacenamiento en caché. Al usar el valor de la variable establecida por la política de caché, puede configurar un proxy API para ejecutar la ruta nula cuando se sirve una entrada desde el caché.

<RouteRule name="DoNothingUnlessTheCacheIsStale">
  <Condition>lookupcache.LookupCache-1.cachehit is true</Condition>
</RouteRule>

Punto de destino

Muestra a un cliente que llama a un HTTP   servicio. La solicitud pasa por el punto final de proxy y luego el punto final de destino antes de ser   Procesado por el servicio HTTP. La respuesta pasa por el final de la endpo y luego el   punto final proxy antes de ser devuelto al cliente.

Un punto final objetivo es el equivalente de salida de un punto final proxy. Un punto final objetivo funciona como cliente a un servicio o API de backend: envía solicitudes y recibe respuestas.

Un proxy API no necesita tener puntos finales objetivo. Los puntos finales proxy se pueden configurar para llamar a las URL directamente. Un proxy API sin puntos finales de destino generalmente contiene un punto final proxy que llama directamente a un servicio de backend, o que está configurado para llamar a un servicio usando Java o JavaScript.

Configuración de TargetendPoint

/targets/default.xml

El punto final objetivo define la conexión de salida de Apigee a otro servicio o recurso.

Aquí hay una muestra de configuración de TargetEndpoint:

<TargetEndpoint name="default">
  <PreFlow/>
  <Flows/>
  <PostFlow/>
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <SSLInfo/>
    <Authentication/>
  </HTTPTargetConnection>
  <FaultRules/>
  <DefaultFaultRule/>
  <ScriptTarget/>
  <LocalTargetConnection/>
</TargetEndpoint>

Elementos de configuración de TargetendPoint

Un punto final objetivo puede llamar a un objetivo de una de las siguientes maneras:

  • HttpTargetConnection para llamadas http o https
  • LocalTargetConnection para encadenamiento local de proxy a proxy

Configure solo uno de estos en un punto final de destino.

Nombre Descripción Por defecto ¿Requerido?
TargetEndpoint
name El nombre del punto final de destino, que debe ser único dentro de la configuración de proxy API. El nombre del punto final de destino se usa en el routerule Proxyendpoint para dirigir las solicitudes de procesamiento de salida. Los caracteres que puede usar en el nombre están restringidos a lo siguiente: A-Za-z0-9._\-$ % . N / A
PreFlow Define las políticas en el flujo previo al flujo de una solicitud o respuesta. N / A
Flows
Define las políticas en los flujos condicionales de una solicitud o respuesta.
N / A
PostFlow
Define las políticas en el flujo posterior al flujo de una solicitud o respuesta.
N / A
HTTPTargetConnection

Con sus elementos hijos, especifica un recurso de backend alcanzado a través de HTTP.

Si usa httpTargetConnection, no configure otros tipos de conexiones de destino (scriptTarget o localTargetConnection).

Puede usar el elemento <Authentication> infantil para hacer llamadas autenticadas a los servicios de Google o servicios personalizados que se ejecutan en ciertos productos en la nube de Google, como funciones en la nube y ejecución de nubes . El uso del elemento <Authentication> requiere pasos de configuración e implementación descritos en el uso de la autenticación de Google . Con la configuración adecuada, la política crea un token de autenticación para usted y lo agrega a la solicitud de servicio. Ver también <Authentication> uso de elementos .

URL Define la dirección de red del servicio de back -end al que el punto final de destino reenvía los mensajes de solicitud. N / A No
LoadBalancer

Define una o más configuraciones de TargetServer con nombre. Las configuraciones nombradas de TargetServer se pueden usar para el equilibrio de carga que define 2 o más conexiones de configuración de punto final.

También puede usar servidores de destino para decouple las configuraciones proxy de la API de las URL de puntos finales del servicio de backend concreto.

N / A No
Properties Un conjunto de configuraciones de configuración HTTP opcionales se puede definir como propiedades de A <TargetEndpoint> .

Use la response.payload.parse.limit de la propiedad.payload.parse.limit para establecer el tamaño máximo de carga útil que se puede procesar en el flujo de respuesta, en megabytes (m).

Por ejemplo:

<Properties>
  <Property name="response.payload.parse.limit">15M</Property>
</Properties>

El límite mínimo configurable es de 10 my el límite máximo configurable es de 30 m. Si la propiedad no está configurada, el límite predeterminado es de 10 m.

Para obtener más información, consulte el tamaño de la carga útil del mensaje .

N / A No
SSLInfo Opcionalmente, defina la configuración TLS/SSL en un punto final de destino para controlar la conexión TLS/SSL entre el proxy API y el servicio de destino. Consulte la configuración TLS/SSL TargetEndpoint . N / A No
LocalTargetConnection Con sus elementos infantiles, especifica un recurso que se alcanza localmente, evitando las características de la red, como el equilibrio de carga y los procesadores de mensajes.

Para especificar el recurso objetivo, incluya el elemento APIPROXY Child (con el elemento proxyendpoint) o el elemento de la ruta infantil.

Para obtener más información, consulte los proxies API de encadenamiento juntos .

Si usa LocalTargetConnection, no configure otros tipos de conexiones de destino (httpTargetConnection o scriptTarget).

APIProxy Especifica el nombre de un proxy API para usar como objetivo para las solicitudes. El proxy objetivo debe estar en la misma organización y entorno que las solicitudes de envío proxy. Esta es una alternativa al uso del elemento de ruta. N / A No
ProxyEndpoint Se utiliza con Apiproxy para especificar el nombre del punto final proxy del proxy de destino. N / A No
Path Especifica la ruta del punto final de un proxy API para usar como objetivo para las solicitudes. El proxy objetivo debe estar en la misma organización y entorno que las solicitudes de envío proxy. Esta es una alternativa al uso de Apiproxy. N / A No
FaultRules
Define cómo reacciona el punto final objetivo a un error. Una regla de falla especifica dos elementos:
  • Una condición que especifica la falla que se manejará en función de la categoría predefinida, la subcategoría o el nombre de la falla
  • Una o más políticas que definen el comportamiento de la regla de falla para la condición correspondiente

Ver fallas de manejo .

N / A No
DefaultFaultRule

Maneja cualquier error (sistema, transporte, mensajería o política) que no sean explícitamente manejados por otro faultrule.

Ver fallas de manejo .

N / A No

<Authentication> uso de elementos

El uso del elemento <Authentication> en <TargetEndpoint> es idéntico al uso del elemento <Authentication> en la política ServiceCallout. En tanto <TargetEndpoint> como ServiceCallout, <Authentication> es un subelemento de <HttpTargetConnection> . Para más detalles, consulte el elemento de autenticación en el Referencia de política ServiceCallout.

<Authentication> referencia de error de elementos

Si está utilizando el elemento <Authentication> , puede encontrar posibles mensajes de error y consejos de solución de problemas para los errores de implementación y tiempo de ejecución en la sección Errores de la documentación de la política ServiceCallout.

<Authentication> ejemplos de elementos

El siguiente ejemplo muestra cómo llamar a un servicio implementado en la nube ejecutada como el objetivo utilizando el elemento Authentication para generar un token de conexión OpenID necesario para autenticar la llamada:

<TargetEndpoint name="TargetEndpoint-1">
  <HTTPTargetConnection>
      <Properties/>
      <URL>https://cloudrun-hostname.a.run.app/test</URL>
      <Authentication>
          <GoogleIDToken>
             <Audience>https://cloudrun-hostname.a.run.app/test</Audience>
          </GoogleIDToken>
     </Authentication>
  </HTTPTargetConnection>
</TargetEndpoint>

El siguiente ejemplo muestra cómo llamar a un servicio Target que apunta a la ejecución de la nube utilizando el elemento Authentication para generar un token de Connect OpenID necesario para autenticar la llamada. El elemento HeaderName agrega el token de portador generado a un encabezado llamado X-Serverless-Authorization que se envía al sistema de destino. El encabezado Authorization , si está presente, se deja sin modificar y también se envía en la solicitud.

<TargetEndpoint name="TargetEndpoint-1">
   <HTTPTargetConnection>
     <Authentication>
        <HeaderName>X-Serverless-Authorization</HeaderName>
        <GoogleIDToken>
            <Audience ref="flow.variable.audience">https://cloudrun-hostname.a.run.app</Audience>
        </GoogleIDToken>
     </Authentication>
      <LoadBalancer>
         <Server name="cloud-run-target" />
      </LoadBalancer>
   </HTTPTargetConnection>
</TargetEndpoint>

El siguiente ejemplo muestra cómo llamar a un servicio Target que apunta al Servicio de Google Secret Manager . En este ejemplo, el elemento GoogleAccesStoken está configurado para generar un token de autenticación de Google para autenticar la solicitud de destino:

<HTTPTargetConnection>
   <Authentication>
      <GoogleAccessToken>
        <Scopes>
          <Scope>https://www.googleapis.com/auth/cloud-platform</Scope>
        </Scopes>
      </GoogleAccessToken>
    </Authentication>
    <URL>
      https://secretmanager.googleapis.com/v1/projects/project-id/secrets/secret-id
    </URL>
</HTTPTargetConnection>

El siguiente ejemplo muestra cómo establecer automáticamente la audiencia del GoogleIDToken. Cuando useTargetUrl es true y la variable referenciada no se resuelve a una variable válida, la URL del objetivo (excluyendo los parámetros de consulta) se usa como audiencia. Supongamos que la ruta de solicitud es /foobar y la URL del servidor de destino es https://xyz.com , la audiencia del GoogleIDToken se establecerá automáticamente en https://xyz.com/foobar .

<TargetEndpoint name="TargetEndpoint-1">
  <HTTPTargetConnection>
    <Authentication>
      <GoogleIDToken>
        <Audience ref='myvariable' useTargetUrl="true"/>
      </GoogleIDToken>
    </Authentication>
    <LoadBalancer>
      <Server name="TS" />
    </LoadBalancer>
  </HTTPTargetConnection>
</TargetEndpoint>

Configuración TLS/SSL TargetEndpoint

Los puntos finales objetivo a menudo necesitan administrar conexiones HTTPS con infraestructura de backend heterogénea. Por esta razón, se admiten una serie de configuraciones de configuración TLS/SSL.

Elementos de configuración TLS/SSL TargetEndpoint

Nombre Descripción Por defecto ¿Requerido?
SSLInfo

El bloque <SSLInfo> se puede usar para TLS/SSL de unidireccional y bidireccional.

Enabled

Cuando se establece en true , especifica que la conexión de destino debe usar el protocolo SSL de acuerdo con cualquier otro parámetro especificado en este bloque <SSLInfo> . Cuando se establece en false , especifica que la conexión de destino no debe usar SSL.

Sin embargo, si el bloque Closing <HTTPTargetConnection> contiene un elemento <URL> que evalúa una cadena que comienza con https:// , entonces el protocolo SSL se usará incluso si <Enabled> es falso. En este caso, se ignora todo el bloque <SSLInfo> .

Por el contrario, si hay un elemento <URL> que comienza con http:// , entonces el protocolo SSL no se utilizará incluso si <Enabled> es verdadero.

FALSO No
Enforce

Haga cumplir SSL estricto entre Apigee y el backend objetivo.

Si se establece en true , las conexiones fallarán para objetivos con certificaciones inválidas, certificaciones caducadas, certificaciones autofirmadas, certs con un desajuste de nombre de host y certificaciones con una raíz no confiable. Se devuelve un código de falla de 4xx o 5xx .

Si no lo establece, o se establece en false , el resultado de las conexiones a los backends de objetivos con certificaciones problemáticas depende de la configuración de <IgnoreValidationErrors> (ver más abajo). Una respuesta de éxito ( 2xx ) puede ocurrir bajo ciertas condiciones, si <IgnoreValidationErrors> se establece en true .

Puede anular el campo de Enforce en el nivel de entorno con el indicador de funciones SSLInfo.Enforce . Consulte la aplicación SSL de especificación de nivel de entorno .

false No
TrustStore

Una tienda de claves que contiene certificados de servidor raíz de confianza. Apigee tratará el par remoto como confiable si la cadena de certificados que envía termina en un certificado contenido en este almacén de claves.

N / A No
ClientAuthEnabled

Si se establece en true , habilita TLS de dos vías (también conocido como TLS mutuos o MTL) entre Apigee y el par remoto, ya sea el cliente API o el backend de destino.

Habilitar TLS de dos vías generalmente requiere que confíe tanto una tienda de confianza como una tienda de claves en Apigee.

false No
KeyStore Una tienda de claves que contiene claves privadas utilizadas para la autenticación de cliente de salida N / A Sí (si el clientAuthEnabled es verdad)
KeyAlias El alias clave de la clave privada utilizada para la autenticación de cliente de salida N / A Sí (si el clientAuthEnabled es verdad)
IgnoreValidationErrors

Indica si se ignoran los errores de validación. Si el sistema de backend usa SNI y devuelve un certificado con un nombre distinguido (DN) que no coincide con el nombre de host, no hay forma de ignorar el error y la conexión falla.

NOTA : Si <Enforce> se establece en true , se ignora el valor de <IgnoreValidationErrors> .

false No
Ciphers

CIPHERS DE SOPORTE PARA TLS/SSL. Si no se especifican cifras, se permitirán todos los cifrados disponibles para el JVM.

Para restringir los cifrados, agregue los siguientes elementos que enumeran los cifrados compatibles:

<Ciphers>
 <Cipher>TLS_RSA_WITH_3DES_EDE_CBC_SHA</Cipher>    
 <Cipher>TLS_RSA_WITH_DES_CBC_SHA</Cipher>
</Ciphers>
N / A No
Protocols

Protocolos compatibles para TLS/SSL de salida. Si no se especifican protocolos, se permitirán todos los protocolos disponibles para el JVM.

Para restringir los protocolos, especifíquelos explícitamente. Por ejemplo, para permitir solo TLS v1.2 o TLS v1.3:

<Protocols>
 <Protocol>TLSv1.2</Protocol>
 <Protocol>TLSv1.3</Protocol>
</Protocols>
N / A No
CommonName

Apigee verifica el valor aquí con el CN ​​(nombre común) o SANS (nombres alternativos de sujeto) en el certificado de par remoto.

N / A No

Especificar la aplicación SSL a nivel de entorno

Si SSLInfo.Enforce se establece en true o false , el valor especificado anula cualquier opción de aplicación granular especificadas en los bloques <SSLInfo> en TargetEndpoint o en configuraciones de TargetServer.

Si SSLInfo.Enforce no es establecido, la aplicación SSL está determinada por cualquier valor especificado usando el elemento <Enforce> dentro de los bloques individuales <SSLInfo> . Para obtener más información, consulte la configuración TLS/SSL TargetEndpoint.

En el siguiente ejemplo, SSLInfo.Enforce se establece en true . En la salida resultante, puede ver que SSL se aplica en el entorno especificado.

VALUE=true
curl -Ss -v -X PUT \
    "https://apigee.googleapis.com/v1/organizations/MYORG/environments/MYENV" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer TOKEN" \
    -d '{
        "name": "MYENV",
        "properties": {
            "property": [{
                "name": "features.SSLInfo.Enforce",
                "value": "'"$VALUE"'"
            }]
        }
    }'
  

Producción:

{
  ...
  "properties": {
    "property": [
      {
        "name": "features.SSLInfo.Enforce",
        "value": "true"
      }
    ]
  },
  ...
}

Ejemplo de punto final de destino con autenticación de cliente saliente habilitado

<TargetEndpoint name="default">
  <HttpTargetConnection>
        <URL>https://myservice.com</URL>
    <SSLInfo>
      <Enabled>true</Enabled>
      <Enforce>true</Enforce>
      <ClientAuthEnabled>true</ClientAuthEnabled>
      <KeyStore>myKeystore</KeyStore>
      <KeyAlias>myKey</KeyAlias>
      <TrustStore>myTruststore</TrustStore>
    </SSLInfo>
  </HttpTargetConnection>
</TargetEndpoint>

Para obtener instrucciones detalladas, consulte Opciones para configurar TLS .

Uso de variables de flujo para establecer valores TLS/SSL dinámicamente

También puede establecer dinámicamente los detalles de TLS/SSL para admitir los requisitos de tiempo de ejecución flexibles. Por ejemplo, si su proxy se conecta a dos objetivos potencialmente diferentes (un objetivo de prueba y un objetivo de producción), puede hacer que su proxy API detecte programáticamente qué entorno está llamando y establece dinámicamente las referencias a la tienda de claves y la tienda de confianza apropiada. El SSLINFO dinámico para TargetEndpoint utilizando el artículo de la comunidad de Apigee de referencia variable explica este escenario con más detalle y proporciona ejemplos de proxy API desplegables.

In the following example of how the <SSLInfo> tag would be set in a TargetEndpoint configuration, the values can be supplied at runtime, for example, by a Java Callout, a JavaScript policy, or an AssignMessage policy . Use whichever message variables contain the values you want to set.

Variables are allowed in only the following elements.

<SSLInfo>
    <Enabled>{myvars.ssl.enabled}</Enabled>
    <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled>
    <KeyStore>{myvars.ssl.keystore}</KeyStore>
    <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias>
    <TrustStore>{myvars.ssl.trustStore}</TrustStore>
</SSLInfo>

Using references to set TLS/SSL values dynamically

When configuring a target endpoint that uses HTTPS, you have to consider the case when the TLS/SSL cert expires, or a change to the system configuration requires you to update the cert.

For more information, see Handling expired certificates .

However, you can optionally configure the target endpoint to use a reference to the keystore or truststore instead. The advantage to using a reference is that you can update the reference to point to a different keystore or truststore to update the TLS/SSL cert without having to restart Message Processors.

For example, shown below is a target endpoint that uses a reference to the keystore:

<SSLInfo>
  <Enabled>true</Enabled>
  <ClientAuthEnabled>false</ClientAuthEnabled>
  <KeyStore>ref://keystoreref</KeyStore>
  <KeyAlias>myKeyAlias</KeyAlias>
</SSLInfo>

Use the following POST API call to create the reference named keystoreref :

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references" \
  -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -d '<ResourceReference name="keystoreref">
    <Refers>myTestKeystore</Refers>
    <ResourceType>KeyStore</ResourceType>
</ResourceReference>'

Where $TOKEN is set to your OAuth 2.0 access token, as described in Obtaining an OAuth 2.0 access token . For information about the curl options used in this example, see Using curl . For a description of the environment variables used, see Setting environment variables for Apigee API requests .

The reference specifies the name of the keystore and its type.

Use the following GET API call to view the reference:

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -H "Authorization: Bearer $TOKEN"

Where $TOKEN is set to your OAuth 2.0 access token, as described in Obtaining an OAuth 2.0 access token . For information about the curl options used in this example, see Using curl . For a description of the environment variables used, see Setting environment variables for Apigee API requests .

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -H "Authorization: Bearer $TOKEN"

Where $TOKEN is set to your OAuth 2.0 access token, as described in Obtaining an OAuth 2.0 access token . For information about the curl options used in this example, see Using curl . For a description of the environment variables used, see Setting environment variables for Apigee API requests .

To later change the reference to point to a different keystore, ensuring that the alias has the same name, use the following PUT call:

curl "https://apigee.googleapis.com/v1/organizations/{org}/environments/{org}/references/keystoreref" \
  -X PUT \
  -H "Authorization: Bearer $TOKEN" \
  -d '<ResourceReference name="keystoreref">
    <Refers>myNewKeystore</Refers>
    <ResourceType>KeyStore</ResourceType>
  </ResourceReference>'

Where $TOKEN is set to your OAuth 2.0 access token, as described in Obtaining an OAuth 2.0 access token . For information about the curl options used in this example, see Using curl . For a description of the environment variables used, see Setting environment variables for Apigee API requests .

TargetEndpoint with target load balancing

Target endpoints support load balancing across multiple named target servers using three load balancing algorithms.

For detailed instructions, refer to Load balancing across backend servers .

IntegrationEndpoint

An IntegrationEndpoint is a target endpoint that specifically runs Apigee integrations . If you have configured an IntegrationEndpoint, Apigee sends the request object to Apigee's Integration Platform for execution. To run your integration, in addition to configuring the IntegrationEndpoint, you must also add the SetIntegrationRequest policy in your proxy flow.

You can configure your integration to execute either synchronously or asynchronously by setting the <AsyncExecution> element in the IntegrationEndpoint configuration. For more information, see Synchronous vs Asynchronous execution . After running the integration, Apigee saves the response in the response message .

Configuring IntegrationEndpoint

To configure an integration endpoint as your target endpoint, add the IntegrationEndpoint element to your ProxyEndpoint configuration. The following is a sample ProxyEndpoint configuration:

<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>my-set-integration-request-policy</Name>
            </Step>
        </Request>
    </PreFlow>
    <Flows/>
    <PostFlow name="PostFlow"/>
    <HTTPProxyConnection>
        <BasePath>/integration-endpoint-test</BasePath>
        <Properties/>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <IntegrationEndpoint>my-int-endpoint</IntegrationEndpoint>
    </RouteRule>
</ProxyEndpoint>

In the sample ProxyEndpoint configuration, Apigee performs the following tasks:

  1. In the PreFlow, executes the policy named my-set-integration-request-policy , which sets the integration request object and integration flow variables.
  2. Uses my-int-endpoint as the target endpoint, as specified in the RouteRule .
  3. Reads the integration request object created by the my-set-integration-request-policy .
  4. Sends the request to Apigee's Integration Platform using the request object and flow variables set by the SetIntegrationRequest policy.
  5. Saves the response of the integration in the response message.

The XML file containing the <IntegrationEndpoint> declaration will be available in the APIGEE_BUNDLE_DIRECTORY /apiproxy/integration-endpoints/ directory. If you create your API proxy using the Develop > API Proxies > CREATE NEW > Integration target option, Apigee stores the declaration in the /apiproxy/integration-endpoints/default.xml file. If you create the integration endpoint XML from the UI, you can provide a custom name for the XML file.

The following example shows the declaration of the <IntegrationEndpoint> element in the XML file:

<IntegrationEndpoint name="my-int-endpoint">
    <AsyncExecution>false</AsyncExecution>
</IntegrationEndpoint>

IntegrationEndpoint configuration elements

Nombre Descripción Por defecto ¿Requerido?
IntegrationEndpoint
name The name of the IntegrationEndpoint. The characters you can use in the name are restricted to: A-Za-z0-9._\-$ % N / A
AsyncExecution A Boolean value that specifies if the integration should run in synchronous or asynchronous mode. For more information, see Synchronous vs Asynchronous execution . FALSO No

Synchronous vs Asynchronous execution

You can configure the integration to run in either synchronous or asynchronous mode. To understand the difference between synchronous and asynchronous execution modes, see <AsyncExecution> .

Use the <AsyncExecution> element within the </IntegrationEndpoint> to specify synchronous or asynchronous execution. If you set <AsyncExecution> to true , the integration runs asynchronously. And if you set it to false , the integration runs synchronously.

The following example sets the AsyncExecution to true :

<IntegrationEndpoint name="my-int-endpoint">
    <AsyncExecution>true</AsyncExecution>
</IntegrationEndpoint>

Políticas

The /policies directory in an API proxy contains all policies available to be attached to Flows in the API proxy.

Policy configuration elements

Nombre Descripción Por defecto ¿Requerido?
Policy
name

The internal name of the policy. Characters you can use in the name are restricted to: A-Za-z0-9._\-$ % . However, the Apigee UI enforces additional restrictions, such as automatically removing characters that are not alphanumeric.

Optionally, use the <DisplayName> element to label the policy in the Apigee UI proxy editor with a different, natural-language name.

N / A
enabled

Establezca como true para aplicar la política.

Establézcalo como false para desactivar la política. Esta no se aplicará aunque permanezca asociada a un flujo.

true No
continueOnError

Establézcalo como false para devolver un error cuando una política falla. Este es el comportamiento esperado para la mayoría de las políticas.

Establezca como true para que la ejecución del flujo continúe incluso después de que falle una política.

false No
async

When set to true , policy execution is offloaded to a different thread, leaving the main thread free to handle additional requests. When the offline processing is complete, the main thread comes back and finishes handling the message flow. In some cases, setting async to true improves API proxy performance. However, overusing async can hurt performance with too much thread switching.

To use asynchronous behavior in API proxies, see JavaScript object model .

false No

Policy attachment

The following image shows the API proxy flows execution sequence:

shows a client calling an HTTP service. The request encounters the
  proxy endpoint and target endpoint, which each contain steps that trigger policies. After the
  HTTP service returns the response, the response is processed by the target endpoint and then the
  ProxyEndpoing before being returned to the client. As with the request, the response is processed
  by policies within steps.

Como se muestra arriba:

Policies are attached as processing steps to Flows . The policy's name is used to reference the policy to be enforced as a processing Step. The format of a policy attachment is the following:

<Step><Name>MyPolicy</Name></Step>

<Step><Name>FirstPolicy</Name></Step>
<Step><Name>SecondPolicy</Name></Step>

Policy attachment configuration elements

Nombre Descripción Por defecto ¿Requerido?
Step
Name The name of the policy to be executed by this Step definition. N / A
Condition A conditional statement that determines whether the policy is enforced or not. If a policy has an associated condition, then the policy only executes if the conditional statement evaluates to true. N / A No

Flujos

ProxyEndpoint and TargetEndpoint define a pipeline for request and response message processing. A processing pipeline consists of a request flow and a response flow. Each request flow and response flow is subdivided into a PreFlow, one or more optional conditional or named flows, and a PostFlow.

  • PreFlow: Always executes. Executes before any conditional Flows.
  • PostFlow: Always executes. Executes after any conditional Flows.

Additionally, you can add a PostClientFlow to the proxy endpoint, which executes after the response is returned to the requesting client app. Only the MessageLogging policy can be attached to this flow. PostClientFlow reduces API proxy latency and makes information available for logging that is not calculated until after the response is returned to the client, such as the client.sent.start.timestamp and client.sent.end.timestamp .The flow is used primarily for measuring the time interval between the start and end timestamps for the response message.

Here's an example of a PostClientFlow with a message logging policy attached.

...
  <PostFlow name="PostFlow">
      <Request/>
      <Response/>
  </PostFlow>
  <PostClientFlow>
      <Request/>
      <Response>
          <Step>
              <Name>Message-Logging-1</Name>
          </Step>
      </Response>
  </PostClientFlow>
  ...

The API proxy processing pipeline executes Flows in the following sequence:

Request Pipeline:

  1. Proxy Request PreFlow
  2. Proxy Request Conditional Flows (Optional)
  3. Proxy Request PostFlow
  4. Target Request PreFlow
  5. Target Request Conditional Flows (Optional)
  6. Target Request PostFlow

Response Pipeline:

  1. Target Response PreFlow
  2. Target Response Conditional Flows (Optional)
  3. Target Response PostFlow
  4. Proxy Response PreFlow
  5. Proxy Response Conditional Flows (Optional)
  6. Proxy Response PostFlow
  7. PostClientFlow Response (Optional)

Only those Flows with policy attachments need to be configured in ProxyEndpoint or TargetEndpoint configurations. PreFlow and PostFlow need only be specified in a ProxyEndpoint or TargetEndpoint configuration when a policy needs to be enforced during PreFlow or PostFlow processing.

In contrast to conditional flows, the ordering of PreFlow and PostFlow elements is not important--the API proxy will always execute each at the appropriate point in the pipeline, regardless of where they appear in the Endpoint configuration.

Flujos condicionales

Proxy endpoints and target endpoints support an unlimited number of conditional flows (also known as named flows ).

The API proxy tests for the condition specified in the conditional flow and, if the condition is met, the processing steps in the conditional flow are executed by the API proxy. If the condition is not met, then the processing steps in the conditional flow are bypassed. Conditional flows are evaluated in the order defined in the API proxy and the first one whose condition is met is executed.

By defining conditional flows, you gain the ability to apply processing steps in an API proxy based on:

  • URI de solicitud
  • HTTP verb ( GET / PUT / POST / DELETE )
  • Value of a query param, header, and form param
  • Many other types of conditions

For example, the following conditional flow specifies that it is executed only when the request resource path is /accesstoken . Any inbound request with the path /accesstoken causes this flow to be executed, along with any policies that are attached to the flow. If the request path does not include the suffix /accesstoken , then the flow does not execute (although another conditional flow might).

<Flows>
  <Flow name="TokenEndpoint">
    <Condition>proxy.pathsuffix MatchesPath "/accesstoken"</Condition>
    <Request>
      <Step>
        <Name>GenerateAccessToken</Name>
      </Step>
    </Request> 
  </Flow>
</Flows>   

Flow configuration elements

Nombre Descripción Por defecto ¿Requerido?
Flow A request or response processing pipeline defined by a proxy endpoint or target endpoint
Name The unique name of the Flow. N / A
Condition A conditional statement that evaluates one or more variables to evaluate to true or false. All Flows other than the predefined PreFlow and PostFlow types must define a condition for their execution. However, if you include a single flow without a condition at the end of a sequence of flows, it will act as the "Else" statement at the end of the sequence of flows. N / A
Request The pipeline associated with Request message processing N / A No
Response The pipeline associated with Response message processing N / A No

Step processing

The sequential ordering of conditional Flows is enforced by Apigee. Conditional Flows execute from top to bottom. The first conditional Flow whose condition evaluates to true is executed, and only one conditional Flow is executed.

For example, in the following Flow configuration, any inbound request that does not include the path suffix /first or /second will cause the ThirdFlow to execute, enforcing the policy called Return404 .

<Flows>
  <Flow name="FirstFlow">
    <Condition>proxy.pathsuffix MatchesPath "/first"</Condition>
    <Request>
      <Step><Name>FirstPolicy</Name></Step>
    </Request>
  </Flow>
  <Flow name="SecondFlow">
    <Condition>proxy.pathsuffix MatchesPath "/second"</Condition>
    <Request>
      <Step><Name>FirstPolicy</Name></Step>
      <Step><Name>SecondPolicy</Name></Step>
    </Request>
  </Flow>
  <Flow name="ThirdFlow">
    <Request>
      <Step><Name>Return404</Name></Step>
    </Request>
  </Flow>
</Flows>

Recursos

"Resources" (resource files for use in API proxies) are scripts, code, and XSL transformations that can be attached to Flows using policies. These appear in the Scripts section of the API proxy editor in the Apigee UI.

See Managing resources for the supported resource types.

Resources can be stored in an API proxy, an environment, or an organization. In each case, a resource is referenced by name in a Policy. Apigee resolves the name by moving from the API proxy, to environment, to organization level.

A resource stored at the organization level can be referenced by Policies in any environment. A resource stored at the environment level can be referenced by Policies in that environment. A resource stored at the API proxy level can be referenced only by Policies in that API proxy.