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

Os adaptadores Worklight são o código do lado do servidor de aplicativos implementados 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 apresenta um fluxo típico de dados entre um aplicativo remoto e um serviço da web 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). Os parâmetros para o procedimento são passados como dados formatados pelo JSON.
  3. O procedimento converte os parâmetros JSON em uma mensagem de solicitação XML SOAP.
  4. O procedimento chama o serviço da web do Microsoft .NET em execução no Message Broker.
  5. O serviço da web do Microsoft .NET retorna dados como uma resposta XML SOAP.
  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, vamos supor que os métodos C# a seguir estejam em uma classe chamada RetailBank e você os 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 a seguir de JavaScript 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 usando um navegador da web com a URL a seguir:

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 como o Message Broker e para declarar os procedimentos expostos pelo adaptador para aplicativos remotos e para 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>Adaptador de integração Worklight para o serviço 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>

Muitos dos valores nesse arquivo XML do adaptador são configurados a partir dos parâmetros de padrão (por exemplo displayName, domain e port). Também é possível ver se um procedure foi configurado para cada método .NET. Os procedimentos definem um processo para acessar as operações expostas pelo serviço da web Microsoft .NET. Há um procedure 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 JSON em uma mensagem XML SOAP. A conversão JSON para 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 XML SOAP de 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 XML SOAP do serviço da web Microsoft .NET em JSON do 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 para a Especificação do Padrão Worklight para Microsoft .NET: Solicitação-Resposta