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, tales como las que se ejecutan en WebSphere Message Broker. La secuencia siguiente le guía por un flujo típico de datos entre una aplicación móvil y el servicio web de Microsoft .NET que se ejecuta en Message Broker:

  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 invoca el servicio web de Microsoft .NET que se ejecuta en Message Broker.
  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 invocar 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, presupongamos que los siguientes métodos C# están en una clase denominada RetailBank y que ha seleccionado para los mismos una instancia de patrón denominada 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);

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

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

Archivos generados

Esta sección le describe los archivos generados 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 del adaptador se utiliza para configurar la conectividad para Message Broker y para declarar los procedimientos expuestos por el adaptador para las aplicaciones móviles y para 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). También puede ver que 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 similar a este:

    <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