Modelo de objetos de JavaScript

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

Ver la documentación de Apigee Edge .

Este tema trata sobre el modelo de objetos JavaScript de Apigee. Es importante comprender este modelo si se pretende usar la política JavaScript para agregar JavaScript personalizado a un proxy de API.

Acerca del modelo de objetos de JavaScript

El modelo de objetos de JavaScript define objetos con propiedades asociadas disponibles para el código JavaScript que se ejecuta dentro de un flujo de proxy de Apigee. Utilice la política de JavaScript para asociar este código personalizado a un flujo de proxy de API.

Los objetos definidos por este modelo tienen alcance dentro del flujo del proxy de la API, lo que significa que ciertos objetos y propiedades solo están disponibles en puntos específicos del flujo. Al ejecutar JavaScript, se crea un alcance para la ejecución. En ese alcance, se crean las siguientes referencias a objetos:

  • contexto : Un objeto que proporciona acceso al contexto del mensaje
  • solicitud : una abreviatura que permite acceder al objeto de solicitud
  • respuesta : una abreviatura que permite acceder al objeto de respuesta
  • crypto : Proporciona varias funciones hash
  • imprimir : Una función para emitir salida
  • Propiedades : Permite acceso de lectura a las propiedades de configuración de la política.

El objeto de contexto

El objeto context tiene alcance global. Está disponible en cualquier parte del flujo de proxy de la API. Tiene cuatro objetos secundarios: proxyRequest , proxyResponse , targetRequest y targetResponse . Estos objetos secundarios se limitan a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Por ejemplo, si la política de JavaScript se ejecuta en la parte del punto final del proxy del flujo, los objetos context.proxyRequest y context.proxyResponse estarán dentro del alcance. Si el JavaScript se ejecuta en un flujo de destino, los objetos context.targetRequest y context.targetResponse estarán dentro del alcance.

El objeto context también tiene propiedades y métodos, que se describen en detalle en este tema. Por ejemplo, el siguiente ejemplo de código JavaScript utiliza la propiedad context.flow e invoca los métodos get/setVariable() en context .

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

Estos métodos interactúan directamente con las variables de flujo . El valor de la propiedad context.flow corresponde al ámbito del flujo actual. En el flujo de solicitud de proxy, se establece en la constante PROXY_REQ_FLOW . En el flujo de respuesta de destino, se establece en TARGET_RESP_FLOW . Esta constante es útil para ejecutar código específico del ámbito. El getter permite obtener variables de flujo y el setter permite configurarlas. Estas variables suelen estar disponibles en el flujo de proxy y pueden ser utilizadas por otras políticas.

Consulte la referencia del objeto de contexto para obtener más detalles y ejemplos.

El objeto criptográfico

El objeto criptográfico añade compatibilidad criptográfica básica de alto rendimiento al modelo de objetos de JavaScript. Consulte la referencia de objetos criptográficos para obtener más detalles y ejemplos.

Los objetos de solicitud y respuesta

Los objetos request y response son referencias abreviadas a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Los objetos a los que hacen referencia estas variables dependen del contexto en el que se ejecuta la política de JavaScript. Si el JavaScript se ejecuta en el flujo de un endpoint de proxy, las variables de solicitud y respuesta hacen referencia a context.proxyRequest y context.proxyResponse . Si el JavaScript se ejecuta en un flujo de destino, las variables hacen referencia a context.targetRequest y context.targetResponse .

El modelo de objetos de JavaScript incluye la función print() que permite enviar información de depuración a la herramienta de depuración de Apigee. Consulte Depuración con sentencias print() de JavaScript .

El objeto de propiedades

Al utilizar un elemento Properties en la configuración de la política, el código JavaScript puede acceder a los valores de esas propiedades mediante la variable properties .

Por ejemplo, si su configuración de JavaScript contiene:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

Luego, en my-code.js , puedes:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

En términos más prácticos, la configuración puede permitir que el código se comporte de manera diferente cuando se ejecuta en diferentes entornos, en diferentes momentos o por cualquier motivo.

Por ejemplo, lo siguiente especifica el "nombre de la variable" y el estilo de salida en el que JavaScript debe emitir información:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
Luego, en emit-results.js , el código podría hacer esto:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

referencia de objeto criptográfico

El objeto crypto le permite realizar funciones hash criptográficas básicas en JavaScript.

El objeto criptográfico tiene alcance global. Está disponible en cualquier punto del flujo del proxy de la API. Crypto permite trabajar con estos objetos hash:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

Trabajar con objetos SHA-1

Puede crear objetos SHA-1, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-1

var _sha1 = crypto.getSHA1();

Actualizar un objeto SHA-1

Sintaxis

_sha1.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

Devuelve el objeto SHA-1 como una cadena hexadecimal

var _hashed_token = _sha1.digest();

Devuelve el objeto SHA-1 como una cadena base64

var _hashed_token = _sha1.digest64();

Trabajar con objetos SHA-256

Puede crear objetos SHA-256, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-256

var _sha256 = crypto.getSHA256();

Actualizar un objeto SHA-256

Sintaxis

_sha256.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

Devuelve el objeto SHA-256 como una cadena hexadecimal

var _hashed_token = _sha256.digest();

Devuelve el objeto SHA-256 como una cadena base64

var _hashed_token = _sha256.digest64();

Trabajar con objetos SHA-512

Puede crear objetos SHA-512, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-512

var _sha512 = crypto.getSHA512();

Actualizar un objeto SHA-512

Sintaxis

_sha512.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-512:

_sha512.update("salt_value");

_sha512.update("some text");

Devuelve el objeto SHA-512 como una cadena hexadecimal

var _hashed_token = _sha512.digest();

Devuelve el objeto SHA-512 como una cadena base64

var _hashed_token = _sha512.digest64();

Trabajar con objetos MD5

Puede crear objetos MD5, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto MD5

var _md5 = crypto.getMD5();

Actualizar un objeto MD5

Sintaxis

_md5.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto MD5:

_md5.update("salt_value");

_md5.update("some text");

Devuelve el objeto MD5 como una cadena hexadecimal

var _hashed_token = _md5.digest();

Devuelve el objeto MD5 como una cadena base64

var _hashed_token = _md5.digest64();

Compatibilidad con fecha y hora de criptomonedas

El objeto criptográfico admite patrones de formato de fecha y hora.

cripto.dateFormat()

Devuelve una fecha en formato de cadena.

Sintaxis

crypto.dateFormat(format, [timezone], [time])

Parámetros

  • Formato - (Cadena) La implementación subyacente de este parámetro es java.text.SimpleDateFormat . Por ejemplo: 'AAAA-MM-DD HH:mm:ss.SSS'
  • Zona horaria : (Cadena, opcional). La implementación subyacente de este parámetro es java.util.TimeZone . Este parámetro tiene el mismo valor predeterminado: UTC.
  • hora - (Número, opcional) Un valor de marca de tiempo Unix para formatear. Predeterminado: hora actual

Ejemplos

Obtenga la hora actual, en milisegundos:

var _now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS');

Obtenga la hora actual para la zona horaria del Pacífico:

var _pst = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST');

Obtenga el valor de diez segundos a partir de ahora:

var _timeNow = Number(context.getVariable('system.timestamp'));
var tenSeconds = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

Ejemplos adicionales. Consulte también la documentación de java.text.SimpleDateFormat .

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

Utilice getHash() para obtener cualquiera de los objetos hash admitidos

Ejemplos

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

Muestra con cripto

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashedToken = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashedToken);

    // convert to base64
    var base64Token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64Token);

} catch(e) {
    throw 'Error in Javascript';
}

referencia de objeto de contexto

Se crea un objeto context para cada transacción de solicitud/respuesta ejecutada por un proxy de API. Este context expone métodos para obtener, establecer y eliminar variables relacionadas con cada transacción.

Las variables definen propiedades específicas de una transacción. La hora del día, la configuración regional del cliente solicitante, el agente de usuario del cliente solicitante y la URL del servicio de destino son ejemplos de variables disponibles en el context . Por lo tanto, context es útil para crear lógica basada en estas propiedades para ejecutar comportamientos personalizados.

Consulte Referencia de variables de flujo y Política de extracción de variables .

resumen del objeto de contexto

Esta tabla describe brevemente el objeto de contexto y sus hijos, y enumera las propiedades que están vinculadas a cada uno.

Nombre Descripción Propiedades
context Un contenedor para el contexto del canal de procesamiento de mensajes y los flujos de solicitud y respuesta que ejecutan ProxyEndpoint y TargetEndpoint. flujo, sesión
context. proxyRequest Un objeto que representa el mensaje de solicitud entrante al ProxyEndpoint (desde la aplicación solicitante al proxy de API) encabezados, parámetros de consulta, método, cuerpo, URL
context. targetRequest Un objeto que representa el mensaje de solicitud saliente desde TargetEndpoint (desde el proxy de API al servicio backend). encabezados, parámetros de consulta, método, cuerpo, URL
context. targetResponse Un objeto que representa el mensaje de respuesta de destino entrante (desde el servicio backend al proxy API) encabezados, contenido, estado
context. proxyResponse Un objeto que representa el mensaje de respuesta del proxy saliente (desde el proxy de API a la aplicación solicitante) encabezados, contenido, estado
context.flow El nombre del flujo actual. Ver context.flow .
context.session Un mapa de pares nombre-valor que permite transferir objetos entre dos pasos diferentes que se ejecutan en el mismo contexto. Por ejemplo: context.session['key'] = 123 . Para obtener más información sobre cuándo utilizar este objeto y cuándo no, consulte ¿Cuál es la diferencia entre context.session['hello'] = {} y context.setVariable("hello", {}) ?

métodos de objeto de contexto

contexto.getVariable()

Recupera el valor de una variable predefinida o personalizada.

Sintaxis

