Ejemplos de código de GatewayScript
Ejemplo de fragmentos de código GatewayScript para ayudar a la creación de una política gatewayscript .
- Los mecanismos descritos aquí para interactuar con el contexto API Connect están pensados para pasarelas v5-compatible y también para proporcionar compatibilidad v5 para APIs creadas para la API Gateway. La pasarela v5-compatible no está disponible en API Connect Enterprise as a Service, por lo que debe utilizar los mecanismos descritos en Uso de variables de contexto en GatewayScript y políticas XSLT con el DataPower API Gateway. Para las API de API Gateway , las funciones v5-compatibility listadas aquí se deben utilizar sólo para la migración de v5 .
- Las funciones de GatewayScript que se listan aquí utilizan el nombre común
apimpara llamar a los métodos. No obstante, puede cambiar el nombre común por uno de su elección utilizando una u otra de las siguientes llamadas de función, dependiendo de su tipo de pasarela:
donde nombre es el nombre que ha elegido. Por ejemplo:
var name = require('local:///isp/policy/apim.custom.js'); // v5-Compatible Gateway
var name = require('apim'); // DataPower API Gatewayvar apim = require('apim');
Acceder al contexto de ensamblaje
Los fragmentos de código siguientes muestran ejemplos de acceso al contexto de ensamblaje.El ejemplo uno devuelve el contexto de request:
apim.getvariable('request');myheader:apim.getvariable('request.headers.myheader');apim.setvariable('message.headers.name', value, action)donde- nombre es el nombre de la cabecera de mensaje que se desea establecer, añadir o borrar.
- valor es el valor de la serie en el que desea establecer la variable. Puede tratarse de un valor literal u otra variable. Por ejemplo,
para establecer la variable con nombre en el valor de la cabecera Content-Type de una solicitud, especifique valor como
request.headers.content-type. Esta propiedad sólo es necesaria cuando se especificasetoaddcomo acción. - action es la acción que desea aplicar a la variable. Las opciones válidas son:
setaddclear
set.
Para obtener una lista completa de variables de contexto, consulte Variables de contexto deAPI Gatewayy para obtener más información sobre cómo hacer referencia a variables de contexto en IBM API Connect , consulte Referencias de variables en API Connect. Si utiliza DataPower® API Gateway, consulte también Utilización de variables de contexto en las políticas GatewayScript y XSLT con DataPower API Gateway.
Acceso a las extensiones de OpenAPI en GatewayScript
El siguiente ejemplo muestra cómo acceder a extensiones personalizadas (como x-banking) en el documento OpenAPI (Swagger) desde GatewayScript:
if (context.swagger) {
context.swagger.readAsJSON(function(error, swaggerDoc) {
if (error) {
// Handle error case
context.set('message.body', error);
context.message.statusCode = 500;
}
else {
extensionContent = swaggerDoc["x-banking"]
}
Leer entrada de forma síncrona
Los fragmentos de código siguientes muestran ejemplos de cómo leer la entrada de forma síncrona utilizando la funciónapim.getvariable para leer datos directamente desde un contexto. La entrada JSON se devuelve como un objeto
JavaScript. Los datos XML se devuelven como un objeto NodeList (DOM).El ejemplo uno devuelve una lectura síncrona del cuerpo de la solicitud original a la variable denominada json:
var json = apim.getvariable('request.body');var xml = apim.getvariable('message.body');apim.getvariable() devuelve un objeto NodeList que consta de un nodo binario, que debe convertirse en una serie. Si el contenido es realmente XML o JSON, debe analizar esta serie, tal como se muestra en el ejemplo siguiente:var data = apim.getvariable('request.body');
// if a nodelist was returned and the type is 13 (BLOB/Binary Node), convert it
// to a Buffer, which can then be converted to a string
if ((data.item && data.length > 0 && data.item(0).nodeType === 13)) {
data = data.item(0).toBuffer().toString();
}
// if the string really is XML or JSON, then now add code to parse it with
// the appropriate XML or JSON parse function
.
.
.
Leer entrada de forma asíncrona
Los fragmentos de código siguientes muestran las llamadasapim.readInput() que puede
utilizar para realizar una función de devolución de llamada JavaScript para leer datos de entrada de forma asíncrona en una variable. La entrada JSON se devuelve como un objeto
JavaScript. Los datos XML se devuelven como un objeto NodeList (DOM). Otros tipos de entrada se devuelven como un objeto de almacenamiento intermedio.apim.readInput(callback(err,input) {});
apim.readInputAsJSON(callback(err,json) {});
apim.readInputAsXML(callback(err,nodelist) {});
apim.readInputAsBuffer(callback(err,buffer) {});apim.readInput() intenta determinar el tipo de datos de entrada y llamar a la función apim.readInputAstype() adecuada para devolver los datos en el formato correcto. Sin embargo, para
asegurarse de que se devuelve el tipo de datos correcto, utilice la función apim.readInputAstype().La función
apim.readInputAstype() lee los datos del contexto INPUT (por ejemplo session.INPUT) o de un contexto de
salida de política (por ejemplo policy.output), según si se había llamado una política anterior que había escrito salida en un contexto de
salida de política. A continuación, esta función llama al método IBM DataPower GatewayScript readAstype subyacente en el contexto relevante para leer los datos y, a continuación, utiliza devoluciones de llamada JavaScript para devolver los datos a una variable. Para más información sobre DataPower consulte el modelo de programación Gateway y GatewayScript.
apim.readInputAsJSON()
para llevar datos a una variable llamada json:apim.readInputAsJSON(function (error, json) {
if (error)
{
// handle error
}
else
{
// the json parameter will contain the json data that has been read
// process the json object in some way and write to the output context
if (json.test=='true')
{
// if json data contains a variable called test that is set to true, then also add some test data
json.data = 'This is my test data'
}
session.output.write(json);
// write to the output context
}
});Configurar información de error
El bloque de código siguiente muestra un ejemplo de cómo configurar la implementación de política para generar información de error mediante la funciónapim.error(). En este ejemplo, MyError se genera en el flujo de ensamblaje. Si hay un manejador de capturas, captura este error; de lo contrario, el conjunto omite la ejecución del flujo y envía una respuesta 500 Internal Error .apim.error('MyError', 500, 'Internal Error', 'Some error message');donde:MyErrores el nombre del error.500es el código HTTP del mensaje de error necesario.Internal Errores la frase HTTP que explica el error.Some error messagees la acción sugerida para el usuario.
Acceso a la excepción interceptada en un bloque catch
catch de un ensamblaje de API, obtener los detalles de la excepción interceptada
actual. Un posible uso sería crear una respuesta de error personalizada utilizando los detalles de la excepción interceptada.let exception = apim.getError();La función devuelve un objeto JSON; por ejemplo:{
"name": "OperationError",
"message": "This is a thrown Operation Error",
"policyTitle": "Throw Operation Error",
"status": {
"code": "500",
"reason": "Internal Server Error"
}
}Escribir salida
'{ "status": "created" }', utilizando la variable session.output.write :session.output.write('{ "status": "created" }');La variable session.output.write es un método GatewayScript que escribe datos en el contexto de salida. Para más información, consulte Contextos y sesiones.session.output:apim.output('application/type');Por ejemplo, si estuviera creando una política que llamara lo siguiente:session.output.write('<test>this is some xml data</test>');la política escribiría datos XML en el contexto de salida. Debería configurar la
política para llamar también lo siguiente:apim.output('application/xml');para indicar al sistema que la salida es XML. Puede provocar problemas en el proceso de la política que el formato de contexto de salida real y el formato especificado en apim.output, sean
diferentes.apim.setvariable para manipular message.body, debe seguir inmediatamente la llamada a función apim.setvariable con una llamada a función apim.output que especifique el tipo de contenido de la carga útil que ha escrito en message.body apim.setvariable.