Invocar un Servicio Web

Este ejemplo explica cómo realizar una llamada AJAX / REST desde una macro a un servicio web. Puede integrar datos desde su aplicación de host a la llamada del servicio web o desde el servicio web a su aplicación de host.

En este ejemplo llamamos el servicio Verastream Host Integrator (VHI) CICSAcctsDemo REST. En cualquier caso, puede adaptar fácilmente el código para llamar cualquier servicio web. No está limitado a VHI.

En el ejemplo, la llamada va a través de un proxy configurado en el servidor de sesión (mostrado más abajo) para evitar una complicación del tipo “Same Origin Policy”. Si está utilizando un servicio web que soporte Cross-origin Resource Sharing (CORS) y está utilizando un navegador moderno, el proxy es innecesario.

Como la biblioteca jQuery está disponible en las macros, puede utilizar la función $.post() directamente para invocar servicios REST.

Este ejemplo explica también cómo ajustar una llamada jQuery REST en una nueva Promise. La promise devuelta por la función personalizada siguiente permite utilizar "yield" en el código de la macro principal. Esto permite que la ejecución de la macro espere hasta que la llamada de servicio se complete antes de continuar.

 var macro = createMacro(function*() {
	'use strict';
	
	// Crear unas cuantas variables para usuario posterior
	var username;
	var password;
	var accountNumber;
	var accountDetails;
	
	// Crear una función que hará una llamada AJAX / REST a un servicio web VHI.
	// Se podría ajustar para llamar cualquier servicio web, no sólo VHI.
	// Si no se utiliza CORS, la solicitud tendría que pasar por un
	// proxy en el servidor de sesión. Véanse notas de ejemplo para más información.
	/**
	 * Función de auxiliar de cifrado manual para encapsular parámetros AJAX / REST, invocar el servicio
	 * REST y devolver los resultados dentro de una Promise.
	 * @param {Number} acctNum para enviar a la consulta REST.
	 * @param {String} nombre de usuario para acceder al servicio REST.
	 * @param {String} contraseña para acceder al servicio REST.
	 * @return {Promise} que contiene resultados $.post() compatibles con yield.
	*/
	var getAccountDetails = function (acctNum, username, password) {
		var url = "proxy1/model/CICSAcctsDemo/GetAccountDetail";
		var args = {"filters": {"AcctNum": acctNum}, "envVars": {"Username": username, "Password": password}};
		
		// Ajustar una llamada jQuery AJAX / HTTP POST en una nueva Promise.
		// La promise que se devuelve aquí permite a la macro yield / esperar
		// hasta que se complete.
		return Promise.resolve($.post(url, JSON.stringify(args)))
			.catch(function (error) {
			// Se han producido errores de asignación en la llamada jQuery a nuestra Promise.
			throw new Error('REST API Error: ' + error.statusText);
		});
	};
	
	// Inicio Macro Generada
	var ps = session.getPresentationSpace();
	try {
		// Podría interactuar con el host aquí, iniciar sesión en app de host, etc...
		// Recuperar nombre de usuario y contraseña
		username = yield ui.prompt('Nombre de usuario:');
		password = yield ui.prompt('Contraseña:', null, true);
		accountNumber = yield ui.prompt('Número de cuenta:');
		if (!username || !password || !accountNumber) {
			throw new Error('Username or password not specified');
		}
		
		// Invocar servicio REST externo, y yields / esperar a que se complete la llamada.
		accountDetails = yield getAccountDetails(accountNumber, username, password);
		
		// Ahora tenemos los datos de nuestro servicio externo.
		// Puede integrar los datos en nuestra app de host local o simplemente mostrarlos al usuario.
		// En este ejemplo sólo mostramos los detalles de la cuenta resultantes.
		if (accountDetails.result && accountDetails.result.length > 0) {
			yield ui.message(accountDetails.result[0].FirstName + ' $' + accountDetails.result[0].AcctBalance);
		} else {
			yield ui.message('Ninguna grabación encontrada para cuenta: ‘ + accountNumber);
		}
	} catch (error) {
		// Si se ha producido un error durante la llamada AJAX / REST call
		// o la recuperación del nombre de usuario / contraseña terminaremos aquí.
		yield ui.message(error.message);
	}
});

// Ejecutar nuestra macro
return macro();

Cross Origin Scripting Proxy Support

Si tiene servicios Web que no admiten CORS, las llamadas a AJAX/REST presentarán errores si intentan acceder a un servidor distinto a aquel en el que se originó la aplicación Cloud. Esta es una función de seguridad del navegador.

El servidor de Host Access for the Cloud proporciona un método explícito para establecer un proxy en servidores remotos de confianza.

  • Abra ..\<directorio_de_instalación>\sessionserver\microservice\sessionserver\service.yml para editarlo.

  • En la sección env, agregue:

    name: zfe.proxy.mappings
    value: proxy-path=proxy-to-address

    Donde proxy-path se refiere a la asignación de url que se desea y proxy-to-address se refiere a la URL donde se proxeará la llamada.

  • En este ejemplo:

    name: zfe.proxy.mappings
    value: proxy1=http://remote-vhi-server:9680/vhi-rs/

    Las llamadas realizadas a <servidor:puerto>/proxy1 se redirigirán mediante apoderado (proxy) a http://remote-vhi-server:9680/vhi-rs/.

  • Se pueden especificar varias asignaciones de proxy utilizando una coma para separar las asignaciones de proxy individuales.

  • Recuerde que incluso si un servidor REST soporta encabezados CORS, algunos navegadores antiguos pueden no soportarlos, por lo que este ejemplo sigue siendo relevante.

SUGERENCIA:Es posible que el archivo service.yml se sustituya cada vez que distribuya de nuevo Host Access for the Cloud. Haga siempre una copia de seguridad de sus archivos.