context.getVariable("variable-name");

Ejemplo

Para obtener el valor del año actual:

var year = context.getVariable('system.time.year');

contexto.setVariable()

Establece el valor de una variable personalizada o de cualquier variable predefinida que se pueda escribir .

Sintaxis

context.setVariable("variable-name", value);

Ejemplo

Un escenario común para configurar una variable es cuando un proxy de API debe escribir dinámicamente la URL de destino. El siguiente código JavaScript obtiene el valor de una variable llamada USER.name , lo añade como parámetro de consulta a la URL http://mocktarget.apigee.net?user= y, a continuación, asigna ese valor a la URL predefinida target.url .

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

contexto.removeVariable()

Elimina una variable del contexto.

Sintaxis

context.removeVariable('variable-name');

propiedades del objeto de contexto

contexto.flujo

La propiedad flow es una cadena que identifica el flujo del proxy de API actual. Esta propiedad se utiliza para indicar el flujo al que está asociado el JavaScript. Los valores admitidos son:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

Cada nombre de flujo abarca el PreFlow, PostFlow y cualquier flujo condicional definido en los ProxyEndpoint(s) o TargetEndpoint(s).

Esta propiedad opcional es útil cuando se ejecuta JavaScript común en más de un flujo, pero su comportamiento puede variar según el flujo en el que se ejecute. Use la propiedad Flow para módulos JavaScript que se reutilizarán en múltiples proxies de API, donde el código debe verificar el flujo actual antes de ejecutar la lógica.

Ejemplo

Establezca un encabezado HTTP solo en el flujo targetRequest:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

Establezca el contenido solo en el flujo proxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

contexto.sesión

Un mapa de pares nombre/valor que se puede utilizar para pasar objetos entre dos políticas que se ejecutan dentro del mismo contexto de mensaje.

Ejemplo

Establecer un valor en la sesión:

context.session['key']  = 123;

Obtenga el valor de la sesión:

var value = context.session['key']; // 123

objeto de contexto hijos

Como se muestra a continuación, un flujo de proxy de API completo abarca cuatro fases distintas, cada una de las cuales tiene un objeto de mensaje asociado que es un elemento secundario del objeto de contexto:

  • context.proxyRequest : el mensaje de solicitud entrante recibido del cliente solicitante.
  • context.targetRequest : el mensaje de solicitud saliente enviado al servicio backend.
  • context.proxyResponse : el mensaje de respuesta saliente devuelto al cliente solicitante.
  • context.targetResponse : el mensaje de solicitud entrante recibido del servicio backend.

Diagrama de una solicitud y una respuesta que pasan a través de un punto final de proxy y un punto final de destino.

Las siguientes secciones describen los métodos y propiedades de estos objetos:

contexto.*Solicitar objetos secundarios

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de solicitud: uno entrante (la solicitud del cliente) y uno saliente (la solicitud generada por el proxy API y enviada al destino backend).

El objeto context tiene objetos secundarios que representan estos mensajes de solicitud: context.proxyRequest y context.targetRequest . Estos objetos permiten acceder a las propiedades dentro del flujo de solicitud que está dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Solicitar propiedades de objeto secundario

Nombre de la propiedad Descripción
url

La propiedad url es una propiedad de conveniencia de lectura y escritura que combina parámetros de esquema, host, puerto, ruta y consulta para targetRequest.

La URL completa de la solicitud se compone de las siguientes propiedades:

  • protocolo: El protocolo de la URL (por ejemplo, HTTP, HTTPS)
  • puerto: El puerto (por ejemplo, :80, :443)
  • host: El host de la URL (por ejemplo, www.ejemplo.com)
  • ruta: La ruta de la URI (por ejemplo, /v1/mocktarget)

Al obtener url , se devuelve una URL en el siguiente formato:

protocol://host:port/path?queryParams

Ejemplos:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Encabezados de solicitud HTTP como una asignación de String => List

Ejemplos:

Para esta solicitud HTTP:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
El siguiente JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

devolverá los siguientes valores

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Los parámetros de consulta del mensaje de solicitud como una asignación de String => List .

Ejemplos:

"?city=PaloAlto&city=NewYork"

Se puede acceder como:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

El verbo HTTP (GET, POST, PUT, DELETE, PATCH, etc.) asociado con la solicitud

Ejemplos:

Para esta solicitud:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

El siguiente JavaScript:

context.proxyRequest.method;

devolverá el siguiente valor

POST
body

El cuerpo del mensaje (carga útil) de la solicitud HTTP.

El cuerpo de la solicitud tiene los siguientes miembros:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Ejemplos:

Para un cuerpo XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

Para acceder a los elementos del objeto XML de la siguiente manera:

var name = context.targetRequest.body.asXML.name;

Para acceder a los atributos XML, utilice la notación @ .

var number = context.targetRequest.body.asXML.@number;

Para un cuerpo de solicitud JSON:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

Para leer los parámetros del formulario:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

Contexto.*Objetos secundarios de respuesta

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de respuesta: uno entrante (la respuesta del servicio backend) y uno saliente (la respuesta enviada de vuelta al cliente).

El objeto de contexto tiene objetos secundarios que representan estos mensajes de respuesta: context.proxyResponse y context.targetResponse . Estos objetos permiten acceder a las propiedades dentro del flujo de respuesta que se encuentra dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Propiedades del objeto de respuesta

Nombre de la propiedad Descripción
headers

Los encabezados HTTP del mensaje de respuesta como una asignación de String => List .

Ejemplo:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

El código de estado con mensaje de estado como propiedad. Tanto el código de estado como el mensaje de estado están disponibles como propiedades.

Ejemplo:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

El cuerpo HTTP (contenido de la carga útil) del mensaje de respuesta.

El contenido de la respuesta tiene los siguientes miembros:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

Uso de la notación .asXML

Existe una forma práctica de navegar por un documento XML usando la notación .asXML . Esta sección describe cómo usar esta notación y en qué se diferencia de request.content y context.proxyRequest.content .

Por ejemplo:

request.content.asXML

o

context.proxyRequest.content.asXML

Tanto el formato *.content como *.content.asXML se pueden usar en un contexto de cadena, y JavaScript los convertirá en cadenas. En el primer caso ( *.content ), la cadena incluye todas las declaraciones y los comentarios XML. En el segundo caso ( *.content.asXML ), el valor de cadena del resultado se limpia de declaraciones y comentarios.

Ejemplo

contenido del mensaje:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

Además, puede usar el formato .asXML para recorrer la jerarquía XML, especificando los nombres de los elementos y atributos. No es posible recorrer la jerarquía con la otra sintaxis.

Depuración con sentencias print() de JavaScript

Si usa la política de JavaScript para ejecutar código JavaScript personalizado, tenga en cuenta que puede usar la función print() para enviar información de depuración a la herramienta de depuración . Esta función está disponible directamente a través del modelo de objetos de JavaScript. Por ejemplo:

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("Callout to URL: ", context.getVariable("target.url"));
}

Para ver el resultado, seleccione "Resultado de todas las transacciones" en la parte inferior de la ventana de depuración. También puede encontrar el resultado en la propiedad de depuración llamada stepExecution-stdout .

Realizar llamadas de JavaScript con httpClient

Utilice httpClient para realizar múltiples solicitudes HTTP asíncronas paralelas a cualquier URL desde código JavaScript personalizado que se ejecuta en un flujo de proxy de API. El objeto httpClient está expuesto por el modelo de objetos de Javascript de Apigee .

Acerca de httpClient

El objeto httpClient se expone a código JavaScript personalizado que se ejecuta en Apigee a través del modelo de objetos JavaScript. Para asociar JavaScript personalizado a un proxy de API, se utiliza la política JavaScript . Cuando se ejecuta la política, se ejecuta el código JavaScript personalizado.

El objeto httpClient es útil para desarrollar servicios compuestos o mashups. Por ejemplo, permite consolidar varias llamadas de backend en un único método de API.

Aquí tienes un patrón de uso básico: crea una instancia de un objeto de solicitud, asígnale una URL (por ejemplo, a un servicio de backend al que deseas llamar) y llama a httpClient.send con ese objeto de solicitud.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

Referencia de httpClient

El cliente HTTP expone dos métodos: get() y send() .

httpClient.get()

Un método conveniente para solicitudes HTTP GET simples, sin soporte para encabezados HTTP.

Uso

var exchangeObj = httpClient.get(url);

Devoluciones

El método devuelve un objeto exchange . Este objeto no tiene propiedades y expone los siguientes métodos:

  • isError() : (Booleano) Devuelve true si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP 4xx y 5xx resultan en isError() false , ya que la conexión se completó y se devolvió un código de respuesta válido. Si isError() devuelve true , una llamada a getResponse() devuelve el código JavaScript undefined .
  • isSuccess() : (Booleano) Devuelve true si el envío se completó y fue exitoso.
  • isComplete() : (booleano) Devuelve true si la solicitud está completa.
  • waitForComplete() : Pausa el hilo hasta que se complete la solicitud (por éxito o error).
  • getResponse() : (objeto) Devuelve el objeto de respuesta si la httpClient.send() se completó correctamente. El objeto devuelto tiene los mismos métodos y propiedades que el objeto context.proxyResponse. Consulte el resumen del objeto context .
  • getError() : (cadena) Si la llamada a httpClient.send() generó un error, devuelve el mensaje de error como una cadena.

Ejemplo

Envíe un objeto de solicitud completamente configurado que contenga las propiedades de la solicitud HTTP. Utilice una devolución de llamada no bloqueante para procesar la respuesta.

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

Uso de la política de JavaScript

Utilice la política de JavaScript para adjuntar código JavaScript personalizado a un flujo de proxy. Consulte la política de JavaScript .

Temas relacionados

,

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

Ver la documentación de Apigee Edge .

