Cómo programar proxies de API con JavaScript

Estás viendo la documentación de Apigee Edge.
Ve a la Documentación de Apigee X.
información

En este tema, aprenderás a usar JavaScript para agregar de forma dinámica encabezados HTTP a un respuesta de JSON y cómo analizar una respuesta JSON y mostrar un subconjunto de sus propiedades al la app solicitante.

Descarga y prueba el código de muestra

Acerca de este ejemplo de libro de recetas

Este ejemplo de guía de soluciones ilustra un patrón de proxy de API en el que se implementa el comportamiento de la API en JavaScript: Los ejemplos de JavaScript están diseñados para mostrarte cómo trabajar con variables simples y el contenido de los mensajes. En una muestra, se indica cómo get y set las variables. El segundo te muestra cómo analizar JSON y construir un mensaje a partir del resultado.

Hay dos ejemplos de JavaScript en el proxy de API:

  • setHeaders.js: Este JavaScript obtiene los valores de algunas variables que se establecen cuando se invoca un proxy de API. JavaScript agrega esas variables a la respuesta de modo que pueda ver sus valores para cada solicitud que haga.
  • minimize.js: Este JavaScript te muestra cómo trabajar con los mensajes contenido. La idea detrás de esta muestra es que un servicio a menudo devuelve más datos que los necesario. Por lo tanto, JavaScript analiza el mensaje de respuesta y extrae y las usa para compilar el contenido del mensaje de respuesta.

El código para setHeader.js es el siguiente:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

El código para minimize.js es el siguiente:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

Puedes acceder a las variables de flujo en JavaScript a través del objeto de contexto. Este objeto forma parte de el modelo de objetos de Edge de JavaScript. Para obtener detalles sobre el modelo de objetos, consulta Modelo de objetos de JavaScript.

Antes de comenzar

Antes de explorar este ejemplo de libro de cocina, también deberías conocer conceptos:

  • Qué son las políticas y cómo adjuntarlas a los proxies Para una buena introducción a las políticas, consulta ¿Qué es un ?.
  • La estructura de un flujo de proxy, como se explica en Configura flujos. Los flujos te permiten especificar la secuencia en la que un proxy de API ejecuta las políticas En este ejemplo, varias y se agregan a un flujo de proxy de API.
  • Cómo se organiza un proyecto de proxy de API en tu sistema de archivos, como se explica en Referencia de configuración del proxy de la API.
  • Un conocimiento práctico de XML, JSON y JavaScript En este ejemplo, compilas la API y sus políticas con archivos en formato XML que residen en el sistema de archivos.

Si descargaste el código de muestra, puedes localizar todos los archivos mencionados en esta en la carpeta de muestra javascript-cookbook. En las siguientes secciones, se analizan el código de muestra en detalle.

Información sobre el flujo del proxy

Para que JavaScript se ejecute en un proxy de API, debes adjuntarlo a un flujo mediante una política. un archivo adjunto llamado 'Paso'. Una política de tipo JavaScript (nota en mayúsculas) simplemente contiene un referencia al nombre de un archivo JavaScript. Dirige la política a un archivo JavaScript con el comando ResourceURL.

Por ejemplo, la siguiente política hace referencia al archivo JavaScript llamado setHeader.js

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

Puedes adjuntar esta política a un flujo de proxy de API como lo harías con cualquier otro tipo de política. De adjuntas la política al flujo del proxy de API, indicas dónde se debe ejecutar JavaScript. Esto te permite ejecutar JavaScript que interactúe con mensajes de solicitud o de respuesta. ya que esos mensajes a través del proxy de API. En este ejemplo, ambos JavaScript se ejecutan en la de respuesta, ya que las políticas hacen dos cosas: establecer encabezados HTTP en el mensaje de respuesta y 'minimizar' el mensaje de respuesta que Apigee Edge muestra a la app solicitante.

Si abres esta configuración de flujo en la IU de administración, verás la configuración del flujo. a continuación.

Selecciona Extremos de proxy > predeterminado > PostFlow en el menú Navigator del panel.

