Adaptadores Worklight y el patrón Worklight a Microsoft .NET: solicitud-respuesta

Los adaptadores Worklight son el código del lado del servidor de las aplicaciones desplegadas en la plataforma de aplicaciones móviles de Worklight y a las que ésta da servicio. Los adaptadores conectan Worklight Server con las aplicaciones empresariales, como las que se ejecutan en IBM Integration Bus. Los pasos siguientes describen un flujo de datos típico entre una aplicación móvil y un servicio web de Microsoft .NET que se ejecuta en Integration Bus:

  1. El adaptador expone un conjunto de servicios, denominados procedimientos. El adaptador y la aplicación móvil se despliegan en Worklight Server.
  2. La aplicación móvil invoca los procedimientos emitiendo solicitudes Ajax (WL.Client.invokeProcedure). Los parámetros para el procedimiento se pasan como datos con formato JSON.
  3. El procedimiento convierte los parámetros JSON en un mensaje de solicitud XML SOAP.
  4. El procedimiento utiliza el servicio web de Microsoft .NET que se ejecuta en Integration Bus.
  5. El servicio web de Microsoft .NET devuelve los datos como una respuesta XML SOAP.
  6. Worklight Server convierte los datos con formato XML en JSON.
  7. Los datos JSON se devuelven a la aplicación móvil de origen.

Este patrón genera un adaptador Worklight que puede utilizar cada método seleccionado en la clase .NET. El adaptador convierte las solicitudes JSON de las aplicaciones móviles en solicitudes de servicio web en su clase Microsoft .NET. Por ejemplo, suponiendo que los siguientes métodos C# estén en una clase llamada RetailBank y que los haya seleccionado para una instancia de patrón llamada MyBank:

        public static string GetBalance(string accountNumber, out string lastUpdated);
        public static string TransferMoney(string sourceAccountNumber, string targetAccountNumber, string value);
        public static string FindMissingAccount(string name, ref string lastKnownAccountNumber);

El siguiente fragmento de JavaScript muestra cómo una aplicación móvil puede invocar el método GetBalance:

        var invocationData = {
                adapter : "MyBank",
                procedure : "GetBalance",
                parameters : [ accountNo ]};

        var options = {
            onSuccess:lang.hitch(this, this.onResult),
            onFailure:lang.hitch(this, this.onError)};

        WL.Client.invokeProcedure(invocationData, options);

Con fines de prueba, el adaptador Worklight desplegado se puede comprobar utilizando un navegador web con el siguiente URL:

http://localhost:8080/dev/invoke?adapter=MyBank&procedure=GetBalance&parameters=%5B123456789%5D

Archivos generados

En esta sección se describen los archivos que se generan para el adaptador Worklight.

Adaptador Worklight

El patrón crea un adaptador Worklight con dos archivos de configuración. El primer archivo de configuración (MyBank.xml) es el archivo XML del adaptador. El archivo XML de adaptador se utiliza para configurar la conectividad con Integration Bus y para declarar los procedimientos que el adaptador pone a disposición de las aplicaciones móviles y de otros adaptadores. El ejemplo siguiente muestra el archivo de configuración XML de adaptador generado:

    <?xml version="1.0" encoding="UTF-8"?>
    <wl:adapter name="MyBank"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:wl="http://www.worklight.com/integration"
        xmlns:http="http://www.worklight.com/integration/http">
    
        <displayName>MyBank</displayName>
        <description>Adaptador de integración Worklight para el servicio de Microsoft .NET</description>
        <connectivity>
            <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
                <protocol>http</protocol>
                <domain>localhost</domain>
                <port>7800</port>
            </connectionPolicy>
            <loadConstraints maxConcurrentConnectionsPerNode="99" />
        </connectivity>
    
        <procedure name="GetBalance"/>
        <procedure name="TransferMoney"/>
        <procedure name="FindMissingAccount"/>
    </wl:adapter>