Este tema trata sobre el modelo de objetos JavaScript de Apigee. Es importante comprender este modelo si se pretende usar la política JavaScript para agregar JavaScript personalizado a un proxy de API.

Acerca del modelo de objetos de JavaScript

El modelo de objetos de JavaScript define objetos con propiedades asociadas disponibles para el código JavaScript que se ejecuta dentro de un flujo de proxy de Apigee. Utilice la política de JavaScript para asociar este código personalizado a un flujo de proxy de API.

Los objetos definidos por este modelo tienen alcance dentro del flujo del proxy de la API, lo que significa que ciertos objetos y propiedades solo están disponibles en puntos específicos del flujo. Al ejecutar JavaScript, se crea un alcance para la ejecución. En ese alcance, se crean las siguientes referencias a objetos:

  • contexto : Un objeto que proporciona acceso al contexto del mensaje
  • solicitud : una abreviatura que permite acceder al objeto de solicitud
  • respuesta : una abreviatura que permite acceder al objeto de respuesta
  • crypto : Proporciona varias funciones hash
  • imprimir : Una función para emitir salida
  • Propiedades : Permite acceso de lectura a las propiedades de configuración de la política.

El objeto de contexto

El objeto context tiene alcance global. Está disponible en cualquier parte del flujo de proxy de la API. Tiene cuatro objetos secundarios: proxyRequest , proxyResponse , targetRequest y targetResponse . Estos objetos secundarios se limitan a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Por ejemplo, si la política de JavaScript se ejecuta en la parte del punto final del proxy del flujo, los objetos context.proxyRequest y context.proxyResponse estarán dentro del alcance. Si el JavaScript se ejecuta en un flujo de destino, los objetos context.targetRequest y context.targetResponse estarán dentro del alcance.

El objeto context también tiene propiedades y métodos, que se describen en detalle en este tema. Por ejemplo, el siguiente ejemplo de código JavaScript utiliza la propiedad context.flow e invoca los métodos get/setVariable() en context .

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

Estos métodos interactúan directamente con las variables de flujo . El valor de la propiedad context.flow corresponde al ámbito del flujo actual. En el flujo de solicitud de proxy, se establece en la constante PROXY_REQ_FLOW . En el flujo de respuesta de destino, se establece en TARGET_RESP_FLOW . Esta constante es útil para ejecutar código específico del ámbito. El getter permite obtener variables de flujo y el setter permite configurarlas. Estas variables suelen estar disponibles en el flujo de proxy y pueden ser utilizadas por otras políticas.

Consulte la referencia del objeto de contexto para obtener más detalles y ejemplos.

El objeto criptográfico

El objeto criptográfico añade compatibilidad criptográfica básica de alto rendimiento al modelo de objetos de JavaScript. Consulte la referencia de objetos criptográficos para obtener más detalles y ejemplos.

Los objetos de solicitud y respuesta

Los objetos request y response son referencias abreviadas a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Los objetos a los que hacen referencia estas variables dependen del contexto en el que se ejecuta la política de JavaScript. Si el JavaScript se ejecuta en el flujo de un endpoint de proxy, las variables de solicitud y respuesta hacen referencia a context.proxyRequest y context.proxyResponse . Si el JavaScript se ejecuta en un flujo de destino, las variables hacen referencia a context.targetRequest y context.targetResponse .

El modelo de objetos de JavaScript incluye la función print() que permite enviar información de depuración a la herramienta de depuración de Apigee. Consulte Depuración con sentencias print() de JavaScript .

El objeto de propiedades

Al utilizar un elemento Properties en la configuración de la política, el código JavaScript puede acceder a los valores de esas propiedades mediante la variable properties .

Por ejemplo, si su configuración de JavaScript contiene:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

Luego, en my-code.js , puedes:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

En términos más prácticos, la configuración puede permitir que el código se comporte de manera diferente cuando se ejecuta en diferentes entornos, en diferentes momentos o por cualquier motivo.

Por ejemplo, lo siguiente especifica el "nombre de la variable" y el estilo de salida en el que JavaScript debe emitir información:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
Luego, en emit-results.js , el código podría hacer esto:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

referencia de objeto criptográfico

El objeto crypto le permite realizar funciones hash criptográficas básicas en JavaScript.

El objeto criptográfico tiene alcance global. Está disponible en cualquier punto del flujo del proxy de la API. Crypto permite trabajar con estos objetos hash:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

Trabajar con objetos SHA-1

Puede crear objetos SHA-1, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-1

var _sha1 = crypto.getSHA1();

Actualizar un objeto SHA-1

Sintaxis

_sha1.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

Devuelve el objeto SHA-1 como una cadena hexadecimal

var _hashed_token = _sha1.digest();

Devuelve el objeto SHA-1 como una cadena base64

var _hashed_token = _sha1.digest64();

Trabajar con objetos SHA-256

Puede crear objetos SHA-256, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-256

var _sha256 = crypto.getSHA256();

Actualizar un objeto SHA-256

Sintaxis

_sha256.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

Devuelve el objeto SHA-256 como una cadena hexadecimal

var _hashed_token = _sha256.digest();

Devuelve el objeto SHA-256 como una cadena base64

var _hashed_token = _sha256.digest64();

Trabajar con objetos SHA-512

Puede crear objetos SHA-512, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-512

var _sha512 = crypto.getSHA512();

Actualizar un objeto SHA-512

Sintaxis

_sha512.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-512:

_sha512.update("salt_value");

_sha512.update("some text");

Devuelve el objeto SHA-512 como una cadena hexadecimal

var _hashed_token = _sha512.digest();

Devuelve el objeto SHA-512 como una cadena base64

var _hashed_token = _sha512.digest64();

Trabajar con objetos MD5

Puede crear objetos MD5, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto MD5

var _md5 = crypto.getMD5();

Actualizar un objeto MD5

Sintaxis

_md5.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto MD5:

_md5.update("salt_value");

_md5.update("some text");

Devuelve el objeto MD5 como una cadena hexadecimal

var _hashed_token = _md5.digest();

Devuelve el objeto MD5 como una cadena base64

var _hashed_token = _md5.digest64();

Compatibilidad con fecha y hora de criptomonedas

El objeto criptográfico admite patrones de formato de fecha y hora.

cripto.dateFormat()

Devuelve una fecha en formato de cadena.

Sintaxis

crypto.dateFormat(format, [timezone], [time])

Parámetros

  • Formato - (Cadena) La implementación subyacente de este parámetro es java.text.SimpleDateFormat . Por ejemplo: 'AAAA-MM-DD HH:mm:ss.SSS'
  • Zona horaria : (Cadena, opcional). La implementación subyacente de este parámetro es java.util.TimeZone . Este parámetro tiene el mismo valor predeterminado: UTC.
  • hora - (Número, opcional) Un valor de marca de tiempo Unix para formatear. Predeterminado: hora actual

Ejemplos

Obtenga la hora actual, en milisegundos:

var _now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS');

Obtenga la hora actual para la zona horaria del Pacífico:

var _pst = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST');

Obtenga el valor de diez segundos a partir de ahora:

var _timeNow = Number(context.getVariable('system.timestamp'));
var tenSeconds = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

Ejemplos adicionales. Consulte también la documentación de java.text.SimpleDateFormat .

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

Utilice getHash() para obtener cualquiera de los objetos hash admitidos

Ejemplos

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

Muestra con cripto

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashedToken = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashedToken);

    // convert to base64
    var base64Token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64Token);

} catch(e) {
    throw 'Error in Javascript';
}

referencia de objeto de contexto

Se crea un objeto context para cada transacción de solicitud/respuesta ejecutada por un proxy de API. Este context expone métodos para obtener, establecer y eliminar variables relacionadas con cada transacción.

Las variables definen propiedades específicas de una transacción. La hora del día, la configuración regional del cliente solicitante, el agente de usuario del cliente solicitante y la URL del servicio de destino son ejemplos de variables disponibles en el context . Por lo tanto, context es útil para crear lógica basada en estas propiedades para ejecutar comportamientos personalizados.

Consulte Referencia de variables de flujo y Política de extracción de variables .

resumen del objeto de contexto

Esta tabla describe brevemente el objeto de contexto y sus hijos, y enumera las propiedades que están vinculadas a cada uno.

Nombre Descripción Propiedades
context Un contenedor para el contexto del canal de procesamiento de mensajes y los flujos de solicitud y respuesta que ejecutan ProxyEndpoint y TargetEndpoint. flujo, sesión
context. proxyRequest Un objeto que representa el mensaje de solicitud entrante al ProxyEndpoint (desde la aplicación solicitante al proxy de API) encabezados, parámetros de consulta, método, cuerpo, URL
context. targetRequest Un objeto que representa el mensaje de solicitud saliente desde TargetEndpoint (desde el proxy de API al servicio backend). encabezados, parámetros de consulta, método, cuerpo, URL
context. targetResponse Un objeto que representa el mensaje de respuesta de destino entrante (desde el servicio backend al proxy API) encabezados, contenido, estado
context. proxyResponse Un objeto que representa el mensaje de respuesta del proxy saliente (desde el proxy de API a la aplicación solicitante) encabezados, contenido, estado
context.flow El nombre del flujo actual. Ver context.flow .
context.session Un mapa de pares nombre-valor que permite transferir objetos entre dos pasos diferentes que se ejecutan en el mismo contexto. Por ejemplo: context.session['key'] = 123 . Para obtener más información sobre cuándo utilizar este objeto y cuándo no, consulte ¿Cuál es la diferencia entre context.session['hello'] = {} y context.setVariable("hello", {}) ?

métodos de objeto de contexto

contexto.getVariable()

Recupera el valor de una variable predefinida o personalizada.

Sintaxis

context.getVariable("variable-name");

Ejemplo

Para obtener el valor del año actual:

var year = context.getVariable('system.time.year');

contexto.setVariable()

