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
.
La función print()
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>
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
- resumen del objeto de contexto
- métodos de objeto de contexto
- propiedades del objeto de contexto
- objeto de contexto hijos
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
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'; }
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.
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 La URL completa de la solicitud se compone de las siguientes propiedades:
Al obtener |
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 |
Ejemplos: Para esta solicitud HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z 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 |
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:
|
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 |
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) Devuelvetrue
si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP4xx
y5xx
resultan enisError()
false
, ya que la conexión se completó y se devolvió un código de respuesta válido. SiisError()
devuelvetrue
, una llamada agetResponse()
devuelve el código JavaScriptundefined
. -
isSuccess()
: (Booleano) Devuelvetrue
si el envío se completó y fue exitoso. -
isComplete()
: (booleano) Devuelvetrue
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 lahttpClient.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 ahttpClient.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
.
La función print()
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>
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
- resumen del objeto de contexto
- métodos de objeto de contexto
- propiedades del objeto de contexto
- objeto de contexto hijos
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
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'; }
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.
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 La URL completa de la solicitud se compone de las siguientes propiedades:
Al obtener |
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 |
Ejemplos: Para esta solicitud HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z 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 |
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:
|
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 |
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) Devuelvetrue
si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP4xx
y5xx
resultan enisError()
false
, ya que la conexión se completó y se devolvió un código de respuesta válido. SiisError()
devuelvetrue
, una llamada agetResponse()
devuelve el código JavaScriptundefined
. -
isSuccess()
: (Booleano) Devuelvetrue
si el envío se completó y fue exitoso. -
isComplete()
: (booleano) Devuelvetrue
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 lahttpClient.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 ahttpClient.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
.
La función print()
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>
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
- resumen del objeto de contexto
- métodos de objeto de contexto
- propiedades del objeto de contexto
- objeto de contexto hijos
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
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'; }
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.
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 La URL completa de la solicitud se compone de las siguientes propiedades:
Al obtener |
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 |
Ejemplos: Para esta solicitud HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z 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 |
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:
|
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 |
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) Devuelvetrue
si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP4xx
y5xx
resultan enisError()
false
, ya que la conexión se completó y se devolvió un código de respuesta válido. SiisError()
devuelvetrue
, una llamada agetResponse()
devuelve el código JavaScriptundefined
. -
isSuccess()
: (Booleano) Devuelvetrue
si el envío se completó y fue exitoso. -
isComplete()
: (booleano) Devuelvetrue
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 lahttpClient.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 ahttpClient.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
.
La función print()
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>
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
- resumen del objeto de contexto
- métodos de objeto de contexto
- propiedades del objeto de contexto
- objeto de contexto hijos
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
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'; }
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.
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 La URL completa de la solicitud se compone de las siguientes propiedades:
Al obtener |
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 |
Ejemplos: Para esta solicitud HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z 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 |
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:
|
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 |
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) Devuelvetrue
si el cliente http no pudo conectarse al servidor. Los códigos de estado HTTP4xx
y5xx
resultan enisError()
false
, ya que la conexión se completó y se devolvió un código de respuesta válido. SiisError()
devuelvetrue
, una llamada agetResponse()
devuelve el código JavaScriptundefined
. -
isSuccess()
: (Booleano) Devuelvetrue
si el envío se completó y fue exitoso. -
isComplete()
: (booleano) Devuelvetrue
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 lahttpClient.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 ahttpClient.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 .