Muchos de los valores de este archivo XML de adaptador están configurados a partir de parámetros de patrón (por ejemplo, displayName, domain y port). Se ha configurado un procedimiento (procedure) para cada método .NET. Los procedimientos definen un proceso para acceder a las operaciones expuestas por el servicio web de Microsoft .NET. Hay un procedimiento (procedure) para cada operación del servicio web.

El patrón también genera un archivo JavaScript (MyBank-impl.js) que contiene las funciones de implementación para cada procedimiento:

    var targetNamespace = "urn://bankingapplication/retailbank_V1";
    
    function PrepareWebService(method, parameters, path) {
        var request =
            '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="' + targetNamespace + '">' +
                '<soap:Header/>' +
                '<soap:Body>' +
                    '<tns:' + method + '>';
    
        for (var key in parameters) {
            request += '<' + key + '>' + parameters[key] + '</' + key + '>';
        }
    
        request += '</tns:' + method + '>' +
                '</soap:Body>' +
            '</soap:Envelope>';
    
        var input = {
            method : 'post',
            returnedContentType : 'xml',
            path : path,
            body : {
                contentType: 'application/xml; charset=utf-8',
                content: request
            }
        };
        return input;
    }
    
    var targetPath = "/retailbank";
    
    function sendRequest(name, input) {
        var response = WL.Server.invokeHttp(input);
        WL.Logger.log(response);
    
        if (response.Envelope) {
            var data = response.Envelope.Body;
            data = data[name];
            response.result = data;
            delete response.Envelope;
            WL.Logger.log(response);
        }
        return response;
    }

    function GetBalance(accountNumber) {
        var parameters = new Object();
        parameters['accountNumber'] = accountNumber;
        var input = PrepareWebService('GetBalance', parameters, targetPath);
        WL.Logger.debug('SOAP request: ' + input.body.content);
        return sendRequest('GetBalanceResponse', input);
    }
    
    function TransferMoney(sourceAccountNumber, targetAccountNumber, value) {
        var parameters = new Object();
        parameters['sourceAccountNumber'] = sourceAccountNumber;
        parameters['targetAccountNumber'] = targetAccountNumber;
        parameters['value'] = value;
        var input = PrepareWebService('TransferMoney', parameters, targetPath);
        WL.Logger.debug('SOAP request: ' + input.body.content);
        return sendRequest('TransferMoneyResponse', input);
    }
    
    function FindMissingAccount(name, lastKnownAccountNumber) {
        var parameters = new Object();
        parameters['name'] = name;
        parameters['lastKnownAccountNumber'] = lastKnownAccountNumber;
        var input = PrepareWebService('FindMissingAccount', parameters, targetPath);
        WL.Logger.debug('SOAP request: ' + input.body.content);
        return sendRequest('FindMissingAccountResponse', input);
    }

El código JavaScript generado convierte los parámetros proporcionados en una solicitud JSON en un mensaje XML SOAP. La conversión de JSON a SOAP se implementa en la función PrepareWebService. La solicitud SOAP se pasa a Worklight, el cual invoca el servicio web de Microsoft .NET en la función WL.Server.invokeHttp.

Mensajes de ejemplo

El mensaje de solicitud XML SOAP para una llamada a la operación GetBalance implementada por el servicio web de Microsoft .NET, con un número de cuenta de 123456789, es parecido al siguiente:

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="urn://bankingapplication/retailbank_V1">
        <soap:Header/>
        <soap:Body>
            <tns:GetBalance>
                <accountNumber>123456789</accountNumber>
            </tns:GetBalance>
        </soap:Body>
    </soap:Envelope>

Worklight Server convierte automáticamente la respuesta XML SOAP del servicio web de Microsoft .NET en JSON para la aplicación móvil de origen:

    {
      "errors": [],
      "info": [],
      "isSuccessful": true,
      "result": {
        "NS1": "urn://bankingapplication/retailbank_V1",
        "lastUpdated": "20/06/2012 11:46:52",
        "returnValue": "1000.00"
      },
      "statusCode": 200,
      "statusReason": "OK",
      "warnings": []
    }

Volver a la especificación del patrón Worklight a Microsoft .NET: solicitud-respuesta