Establece el valor de una variable personalizada o de cualquier variable predefinida que se pueda escribir .

Sintaxis

context.setVariable("variable-name", value);

Ejemplo

Un escenario común para configurar una variable es cuando un proxy de API debe escribir dinámicamente la URL de destino. El siguiente código JavaScript obtiene el valor de una variable llamada USER.name , lo añade como parámetro de consulta a la URL http://mocktarget.apigee.net?user= y, a continuación, asigna ese valor a la URL predefinida target.url .

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

contexto.removeVariable()

Elimina una variable del contexto.

Sintaxis

context.removeVariable('variable-name');

propiedades del objeto de contexto

contexto.flujo

La propiedad flow es una cadena que identifica el flujo del proxy de API actual. Esta propiedad se utiliza para indicar el flujo al que está asociado el JavaScript. Los valores admitidos son:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

Cada nombre de flujo abarca el PreFlow, PostFlow y cualquier flujo condicional definido en los ProxyEndpoint(s) o TargetEndpoint(s).

Esta propiedad opcional es útil cuando se ejecuta JavaScript común en más de un flujo, pero su comportamiento puede variar según el flujo en el que se ejecute. Use la propiedad Flow para módulos JavaScript que se reutilizarán en múltiples proxies de API, donde el código debe verificar el flujo actual antes de ejecutar la lógica.

Ejemplo

Establezca un encabezado HTTP solo en el flujo targetRequest:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

Establezca el contenido solo en el flujo proxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

contexto.sesión

Un mapa de pares nombre/valor que se puede utilizar para pasar objetos entre dos políticas que se ejecutan dentro del mismo contexto de mensaje.

Ejemplo

Establecer un valor en la sesión:

context.session['key']  = 123;

Obtenga el valor de la sesión:

var value = context.session['key']; // 123

objeto de contexto hijos

Como se muestra a continuación, un flujo de proxy de API completo abarca cuatro fases distintas, cada una de las cuales tiene un objeto de mensaje asociado que es un elemento secundario del objeto de contexto:

  • context.proxyRequest : el mensaje de solicitud entrante recibido del cliente solicitante.
  • context.targetRequest : el mensaje de solicitud saliente enviado al servicio backend.
  • context.proxyResponse : el mensaje de respuesta saliente devuelto al cliente solicitante.
  • context.targetResponse : el mensaje de solicitud entrante recibido del servicio backend.

Diagrama de una solicitud y una respuesta que pasan a través de un punto final de proxy y un punto final de destino.

Las siguientes secciones describen los métodos y propiedades de estos objetos:

contexto.*Solicitar objetos secundarios

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de solicitud: uno entrante (la solicitud del cliente) y uno saliente (la solicitud generada por el proxy API y enviada al destino backend).

El objeto context tiene objetos secundarios que representan estos mensajes de solicitud: context.proxyRequest y context.targetRequest . Estos objetos permiten acceder a las propiedades dentro del flujo de solicitud que está dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Solicitar propiedades de objeto secundario

Nombre de la propiedad Descripción
url

La propiedad url es una propiedad de conveniencia de lectura y escritura que combina parámetros de esquema, host, puerto, ruta y consulta para targetRequest.

La URL completa de la solicitud se compone de las siguientes propiedades:

  • protocolo: El protocolo de la URL (por ejemplo, HTTP, HTTPS)
  • puerto: El puerto (por ejemplo, :80, :443)
  • host: El host de la URL (por ejemplo, www.ejemplo.com)
  • ruta: La ruta de la URI (por ejemplo, /v1/mocktarget)

Al obtener url , se devuelve una URL en el siguiente formato:

protocol://host:port/path?queryParams

Ejemplos:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Encabezados de solicitud HTTP como una asignación de String => List

Ejemplos:

Para esta solicitud HTTP:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
El siguiente JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

devolverá los siguientes valores

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Los parámetros de consulta del mensaje de solicitud como una asignación de String => List .

Ejemplos:

"?city=PaloAlto&city=NewYork"

Se puede acceder como:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

El verbo HTTP (GET, POST, PUT, DELETE, PATCH, etc.) asociado con la solicitud

Ejemplos:

Para esta solicitud:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

El siguiente JavaScript:

context.proxyRequest.method;

devolverá el siguiente valor

POST
body

El cuerpo del mensaje (carga útil) de la solicitud HTTP.

El cuerpo de la solicitud tiene los siguientes miembros:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Ejemplos:

Para un cuerpo XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

Para acceder a los elementos del objeto XML de la siguiente manera:

var name = context.targetRequest.body.asXML.name;

Para acceder a los atributos XML, utilice la notación @ .

var number = context.targetRequest.body.asXML.@number;

Para un cuerpo de solicitud JSON:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

Para leer los parámetros del formulario:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

Contexto.*Objetos secundarios de respuesta

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de respuesta: uno entrante (la respuesta del servicio backend) y uno saliente (la respuesta enviada de vuelta al cliente).

El objeto de contexto tiene objetos secundarios que representan estos mensajes de respuesta: context.proxyResponse y context.targetResponse . Estos objetos permiten acceder a las propiedades dentro del flujo de respuesta que se encuentra dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Propiedades del objeto de respuesta

Nombre de la propiedad Descripción
headers

Los encabezados HTTP del mensaje de respuesta como una asignación de String => List .

Ejemplo:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

El código de estado con mensaje de estado como propiedad. Tanto el código de estado como el mensaje de estado están disponibles como propiedades.

Ejemplo:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

El cuerpo HTTP (contenido de la carga útil) del mensaje de respuesta.

El contenido de la respuesta tiene los siguientes miembros:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

Uso de la notación .asXML

Existe una forma práctica de navegar por un documento XML usando la notación .asXML . Esta sección describe cómo usar esta notación y en qué se diferencia de request.content y context.proxyRequest.content .

Por ejemplo:

request.content.asXML

o

context.proxyRequest.content.asXML

Tanto el formato *.content como *.content.asXML se pueden usar en un contexto de cadena, y JavaScript los convertirá en cadenas. En el primer caso ( *.content ), la cadena incluye todas las declaraciones y los comentarios XML. En el segundo caso ( *.content.asXML ), el valor de cadena del resultado se limpia de declaraciones y comentarios.

Ejemplo

contenido del mensaje:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

Además, puede usar el formato .asXML para recorrer la jerarquía XML, especificando los nombres de los elementos y atributos. No es posible recorrer la jerarquía con la otra sintaxis.

Depuración con sentencias print() de JavaScript

Si usa la política de JavaScript para ejecutar código JavaScript personalizado, tenga en cuenta que puede usar la función print() para enviar información de depuración a la herramienta de depuración . Esta función está disponible directamente a través del modelo de objetos de JavaScript. Por ejemplo:

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("Callout to URL: ", context.getVariable("target.url"));
}

Para ver el resultado, seleccione "Resultado de todas las transacciones" en la parte inferior de la ventana de depuración. También puede encontrar el resultado en la propiedad de depuración llamada stepExecution-stdout .

Realizar llamadas de JavaScript con httpClient

Utilice httpClient para realizar múltiples solicitudes HTTP asíncronas paralelas a cualquier URL desde código JavaScript personalizado que se ejecuta en un flujo de proxy de API. El objeto httpClient está expuesto por el modelo de objetos de Javascript de Apigee .

Acerca de httpClient

El objeto httpClient se expone a código JavaScript personalizado que se ejecuta en Apigee a través del modelo de objetos JavaScript. Para asociar JavaScript personalizado a un proxy de API, se utiliza la política JavaScript . Cuando se ejecuta la política, se ejecuta el código JavaScript personalizado.

El objeto httpClient es útil para desarrollar servicios compuestos o mashups. Por ejemplo, permite consolidar varias llamadas de backend en un único método de API.

Aquí tienes un patrón de uso básico: crea una instancia de un objeto de solicitud, asígnale una URL (por ejemplo, a un servicio de backend al que deseas llamar) y llama a httpClient.send con ese objeto de solicitud.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

Referencia de httpClient

El cliente HTTP expone dos métodos: get() y send() .

httpClient.get()

Un método conveniente para solicitudes HTTP GET simples, sin soporte para encabezados HTTP.

Uso

var exchangeObj = httpClient.get(url);

Devoluciones

El método devuelve un objeto exchange . Este objeto no tiene propiedades y expone los siguientes métodos:

  • isError() : (Booleano) Devuelve true si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP 4xx y 5xx resultan en isError() false , ya que la conexión se completó y se devolvió un código de respuesta válido. Si isError() devuelve true , una llamada a getResponse() devuelve el código JavaScript undefined .
  • isSuccess() : (Booleano) Devuelve true si el envío se completó y fue exitoso.
  • isComplete() : (booleano) Devuelve true si la solicitud está completa.
  • waitForComplete() : Pausa el hilo hasta que se complete la solicitud (por éxito o error).
  • getResponse() : (objeto) Devuelve el objeto de respuesta si la httpClient.send() se completó correctamente. El objeto devuelto tiene los mismos métodos y propiedades que el objeto context.proxyResponse. Consulte el resumen del objeto context .
  • getError() : (cadena) Si la llamada a httpClient.send() generó un error, devuelve el mensaje de error como una cadena.

Ejemplo

Envíe un objeto de solicitud completamente configurado que contenga las propiedades de la solicitud HTTP. Utilice una devolución de llamada no bloqueante para procesar la respuesta.

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

Uso de la política de JavaScript

Utilice la política de JavaScript para adjuntar código JavaScript personalizado a un flujo de proxy. Consulte la política de JavaScript .

Temas relacionados

,

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

Ver la documentación de Apigee Edge .

Este tema trata sobre el modelo de objetos JavaScript de Apigee. Es importante comprender este modelo si se pretende usar la política JavaScript para agregar JavaScript personalizado a un proxy de API.

