WebServices com Tipos Complexos
Autor: Felipe Ramos | Publicado: 2012-01-09T15:50:00-08:00

O post de hoje foi uma contribuição enviada pelo colega Samuel Carvalho (sam.goes@gmail.com). Um texto muito bom e bastante detalhado tratando de Webservices com tipos complexos, tanto os que recebem tipos complexos como parâmetro de entrada como os que retornam esse tipo de dado.Alguns WebServices recebem parâmetros do tipo complexo (ComplexType). Nesses casos, é necessário passar como parâmetro para a função Chamar Serviço Web (Soap 1.2) o envelope Soap (estrutura XML) contendo os parâmetros de entrada do método a ser consumido e o cabeçalho da requisição. O retorno do WebService também será um objeto do tipo complexo.O exemplo a seguir irá demonstrar, no Maker, como consumir e exibir o retorno de um WebService que recebe parâmetros do tipo complexo. Se você está tentando consumir um Webservice que recebe como parâmetro  um tipo complexo, esta informação é tratada na primeira parte do texto.  No entanto se o seu Webservice apenas retorna um tipo complexo, vá  direto para a parte 2 do texto.Parte 1: Utilizando a ferramenta SoapUI para conhecer o WebserviceExiste uma ferramenta bem interessante chamada SoapUI, onde é possível consumir qualquer tipo de WebService. A utilização dessa ferramenta de apoio faz-se necessária para que possamos verificar se o WebService está ativo, sendo possível consumi-lo, verificando os métodos, portas, parâmetros e retorno do serviço disponível.Iremos utilizar o WebService de CEP, o qual possui parâmetros do tipo complexo.Endereço: http://www.autocep.com.br/webcep/wsEndereco.asmx?WSDLNo SoapUI ao clicarmos em File, New soapUI Project é possível adicionar o endereço do WebService no campo Inicial WSDL/WADL, conforme a imagem a seguir:Com o projeto criado é possível visualizar as portas utilizadas pelo WebService (wsEnderecoSoap12 e wsEnderecoSoap) e também os métodos de cada porta.  No nosso exemplo, iremos consumir o método AutenticaCliente da porta wsEnderecoSoap, conforme imagem abaixo:Ao expandir o método e clicar na opção Request1, é possível verificar o envelope Soap, composto pelo cabeçalho (Header) e pelo Body. No Body é possível verificar os parâmetros do método: idCliente, chave, CEP. Segue a estrutura do XML abaixo:Para teste colocamos os valores fixos. No idCliente colocamos 1, na chave colocamos "teste" e no CEP "123", conforme imagem abaixo:Ao clicar no botão submit (seta verde abaixo da palavra Request 1) é possível executar o método do WebService com os parâmetros informados na estrutura XML. O SoapUI  irá apresentar uma outra janela com o resultado. No caso do nosso exemplo é possível visualizar esse resultado na próxima imagem:O retorno desse WebService é um XML. Verifique o destaque na imagem acima com a mensagem de que o cliente não existe, ou seja, os parâmetros informados não são válidos e o método do WebService retornou essa mensagem dentro do XML.Ok. Agora que nós conhecemos o WebService que será utilizado, através do SoapUI, podemos partir para as funções no Maker.Parte 2: Consumindo o WebService no MakerApenas consumindo o WebService pelo SoapUI já fica claro três dos quatro parâmetros que são necessários para a função Chamar Serviço Web (SOAP 1.2):1. URL do WebService = http://www.autocep.com.br/webcep/wsEndereco.asmx?WSDL2. Porta = wsEnderecoSoap3. Nome do Método = AutenticaClienteSó falta o 4º parâmetro que refere-se ao envelope Soap que será enviado. Basta copiar o conteúdo da tag Body no SoapUI e adicionar na tag  a declaração do namespace “wsen” que encontra-se na tag Envelope:xmlns:wsen="http://www.autocep.com.br/webcep/wsEndereco.asmx"Esse procedimento faz-se necessário, pois o envelope a ser passado para a função no Maker não inclui a tag Envelope, somente o Body. Portanto temos que declarar esse nameSpace na tag  no Soap Body do XML.  O nameSpace é necessário pois é a referência do WebService que será consumido. Confira como irá ficar o XML na imagem abaixo:É o conteúdo selecionado na imagem acima que será passado no 4º parâmetro da função Chamar Serviço Web (SOAP 1.2), dentro da lista (função Criar lista a partir dos elementos).No Maker inicialmente função ficará assim:Porém, o retorno do WebService é um objeto, e teremos que usar a função “Objeto para Mapa”, para que possamos transformar esse objeto em um mapa e obter as chaves desse mapa. Para obter as chaves, usaremos a função “Lista de Chaves do Mapa”. Acima dessa função iremos usar “Alertar Aguardando Ok” para exibir as chaves na tela. Com a informação das chaves, será possível chegar ao valor desejado. O fluxo então ficará assim:No Webrun, ao executar o fluxo podemos visualizar as chaves obtidas:Agora que já sabemos as chaves do nosso mapa, usaremos a função “Obter Elemento”, passando no primeiro parâmetro o mapa (função “Objeto para Mapa”) e a chave desejada para obter o elemento. Usaremos a chave AUTENTICACLIENTERESULT para buscar o nosso resultado.O fluxo ficará dessa forma:Porém, o elemento obtido desse mapa será um outro objeto, e iremos realizar o mesmo processo descrito anteriormente, ou seja, usaremos a função “Objeto para Mapa”, e a função “Lista de Chaves do Mapa”, e acima desta, a função “Alertar Aguardando OK” para exibir as chaves na tela. O fluxo ficará dessa forma:Ao executar o fluxo novamente no Webrun, é possível visualizar as chaves retornadas do segundo mapa.Novamente iremos realizar o mesmo processo descrito anteriormente, ou seja, obter o elemento do mapa com a função “Obter elemento”, passando o segundo mapa obtido (função “Objeto para Mapa”) e a chave EXTRAELEMENT. Usaremos a função “Alertar Aguardando Ok” para alertar o resultado na tela. O fluxo ficará dessa forma:Esse é o fluxo final para obter o retorno do WebService. No Webrun é possível visualizar o resultado:O retorno do WebService é um XML contendo a mensagem de que o cliente é inativo ou inexistente. Percebam que é a mesma mensagem retornada pelo SoapUI.ConclusãoVerificamos que não é complicado consumir um WebService no Maker que recebe parâmetros do tipo complexo. O que precisamos é conhecer o WebService que será consumido, e a utilização do SoapUI como auxílio ajuda bastante a entender a estrutura do XML antes de partir para a utilização no Maker. Em relação as funções percebam que o fluxo do exemplo ficou simples, e é importante destacar a utilização da função “Alertar Aguardando Ok” para visualizar os resultados e saber o que está sendo retornado pelas funções, principalmente o retorno da função “Lista de Chaves do Mapa”.Links:Download do SoapUIUtilizando o SoapUI