Adaptadores Worklight e o Padrão Worklight para Microsoft .NET: Solicitação-Resposta

Adaptadores Worklight são o código lado do servidor dos aplicativos implementados no e atendidos pelo Worklight Mobile Application Platform. Os adaptadores conectam o Worklight Server a aplicativos corporativos, como aqueles em execução no WebSphere Message Broker. A sequência a seguir percorre um típico fluxo de dados entre um aplicativo remoto e um serviço da web do Microsoft .NET em execução no Message Broker:

  1. O adaptador expõe um conjunto de serviços, chamados de procedimentos. O adaptador e o aplicativo remoto são implementados no Worklight Server.
  2. O aplicativo remoto chama procedimentos emitindo solicitações Ajax (WL.Client.invokeProcedure). Parâmetros para o procedimento são passados como dados formatados como JSON.
  3. O procedimento converte parâmetros JSON em uma mensagem de solicitação SOAP XML.
  4. O procedimento chama o serviço da web do Microsoft .NET em execução no Message Broker.
  5. O serviço da web Microsoft .NET retorna dados como uma resposta SOAP XML.
  6. Os dados formatados em XML são convertidos em JSON pelo Worklight Server.
  7. Os dados JSON são enviados de volta para o aplicativo remoto de origem.

Esse padrão gera um adaptador Worklight que pode chamar cada método selecionado em sua classe .NET. O adaptador converte solicitações JSON de aplicativos remotos em solicitações de serviço da web em sua classe Microsoft .NET. Por exemplo, suponhamos que os seguintes métodos C# estejam em uma classe chamada RetailBank e você as tenha selecionado para uma instância padrão chamada 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);

O fragmento de JavaScript a seguir mostra como um aplicativo remoto pode chamar o 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 propósitos de teste, o adaptador Worklight implementado pode ser chamado com o uso de um navegador da web com a seguinte URL:

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

Arquivos Gerados

Esta seção explica os arquivos gerados para o adaptador Worklight.

Adaptador Worklight

O padrão cria um adaptador Worklight com dois arquivos de configuração. O primeiro arquivo de configuração (MyBank.xml) é o arquivo XML do adaptador. O arquivo XML do adaptador é usado para configurar a conectividade com o Message Broker e para declarar os procedimentos expostos pelo adaptador para aplicativos remotos e outros adaptadores. O exemplo abaixo mostra o arquivo de configuração XML do adaptador gerado:

    <?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>Worklight integration adapter for the Microsoft .NET service</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>

Muitos dos valores nesse arquivo XML do adaptador são configurados a partir de parâmetros padrão (por exemplo, displayName, domain e port). Também é possível ver que um procedimento foi configurado para cada método .NET. Procedimentos definem um processo para acessar as operações expostas pelo serviço da web Microsoft .NET. Há um procedimento para cada operação no serviço da web.

O padrão também gera um arquivo JavaScript (MyBank-impl.js) que contém as funções de implementação para cada procedimento:

    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);
    }

O código Javascript gerado converte os parâmetros fornecidos em uma solicitação em uma mensagem SOAP XML. A conversão de JSON em SOAP é implementada na função PrepareWebService. A solicitação SOAP é passada para o Worklight, que chama o serviço da web Microsoft .NET na função WL.Server.invokeHttp.

Mensagens de Exemplo

A mensagem de solicitação SOAP XML para uma chamada para a operação GetBalance implementada pelo serviço da web Microsoft .NET, com um número de conta de 123456789, é semelhante a esta:

    <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>

O Worklight Server converte automaticamente a resposta SOAP XML do serviço da web Microsoft .NET em JSON para o aplicativo remoto de origem:

    {
      "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": []
    }

Voltar ao Worklight para Microsoft .NET: especificação de padrão solicitação-resposta