Acerca del modelo de objetos de JavaScript

El modelo de objetos de JavaScript define objetos con propiedades asociadas disponibles para el código JavaScript que se ejecuta dentro de un flujo de proxy de Apigee. Utilice la política de JavaScript para asociar este código personalizado a un flujo de proxy de API.

Los objetos definidos por este modelo tienen alcance dentro del flujo del proxy de la API, lo que significa que ciertos objetos y propiedades solo están disponibles en puntos específicos del flujo. Al ejecutar JavaScript, se crea un alcance para la ejecución. En ese alcance, se crean las siguientes referencias a objetos:

  • contexto : Un objeto que proporciona acceso al contexto del mensaje
  • solicitud : una abreviatura que permite acceder al objeto de solicitud
  • respuesta : una abreviatura que permite acceder al objeto de respuesta
  • crypto : Proporciona varias funciones hash
  • imprimir : Una función para emitir salida
  • Propiedades : Permite acceso de lectura a las propiedades de configuración de la política.

El objeto de contexto

El objeto context tiene alcance global. Está disponible en cualquier parte del flujo de proxy de la API. Tiene cuatro objetos secundarios: proxyRequest , proxyResponse , targetRequest y targetResponse . Estos objetos secundarios se limitan a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Por ejemplo, si la política de JavaScript se ejecuta en la parte del punto final del proxy del flujo, los objetos context.proxyRequest y context.proxyResponse estarán dentro del alcance. Si el JavaScript se ejecuta en un flujo de destino, los objetos context.targetRequest y context.targetResponse estarán dentro del alcance.

El objeto context también tiene propiedades y métodos, que se describen en detalle en este tema. Por ejemplo, el siguiente ejemplo de código JavaScript utiliza la propiedad context.flow e invoca los métodos get/setVariable() en context .

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

Estos métodos interactúan directamente con las variables de flujo . El valor de la propiedad context.flow corresponde al ámbito del flujo actual. En el flujo de solicitud de proxy, se establece en la constante PROXY_REQ_FLOW . En el flujo de respuesta de destino, se establece en TARGET_RESP_FLOW . Esta constante es útil para ejecutar código específico del ámbito. El getter permite obtener variables de flujo y el setter permite configurarlas. Estas variables suelen estar disponibles en el flujo de proxy y pueden ser utilizadas por otras políticas.

Consulte la referencia del objeto de contexto para obtener más detalles y ejemplos.

El objeto criptográfico

El objeto criptográfico añade compatibilidad criptográfica básica de alto rendimiento al modelo de objetos de JavaScript. Consulte la referencia de objetos criptográficos para obtener más detalles y ejemplos.

Los objetos de solicitud y respuesta

Los objetos request y response son referencias abreviadas a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Los objetos a los que hacen referencia estas variables dependen del contexto en el que se ejecuta la política de JavaScript. Si el JavaScript se ejecuta en el flujo de un endpoint de proxy, las variables de solicitud y respuesta hacen referencia a context.proxyRequest y context.proxyResponse . Si el JavaScript se ejecuta en un flujo de destino, las variables hacen referencia a context.targetRequest y context.targetResponse .

El modelo de objetos de JavaScript incluye la función print() que permite enviar información de depuración a la herramienta de depuración de Apigee. Consulte Depuración con sentencias print() de JavaScript .

El objeto de propiedades

Al utilizar un elemento Properties en la configuración de la política, el código JavaScript puede acceder a los valores de esas propiedades mediante la variable properties .

Por ejemplo, si su configuración de JavaScript contiene:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

Luego, en my-code.js , puedes:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

En términos más prácticos, la configuración puede permitir que el código se comporte de manera diferente cuando se ejecuta en diferentes entornos, en diferentes momentos o por cualquier motivo.

Por ejemplo, lo siguiente especifica el "nombre de la variable" y el estilo de salida en el que JavaScript debe emitir información:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
Luego, en emit-results.js , el código podría hacer esto:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

referencia de objeto criptográfico

El objeto crypto le permite realizar funciones hash criptográficas básicas en JavaScript.

El objeto criptográfico tiene alcance global. Está disponible en cualquier punto del flujo del proxy de la API. Crypto permite trabajar con estos objetos hash:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

Trabajar con objetos SHA-1

Puede crear objetos SHA-1, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-1

var _sha1 = crypto.getSHA1();

Actualizar un objeto SHA-1

Sintaxis

_sha1.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

Devuelve el objeto SHA-1 como una cadena hexadecimal

var _hashed_token = _sha1.digest();

Devuelve el objeto SHA-1 como una cadena base64

var _hashed_token = _sha1.digest64();

Trabajar con objetos SHA-256

Puede crear objetos SHA-256, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-256

var _sha256 = crypto.getSHA256();

Actualizar un objeto SHA-256

Sintaxis

_sha256.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

Devuelve el objeto SHA-256 como una cadena hexadecimal

var _hashed_token = _sha256.digest();

Devuelve el objeto SHA-256 como una cadena base64

var _hashed_token = _sha256.digest64();

Trabajar con objetos SHA-512

Puede crear objetos SHA-512, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-512

var _sha512 = crypto.getSHA512();

Actualizar un objeto SHA-512

Sintaxis

_sha512.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-512:

_sha512.update("salt_value");

_sha512.update("some text");

Devuelve el objeto SHA-512 como una cadena hexadecimal

var _hashed_token = _sha512.digest();

Devuelve el objeto SHA-512 como una cadena base64

var _hashed_token = _sha512.digest64();

Trabajar con objetos MD5

Puede crear objetos MD5, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto MD5

var _md5 = crypto.getMD5();

Actualizar un objeto MD5

Sintaxis

_md5.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto MD5:

_md5.update("salt_value");

_md5.update("some text");

Devuelve el objeto MD5 como una cadena hexadecimal

var _hashed_token = _md5.digest();

Devuelve el objeto MD5 como una cadena base64

var _hashed_token = _md5.digest64();

Compatibilidad con fecha y hora de criptomonedas

El objeto criptográfico admite patrones de formato de fecha y hora.

cripto.dateFormat()

Devuelve una fecha en formato de cadena.

Sintaxis

crypto.dateFormat(format, [timezone], [time])

Parámetros

  • Formato - (Cadena) La implementación subyacente de este parámetro es java.text.SimpleDateFormat . Por ejemplo: 'AAAA-MM-DD HH:mm:ss.SSS'
  • Zona horaria : (Cadena, opcional). La implementación subyacente de este parámetro es java.util.TimeZone . Este parámetro tiene el mismo valor predeterminado: UTC.
  • hora - (Número, opcional) Un valor de marca de tiempo Unix para formatear. Predeterminado: hora actual

Ejemplos

Obtenga la hora actual, en milisegundos:

var _now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS');

Obtenga la hora actual para la zona horaria del Pacífico:

var _pst = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST');

Obtenga el valor de diez segundos a partir de ahora:

var _timeNow = Number(context.getVariable('system.timestamp'));
var tenSeconds = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

Ejemplos adicionales. Consulte también la documentación de java.text.SimpleDateFormat .

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

Utilice getHash() para obtener cualquiera de los objetos hash admitidos

Ejemplos

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

Muestra con cripto

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashedToken = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashedToken);

    // convert to base64
    var base64Token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64Token);

} catch(e) {
    throw 'Error in Javascript';
}

referencia de objeto de contexto

Se crea un objeto context para cada transacción de solicitud/respuesta ejecutada por un proxy de API. Este context expone métodos para obtener, establecer y eliminar variables relacionadas con cada transacción.

Las variables definen propiedades específicas de una transacción. La hora del día, la configuración regional del cliente solicitante, el agente de usuario del cliente solicitante y la URL del servicio de destino son ejemplos de variables disponibles en el context . Por lo tanto, context es útil para crear lógica basada en estas propiedades para ejecutar comportamientos personalizados.

Consulte Referencia de variables de flujo y Política de extracción de variables .

resumen del objeto de contexto

Esta tabla describe brevemente el objeto de contexto y sus hijos, y enumera las propiedades que están vinculadas a cada uno.

Nombre Descripción Propiedades
context Un contenedor para el contexto del canal de procesamiento de mensajes y los flujos de solicitud y respuesta que ejecutan ProxyEndpoint y TargetEndpoint. flujo, sesión
context. proxyRequest Un objeto que representa el mensaje de solicitud entrante al ProxyEndpoint (desde la aplicación solicitante al proxy de API) encabezados, parámetros de consulta, método, cuerpo, URL
context. targetRequest Un objeto que representa el mensaje de solicitud saliente desde TargetEndpoint (desde el proxy de API al servicio backend). encabezados, parámetros de consulta, método, cuerpo, URL
context. targetResponse Un objeto que representa el mensaje de respuesta de destino entrante (desde el servicio backend al proxy API) encabezados, contenido, estado
context. proxyResponse Un objeto que representa el mensaje de respuesta del proxy saliente (desde el proxy de API a la aplicación solicitante) encabezados, contenido, estado
context.flow El nombre del flujo actual. Ver context.flow .
context.session Un mapa de pares nombre-valor que permite transferir objetos entre dos pasos diferentes que se ejecutan en el mismo contexto. Por ejemplo: context.session['key'] = 123 . Para obtener más información sobre cuándo utilizar este objeto y cuándo no, consulte ¿Cuál es la diferencia entre context.session['hello'] = {} y context.setVariable("hello", {}) ?

métodos de objeto de contexto

contexto.getVariable()

Recupera el valor de una variable predefinida o personalizada.

Sintaxis

context.getVariable("variable-name");

Ejemplo

Para obtener el valor del año actual:

var year = context.getVariable('system.time.year');

contexto.setVariable()

Establece el valor de una variable personalizada o de cualquier variable predefinida que se pueda escribir .

Sintaxis

context.setVariable("variable-name", value);