La configuración XML correspondiente para el ProxyEndpoint llamado 'default' se muestra a continuación.

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Este es un resumen de los elementos del flujo.

  • &lt;Request&gt;: La <Request> consta de varios elementos &lt;Step&gt; o de terceros. Cada paso llama a una de las políticas que creas en el resto de este tema. Estas políticas adjuntan JavaScript al flujo del proxy de API, y la ubicación del El adjunto de política determina cuándo se ejecuta JavaScript.
  • &lt;Response&gt;: <Response> también incluye <Pasos>. Estos pasos también llaman a las políticas responsables de procesar respuesta del destino (que en este ejemplo es el objetivo del servicio simulado de Apigee). Observa la la configuración HTTPTargetConnection en /apiproxy/targets/default.xml).
  • &lt;HTTPProxyConnection&gt;: especifica el host y la ruta de URI que definir la dirección de red a la que llaman las apps para consumir esta API
  • &lt;RouteRule&gt;: este elemento especifica qué TargetEndpoint y la configuración de red la invoca el ProxyEndpoint.

Agrega código JavaScript a un proxy

JavaScript (como las secuencias de comandos de Python, los archivos JAR de Java, los archivos XSLT, etc.) se almacenan como recursos. Cuando recién comienzas a trabajar con JavaScript, es más fácil almacenar tu Archivos JavaScript en el proxy de API. A medida que avanzas, JavaScript debe ser genérico y reutilizables como sea posible y, luego, se almacenan a nivel del entorno o de la organización. Esto evita que tengas que almacenar los mismos archivos JavaScript en varios proxies de API, lo que pueden volverse inmanejables rápidamente.

Para obtener más información sobre el almacenamiento de recursos en el nivel de organización y entorno, consulta Archivos de recursos.

Probar

Para obtener instrucciones sobre cómo implementar y llamar al proxy, consulta la README de la guía de soluciones de JavaScript

Importación e implementación el proxy de API

Después de realizar cambios, puedes guardar el proxy de API en el compilador de proxy de API. en la IU de administración.

También puedes ejecutar el siguiente comando en el directorio /api-platform-samples/doc-samples/javascript-cookbook

$ sh deploy.sh

Prueba JavaScript

Ejecuta el siguiente comando en el directorio /api-platform-samples/doc-samples/javascript-cookbook

$ sh invoke.sh

La marca de curl -v se usa en la secuencia de comandos de shell para ver los encabezados HTTP en la respuesta mensaje modificado por JavaScript.

Puedes enviar una solicitud directamente de la siguiente manera:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

Si el código JavaScript se ejecuta de forma correcta, verás una respuesta como la que se muestra a continuación:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

Ahora puedes modificar JavaScript para probar cosas nuevas, volver a implementar el proxy de API y verificar resultados enviando la misma solicitud. Asegúrate siempre de implementar el proxy de API que contiene tu JavaScript para que se apliquen los cambios.

Errores de secuencias de comandos

Inevitablemente verás errores cuando escribas JavaScript. El formato de los errores de JavaScript que a través de un proxy de API, se muestra a continuación.

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

Cuándo usar JavaScript

En Apigee Edge, suele haber más de una forma de implementar una funcionalidad específica. Usa y listas para usar, siempre que sea posible, y evita la tentación de codificar lógica en JavaScript. Aunque Apigee Edge aprovecha JavaScript compilado para mejorar rendimiento, es poco probable que JavaScript funcione tan bien como el de las políticas. Es posible que JavaScript sea sean más difíciles de mantener y depurar. Reserve JavaScript para funcionalidades exclusivas de su y los requisitos de cumplimiento.

Si el rendimiento es un problema de la funcionalidad personalizada, usa Java siempre que sea posible.

Resumen

En este tema de la guía de soluciones, aprendiste cómo se puede incluir JavaScript en un proxy de API. de Terraform para implementar un comportamiento personalizado. El comportamiento personalizado que implementan las muestras demostrar cómo obtener y variables, y cómo analizar JSON y construir una respuesta personalizada mensajes nuevos.