Ejemplo

Un escenario común para configurar una variable es cuando un proxy de API debe escribir dinámicamente la URL de destino. El siguiente código JavaScript obtiene el valor de una variable llamada USER.name , lo añade como parámetro de consulta a la URL http://mocktarget.apigee.net?user= y, a continuación, asigna ese valor a la URL predefinida target.url .

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

contexto.removeVariable()

Elimina una variable del contexto.

Sintaxis

context.removeVariable('variable-name');

propiedades del objeto de contexto

contexto.flujo

La propiedad flow es una cadena que identifica el flujo del proxy de API actual. Esta propiedad se utiliza para indicar el flujo al que está asociado el JavaScript. Los valores admitidos son:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

Cada nombre de flujo abarca el PreFlow, PostFlow y cualquier flujo condicional definido en los ProxyEndpoint(s) o TargetEndpoint(s).

Esta propiedad opcional es útil cuando se ejecuta JavaScript común en más de un flujo, pero su comportamiento puede variar según el flujo en el que se ejecute. Use la propiedad Flow para módulos JavaScript que se reutilizarán en múltiples proxies de API, donde el código debe verificar el flujo actual antes de ejecutar la lógica.

Ejemplo

Establezca un encabezado HTTP solo en el flujo targetRequest:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

Establezca el contenido solo en el flujo proxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

contexto.sesión

Un mapa de pares nombre/valor que se puede utilizar para pasar objetos entre dos políticas que se ejecutan dentro del mismo contexto de mensaje.

Ejemplo

Establecer un valor en la sesión:

context.session['key']  = 123;

Obtenga el valor de la sesión:

var value = context.session['key']; // 123

objeto de contexto hijos

Como se muestra a continuación, un flujo de proxy de API completo abarca cuatro fases distintas, cada una de las cuales tiene un objeto de mensaje asociado que es un elemento secundario del objeto de contexto:

  • context.proxyRequest : el mensaje de solicitud entrante recibido del cliente solicitante.
  • context.targetRequest : el mensaje de solicitud saliente enviado al servicio backend.
  • context.proxyResponse : el mensaje de respuesta saliente devuelto al cliente solicitante.
  • context.targetResponse : el mensaje de solicitud entrante recibido del servicio backend.

Diagrama de una solicitud y una respuesta que pasan a través de un punto final de proxy y un punto final de destino.

Las siguientes secciones describen los métodos y propiedades de estos objetos:

contexto.*Solicitar objetos secundarios

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de solicitud: uno entrante (la solicitud del cliente) y uno saliente (la solicitud generada por el proxy API y enviada al destino backend).

El objeto context tiene objetos secundarios que representan estos mensajes de solicitud: context.proxyRequest y context.targetRequest . Estos objetos permiten acceder a las propiedades dentro del flujo de solicitud que está dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Solicitar propiedades de objeto secundario

Nombre de la propiedad Descripción
url

La propiedad url es una propiedad de conveniencia de lectura y escritura que combina parámetros de esquema, host, puerto, ruta y consulta para targetRequest.

La URL completa de la solicitud se compone de las siguientes propiedades:

  • protocolo: El protocolo de la URL (por ejemplo, HTTP, HTTPS)
  • puerto: El puerto (por ejemplo, :80, :443)
  • host: El host de la URL (por ejemplo, www.ejemplo.com)
  • ruta: La ruta de la URI (por ejemplo, /v1/mocktarget)

Al obtener url , se devuelve una URL en el siguiente formato:

protocol://host:port/path?queryParams

Ejemplos:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Encabezados de solicitud HTTP como una asignación de String => List

Ejemplos:

Para esta solicitud HTTP:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
El siguiente JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

devolverá los siguientes valores

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Los parámetros de consulta del mensaje de solicitud como una asignación de String => List .

Ejemplos:

"?city=PaloAlto&city=NewYork"

Se puede acceder como:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

El verbo HTTP (GET, POST, PUT, DELETE, PATCH, etc.) asociado con la solicitud

Ejemplos:

Para esta solicitud:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

El siguiente JavaScript:

context.proxyRequest.method;

devolverá el siguiente valor

POST
body

El cuerpo del mensaje (carga útil) de la solicitud HTTP.

El cuerpo de la solicitud tiene los siguientes miembros:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Ejemplos:

Para un cuerpo XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

Para acceder a los elementos del objeto XML de la siguiente manera:

var name = context.targetRequest.body.asXML.name;

Para acceder a los atributos XML, utilice la notación @ .

var number = context.targetRequest.body.asXML.@number;

Para un cuerpo de solicitud JSON:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

Para leer los parámetros del formulario:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

Contexto.*Objetos secundarios de respuesta

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de respuesta: uno entrante (la respuesta del servicio backend) y uno saliente (la respuesta enviada de vuelta al cliente).

El objeto de contexto tiene objetos secundarios que representan estos mensajes de respuesta: context.proxyResponse y context.targetResponse . Estos objetos permiten acceder a las propiedades dentro del flujo de respuesta que se encuentra dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Propiedades del objeto de respuesta

Nombre de la propiedad Descripción
headers

Los encabezados HTTP del mensaje de respuesta como una asignación de String => List .

Ejemplo:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

El código de estado con mensaje de estado como propiedad. Tanto el código de estado como el mensaje de estado están disponibles como propiedades.

Ejemplo:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

El cuerpo HTTP (contenido de la carga útil) del mensaje de respuesta.

El contenido de la respuesta tiene los siguientes miembros:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

Uso de la notación .asXML

Existe una forma práctica de navegar por un documento XML usando la notación .asXML . Esta sección describe cómo usar esta notación y en qué se diferencia de request.content y context.proxyRequest.content .

Por ejemplo:

request.content.asXML

o

context.proxyRequest.content.asXML

Tanto el formato *.content como *.content.asXML se pueden usar en un contexto de cadena, y JavaScript los convertirá en cadenas. En el primer caso ( *.content ), la cadena incluye todas las declaraciones y los comentarios XML. En el segundo caso ( *.content.asXML ), el valor de cadena del resultado se limpia de declaraciones y comentarios.

Ejemplo

contenido del mensaje:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

Además, puede usar el formato .asXML para recorrer la jerarquía XML, especificando los nombres de los elementos y atributos. No es posible recorrer la jerarquía con la otra sintaxis.

Depuración con sentencias print() de JavaScript

Si usa la política de JavaScript para ejecutar código JavaScript personalizado, tenga en cuenta que puede usar la función print() para enviar información de depuración a la herramienta de depuración . Esta función está disponible directamente a través del modelo de objetos de JavaScript. Por ejemplo:

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("Callout to URL: ", context.getVariable("target.url"));
}

Para ver el resultado, seleccione "Resultado de todas las transacciones" en la parte inferior de la ventana de depuración. También puede encontrar el resultado en la propiedad de depuración llamada stepExecution-stdout .

Realizar llamadas de JavaScript con httpClient

Utilice httpClient para realizar múltiples solicitudes HTTP asíncronas paralelas a cualquier URL desde código JavaScript personalizado que se ejecuta en un flujo de proxy de API. El objeto httpClient está expuesto por el modelo de objetos de Javascript de Apigee .

Acerca de httpClient

El objeto httpClient se expone a código JavaScript personalizado que se ejecuta en Apigee a través del modelo de objetos JavaScript. Para asociar JavaScript personalizado a un proxy de API, se utiliza la política JavaScript . Cuando se ejecuta la política, se ejecuta el código JavaScript personalizado.

El objeto httpClient es útil para desarrollar servicios compuestos o mashups. Por ejemplo, permite consolidar varias llamadas de backend en un único método de API.

Aquí tienes un patrón de uso básico: crea una instancia de un objeto de solicitud, asígnale una URL (por ejemplo, a un servicio de backend al que deseas llamar) y llama a httpClient.send con ese objeto de solicitud.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

Referencia de httpClient

El cliente HTTP expone dos métodos: get() y send() .

httpClient.get()

Un método conveniente para solicitudes HTTP GET simples, sin soporte para encabezados HTTP.

Uso

var exchangeObj = httpClient.get(url);

Devoluciones

El método devuelve un objeto exchange . Este objeto no tiene propiedades y expone los siguientes métodos:

  • isError() : (Booleano) Devuelve true si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP 4xx y 5xx resultan en isError() false , ya que la conexión se completó y se devolvió un código de respuesta válido. Si isError() devuelve true , una llamada a getResponse() devuelve el código JavaScript undefined .
  • isSuccess() : (Booleano) Devuelve true si el envío se completó y fue exitoso.
  • isComplete() : (booleano) Devuelve true si la solicitud está completa.
  • waitForComplete() : Pausa el hilo hasta que se complete la solicitud (por éxito o error).
  • getResponse() : (objeto) Devuelve el objeto de respuesta si la httpClient.send() se completó correctamente. El objeto devuelto tiene los mismos métodos y propiedades que el objeto context.proxyResponse. Consulte el resumen del objeto context .
  • getError() : (cadena) Si la llamada a httpClient.send() generó un error, devuelve el mensaje de error como una cadena.

Ejemplo

Envíe un objeto de solicitud completamente configurado que contenga las propiedades de la solicitud HTTP. Utilice una devolución de llamada no bloqueante para procesar la respuesta.

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

Uso de la política de JavaScript

Utilice la política de JavaScript para adjuntar código JavaScript personalizado a un flujo de proxy. Consulte la política de JavaScript .

Temas relacionados

,

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

Ver la documentación de Apigee Edge .

Este tema trata sobre el modelo de objetos JavaScript de Apigee. Es importante comprender este modelo si se pretende usar la política JavaScript para agregar JavaScript personalizado a un proxy de API.

Acerca del modelo de objetos de JavaScript

El modelo de objetos de JavaScript define objetos con propiedades asociadas disponibles para el código JavaScript que se ejecuta dentro de un flujo de proxy de Apigee. Utilice la política de JavaScript para asociar este código personalizado a un flujo de proxy de API.

Los objetos definidos por este modelo tienen alcance dentro del flujo del proxy de la API, lo que significa que ciertos objetos y propiedades solo están disponibles en puntos específicos del flujo. Al ejecutar JavaScript, se crea un alcance para la ejecución. En ese alcance, se crean las siguientes referencias a objetos:

  • contexto : Un objeto que proporciona acceso al contexto del mensaje
  • solicitud : una abreviatura que permite acceder al objeto de solicitud
  • respuesta : una abreviatura que permite acceder al objeto de respuesta
  • crypto : Proporciona varias funciones hash
  • imprimir : Una función para emitir salida
  • Propiedades : Permite acceso de lectura a las propiedades de configuración de la política.

El objeto de contexto

El objeto context tiene alcance global. Está disponible en cualquier parte del flujo de proxy de la API. Tiene cuatro objetos secundarios: proxyRequest , proxyResponse , targetRequest y targetResponse . Estos objetos secundarios se limitan a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Por ejemplo, si la política de JavaScript se ejecuta en la parte del punto final del proxy del flujo, los objetos context.proxyRequest y context.proxyResponse estarán dentro del alcance. Si el JavaScript se ejecuta en un flujo de destino, los objetos context.targetRequest y context.targetResponse estarán dentro del alcance.

El objeto context también tiene propiedades y métodos, que se describen en detalle en este tema. Por ejemplo, el siguiente ejemplo de código JavaScript utiliza la propiedad context.flow e invoca los métodos get/setVariable() en context .

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

Estos métodos interactúan directamente con las variables de flujo . El valor de la propiedad context.flow corresponde al ámbito del flujo actual. En el flujo de solicitud de proxy, se establece en la constante PROXY_REQ_FLOW . En el flujo de respuesta de destino, se establece en TARGET_RESP_FLOW . Esta constante es útil para ejecutar código específico del ámbito. El getter permite obtener variables de flujo y el setter permite configurarlas. Estas variables suelen estar disponibles en el flujo de proxy y pueden ser utilizadas por otras políticas.

Consulte la referencia del objeto de contexto para obtener más detalles y ejemplos.

El objeto criptográfico

El objeto criptográfico añade compatibilidad criptográfica básica de alto rendimiento al modelo de objetos de JavaScript. Consulte la referencia de objetos criptográficos para obtener más detalles y ejemplos.

Los objetos de solicitud y respuesta

Los objetos request y response son referencias abreviadas a la solicitud y respuesta del entorno, ya sea la solicitud y respuesta del proxy o la solicitud y respuesta del destino. Los objetos a los que hacen referencia estas variables dependen del contexto en el que se ejecuta la política de JavaScript. Si el JavaScript se ejecuta en el flujo de un endpoint de proxy, las variables de solicitud y respuesta hacen referencia a context.proxyRequest y context.proxyResponse . Si el JavaScript se ejecuta en un flujo de destino, las variables hacen referencia a context.targetRequest y context.targetResponse .

El modelo de objetos de JavaScript incluye la función print() que permite enviar información de depuración a la herramienta de depuración de Apigee. Consulte Depuración con sentencias print() de JavaScript .

El objeto de propiedades

Al utilizar un elemento Properties en la configuración de la política, el código JavaScript puede acceder a los valores de esas propiedades mediante la variable properties .

Por ejemplo, si su configuración de JavaScript contiene:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

Luego, en my-code.js , puedes:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

En términos más prácticos, la configuración puede permitir que el código se comporte de manera diferente cuando se ejecuta en diferentes entornos, en diferentes momentos o por cualquier motivo.

Por ejemplo, lo siguiente especifica el "nombre de la variable" y el estilo de salida en el que JavaScript debe emitir información:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
Luego, en emit-results.js , el código podría hacer esto:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

referencia de objeto criptográfico

El objeto crypto le permite realizar funciones hash criptográficas básicas en JavaScript.

El objeto criptográfico tiene alcance global. Está disponible en cualquier punto del flujo del proxy de la API. Crypto permite trabajar con estos objetos hash:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

Trabajar con objetos SHA-1

Puede crear objetos SHA-1, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-1

var _sha1 = crypto.getSHA1();

Actualizar un objeto SHA-1

Sintaxis

_sha1.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

Devuelve el objeto SHA-1 como una cadena hexadecimal

var _hashed_token = _sha1.digest();

Devuelve el objeto SHA-1 como una cadena base64

var _hashed_token = _sha1.digest64();

Trabajar con objetos SHA-256

Puede crear objetos SHA-256, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-256

var _sha256 = crypto.getSHA256();

Actualizar un objeto SHA-256

Sintaxis

_sha256.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

Devuelve el objeto SHA-256 como una cadena hexadecimal

var _hashed_token = _sha256.digest();

Devuelve el objeto SHA-256 como una cadena base64

var _hashed_token = _sha256.digest64();

Trabajar con objetos SHA-512

Puede crear objetos SHA-512, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto SHA-512

var _sha512 = crypto.getSHA512();

Actualizar un objeto SHA-512

Sintaxis

_sha512.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto SHA-512:

_sha512.update("salt_value");

_sha512.update("some text");

Devuelve el objeto SHA-512 como una cadena hexadecimal

var _hashed_token = _sha512.digest();

Devuelve el objeto SHA-512 como una cadena base64

var _hashed_token = _sha512.digest64();

Trabajar con objetos MD5

Puede crear objetos MD5, actualizarlos y convertirlos a valores hexadecimales y base64.

Crear un nuevo objeto MD5

var _md5 = crypto.getMD5();

Actualizar un objeto MD5

Sintaxis

_md5.update(value);

Parámetros

  • valor - (Cadena) Cualquier valor de cadena.

Ejemplo

Actualizar un objeto MD5:

_md5.update("salt_value");

_md5.update("some text");

Devuelve el objeto MD5 como una cadena hexadecimal

var _hashed_token = _md5.digest();

Devuelve el objeto MD5 como una cadena base64

var _hashed_token = _md5.digest64();

Compatibilidad con fecha y hora de criptomonedas

El objeto criptográfico admite patrones de formato de fecha y hora.

cripto.dateFormat()

Devuelve una fecha en formato de cadena.

Sintaxis

crypto.dateFormat(format, [timezone], [time])

Parámetros

  • Formato - (Cadena) La implementación subyacente de este parámetro es java.text.SimpleDateFormat . Por ejemplo: 'AAAA-MM-DD HH:mm:ss.SSS'
  • Zona horaria : (Cadena, opcional). La implementación subyacente de este parámetro es java.util.TimeZone . Este parámetro tiene el mismo valor predeterminado: UTC.
  • hora - (Número, opcional) Un valor de marca de tiempo Unix para formatear. Predeterminado: hora actual

Ejemplos

Obtenga la hora actual, en milisegundos:

var _now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS');

Obtenga la hora actual para la zona horaria del Pacífico:

var _pst = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST');

Obtenga el valor de diez segundos a partir de ahora:

var _timeNow = Number(context.getVariable('system.timestamp'));
var tenSeconds = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

Ejemplos adicionales. Consulte también la documentación de java.text.SimpleDateFormat .

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

Utilice getHash() para obtener cualquiera de los objetos hash admitidos

Ejemplos

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

Muestra con cripto

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashedToken = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('YYYY-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashedToken);

    // convert to base64
    var base64Token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64Token);

} catch(e) {
    throw 'Error in Javascript';
}

referencia de objeto de contexto

Se crea un objeto context para cada transacción de solicitud/respuesta ejecutada por un proxy de API. Este context expone métodos para obtener, establecer y eliminar variables relacionadas con cada transacción.

Las variables definen propiedades específicas de una transacción. La hora del día, la configuración regional del cliente solicitante, el agente de usuario del cliente solicitante y la URL del servicio de destino son ejemplos de variables disponibles en el context . Por lo tanto, context es útil para crear lógica basada en estas propiedades para ejecutar comportamientos personalizados.

Consulte Referencia de variables de flujo y Política de extracción de variables .

resumen del objeto de contexto

Esta tabla describe brevemente el objeto de contexto y sus hijos, y enumera las propiedades que están vinculadas a cada uno.

Nombre Descripción Propiedades
context Un contenedor para el contexto del canal de procesamiento de mensajes y los flujos de solicitud y respuesta que ejecutan ProxyEndpoint y TargetEndpoint. flujo, sesión
context. proxyRequest Un objeto que representa el mensaje de solicitud entrante al ProxyEndpoint (desde la aplicación solicitante al proxy de API) encabezados, parámetros de consulta, método, cuerpo, URL
context. targetRequest Un objeto que representa el mensaje de solicitud saliente desde TargetEndpoint (desde el proxy de API al servicio backend). encabezados, parámetros de consulta, método, cuerpo, URL
context. targetResponse Un objeto que representa el mensaje de respuesta de destino entrante (desde el servicio backend al proxy API) encabezados, contenido, estado
context. proxyResponse Un objeto que representa el mensaje de respuesta del proxy saliente (desde el proxy de API a la aplicación solicitante) encabezados, contenido, estado
context.flow El nombre del flujo actual. Ver context.flow .
context.session Un mapa de pares nombre-valor que permite transferir objetos entre dos pasos diferentes que se ejecutan en el mismo contexto. Por ejemplo: context.session['key'] = 123 . Para obtener más información sobre cuándo utilizar este objeto y cuándo no, consulte ¿Cuál es la diferencia entre context.session['hello'] = {} y context.setVariable("hello", {}) ?

métodos de objeto de contexto

contexto.getVariable()

Recupera el valor de una variable predefinida o personalizada.

Sintaxis

context.getVariable("variable-name");

Ejemplo

Para obtener el valor del año actual:

var year = context.getVariable('system.time.year');

contexto.setVariable()

Establece el valor de una variable personalizada o de cualquier variable predefinida que se pueda escribir .

Sintaxis

context.setVariable("variable-name", value);

Ejemplo

Un escenario común para configurar una variable es cuando un proxy de API debe escribir dinámicamente la URL de destino. El siguiente código JavaScript obtiene el valor de una variable llamada USER.name , lo añade como parámetro de consulta a la URL http://mocktarget.apigee.net?user= y, a continuación, asigna ese valor a la URL predefinida target.url .

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

contexto.removeVariable()

Elimina una variable del contexto.

Sintaxis

context.removeVariable('variable-name');

propiedades del objeto de contexto

contexto.flujo

La propiedad flow es una cadena que identifica el flujo del proxy de API actual. Esta propiedad se utiliza para indicar el flujo al que está asociado el JavaScript. Los valores admitidos son:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

Cada nombre de flujo abarca el PreFlow, PostFlow y cualquier flujo condicional definido en los ProxyEndpoint(s) o TargetEndpoint(s).

Esta propiedad opcional es útil cuando se ejecuta JavaScript común en más de un flujo, pero su comportamiento puede variar según el flujo en el que se ejecute. Use la propiedad Flow para módulos JavaScript que se reutilizarán en múltiples proxies de API, donde el código debe verificar el flujo actual antes de ejecutar la lógica.

Ejemplo

Establezca un encabezado HTTP solo en el flujo targetRequest:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

Establezca el contenido solo en el flujo proxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

contexto.sesión

Un mapa de pares nombre/valor que se puede utilizar para pasar objetos entre dos políticas que se ejecutan dentro del mismo contexto de mensaje.

Ejemplo

Establecer un valor en la sesión:

context.session['key']  = 123;

Obtenga el valor de la sesión:

var value = context.session['key']; // 123

objeto de contexto hijos

Como se muestra a continuación, un flujo de proxy de API completo abarca cuatro fases distintas, cada una de las cuales tiene un objeto de mensaje asociado que es un elemento secundario del objeto de contexto:

  • context.proxyRequest : el mensaje de solicitud entrante recibido del cliente solicitante.
  • context.targetRequest : el mensaje de solicitud saliente enviado al servicio backend.
  • context.proxyResponse : el mensaje de respuesta saliente devuelto al cliente solicitante.
  • context.targetResponse : el mensaje de solicitud entrante recibido del servicio backend.

Diagrama de una solicitud y una respuesta que pasan a través de un punto final de proxy y un punto final de destino.

Las siguientes secciones describen los métodos y propiedades de estos objetos:

contexto.*Solicitar objetos secundarios

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de solicitud: uno entrante (la solicitud del cliente) y uno saliente (la solicitud generada por el proxy API y enviada al destino backend).

El objeto context tiene objetos secundarios que representan estos mensajes de solicitud: context.proxyRequest y context.targetRequest . Estos objetos permiten acceder a las propiedades dentro del flujo de solicitud que está dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Solicitar propiedades de objeto secundario

Nombre de la propiedad Descripción
url

La propiedad url es una propiedad de conveniencia de lectura y escritura que combina parámetros de esquema, host, puerto, ruta y consulta para targetRequest.

La URL completa de la solicitud se compone de las siguientes propiedades:

  • protocolo: El protocolo de la URL (por ejemplo, HTTP, HTTPS)
  • puerto: El puerto (por ejemplo, :80, :443)
  • host: El host de la URL (por ejemplo, www.ejemplo.com)
  • ruta: La ruta de la URI (por ejemplo, /v1/mocktarget)

Al obtener url , se devuelve una URL en el siguiente formato:

protocol://host:port/path?queryParams

Ejemplos:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Encabezados de solicitud HTTP como una asignación de String => List

Ejemplos:

Para esta solicitud HTTP:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
El siguiente JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

devolverá los siguientes valores

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Los parámetros de consulta del mensaje de solicitud como una asignación de String => List .

Ejemplos:

"?city=PaloAlto&city=NewYork"

Se puede acceder como:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

El verbo HTTP (GET, POST, PUT, DELETE, PATCH, etc.) asociado con la solicitud

Ejemplos:

Para esta solicitud:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

El siguiente JavaScript:

context.proxyRequest.method;

devolverá el siguiente valor

POST
body

El cuerpo del mensaje (carga útil) de la solicitud HTTP.

El cuerpo de la solicitud tiene los siguientes miembros:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Ejemplos:

Para un cuerpo XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

Para acceder a los elementos del objeto XML de la siguiente manera:

var name = context.targetRequest.body.asXML.name;

Para acceder a los atributos XML, utilice la notación @ .

var number = context.targetRequest.body.asXML.@number;

Para un cuerpo de solicitud JSON:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

Para leer los parámetros del formulario:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

Contexto.*Objetos secundarios de respuesta

Para cada transacción HTTP que se ejecuta en un proxy API, se crean dos objetos de mensaje de respuesta: uno entrante (la respuesta del servicio backend) y uno saliente (la respuesta enviada de vuelta al cliente).

El objeto de contexto tiene objetos secundarios que representan estos mensajes de respuesta: context.proxyResponse y context.targetResponse . Estos objetos permiten acceder a las propiedades dentro del flujo de respuesta que se encuentra dentro del alcance cuando se ejecuta el código JavaScript.

contexto.*Propiedades del objeto de respuesta

Nombre de la propiedad Descripción
headers

Los encabezados HTTP del mensaje de respuesta como una asignación de String => List .

Ejemplo:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

El código de estado con mensaje de estado como propiedad. Tanto el código de estado como el mensaje de estado están disponibles como propiedades.

Ejemplo:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

El cuerpo HTTP (contenido de la carga útil) del mensaje de respuesta.

El contenido de la respuesta tiene los siguientes miembros:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

Uso de la notación .asXML

Existe una forma práctica de navegar por un documento XML usando la notación .asXML . Esta sección describe cómo usar esta notación y en qué se diferencia de request.content y context.proxyRequest.content .

Por ejemplo:

request.content.asXML

o

context.proxyRequest.content.asXML

Tanto el formato *.content como *.content.asXML se pueden usar en un contexto de cadena, y JavaScript los convertirá en cadenas. En el primer caso ( *.content ), la cadena incluye todas las declaraciones y los comentarios XML. En el segundo caso ( *.content.asXML ), el valor de cadena del resultado se limpia de declaraciones y comentarios.

Ejemplo

contenido del mensaje:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

Además, puede usar el formato .asXML para recorrer la jerarquía XML, especificando los nombres de los elementos y atributos. No es posible recorrer la jerarquía con la otra sintaxis.

Depuración con sentencias print() de JavaScript

Si usa la política de JavaScript para ejecutar código JavaScript personalizado, tenga en cuenta que puede usar la función print() para enviar información de depuración a la herramienta de depuración . Esta función está disponible directamente a través del modelo de objetos de JavaScript. Por ejemplo:

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("Callout to URL: ", context.getVariable("target.url"));
}

Para ver el resultado, seleccione "Resultado de todas las transacciones" en la parte inferior de la ventana de depuración. También puede encontrar el resultado en la propiedad de depuración llamada stepExecution-stdout .

Realizar llamadas de JavaScript con httpClient

Utilice httpClient para realizar múltiples solicitudes HTTP asíncronas paralelas a cualquier URL desde código JavaScript personalizado que se ejecuta en un flujo de proxy de API. El objeto httpClient está expuesto por el modelo de objetos de Javascript de Apigee .

Acerca de httpClient

El objeto httpClient se expone a código JavaScript personalizado que se ejecuta en Apigee a través del modelo de objetos JavaScript. Para asociar JavaScript personalizado a un proxy de API, se utiliza la política JavaScript . Cuando se ejecuta la política, se ejecuta el código JavaScript personalizado.

El objeto httpClient es útil para desarrollar servicios compuestos o mashups. Por ejemplo, permite consolidar varias llamadas de backend en un único método de API.

Aquí tienes un patrón de uso básico: crea una instancia de un objeto de solicitud, asígnale una URL (por ejemplo, a un servicio de backend al que deseas llamar) y llama a httpClient.send con ese objeto de solicitud.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

Referencia de httpClient

El cliente HTTP expone dos métodos: get() y send() .

httpClient.get()

Un método conveniente para solicitudes HTTP GET simples, sin soporte para encabezados HTTP.

Uso

var exchangeObj = httpClient.get(url);

Devoluciones

El método devuelve un objeto exchange . Este objeto no tiene propiedades y expone los siguientes métodos:

  • isError() : (Booleano) Devuelve true si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP 4xx y 5xx resultan en isError() false , ya que la conexión se completó y se devolvió un código de respuesta válido. Si isError() devuelve true , una llamada a getResponse() devuelve el código JavaScript undefined .
  • isSuccess() : (Booleano) Devuelve true si el envío se completó y fue exitoso.
  • isComplete() : (booleano) Devuelve true si la solicitud está completa.
  • waitForComplete() : Pausa el hilo hasta que se complete la solicitud (por éxito o error).
  • getResponse() : (objeto) Devuelve el objeto de respuesta si la httpClient.send() se completó correctamente. El objeto devuelto tiene los mismos métodos y propiedades que el objeto context.proxyResponse. Consulte el resumen del objeto context .
  • getError() : (cadena) Si la llamada a httpClient.send() generó un error, devuelve el mensaje de error como una cadena.

Ejemplo

Envíe un objeto de solicitud completamente configurado que contenga las propiedades de la solicitud HTTP. Utilice una devolución de llamada no bloqueante para procesar la respuesta.

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

Uso de la política de JavaScript

Utilice la política de JavaScript para adjuntar código JavaScript personalizado a un flujo de proxy. Consulte la política de JavaScript .

Temas relacionados