Problemas para criar cliente java de um webservice gerado no delphi
Autor: rbamartins | Publicado: 2008-07-06T12:23:00-03:00

Neste post irei relatar aqui problemas que ocorreram quando tentava criar um cliente em Java de um webservice gerado no Delphi.Por algumas vezes já precisei trabalhar com Webservices, como servidor e como cliente. Sempre usando tecnologias do JAVA, algumas vezs .NET.Recentemente, precisei criar um cliente para um serviço desenvolvido em Delphi executado a partir de uma dll.Para minha surpresa tive problemas na implementação, para uma surpresa ainda maior encontrei muitos programadores na internet com este mesmo problema que será aqui relatado.Essa dificuldade e o pouco material encontrado sobre o assunto serviram de motivação para publicá-lo aqui.Problema: Comecei salvando o wsdl do serviço, como sempre faço, e através do Eclipse (IDE de desenvolvimento Java) com alguns plugins, WSDL2Java, da API do APACHE AXIS 1.3 tentei gerar o cliente e não obtive êxito.O erro apresentado era sempre esse:IWAB0399E Error in generating Java from WSDL:  WSDLException (at /definitions/binding/operation/input): faultCode=INVALID_WSDL: Element '{http://schemas.xmlsoap.org/wsdl/}input' contained unexpected attributes: 'message': Procurei outras formas de gerar os clientes. Tentei da forma mais básica também com AXIS 1.3, mas agora sem uso de plugins.Segue abaixo uma parte do código:try {              String wsURL = "http://server-call/webcliente/WebAgenda.dll/wsdl/IWebagenda?wsdl";                Object[] params = { id, nome, nasc, sexo, doc, tel, cel, conv, mat, temp};                Service service = new Service();                Call call = (Call) service.createCall();                call.setTargetEndpointAddress(wsURL);                call.setOperationName("ReceberCliente");                String ret = (String) call.invoke(params);                            System.out.println("Resultado: " +ret);                          } catch (Exception e) {              // TODO Auto-generated catch block              System.out.println(e.getMessage());              e.printStackTrace();      } Quando tentava invocar o método do serviço passando os parametros necessários caia nessa exception:nested exception is:       org.xml.sax.SAXException: Bad envelope tag:  definitions  AxisFault   faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userExceptionBusquei então outras API's do Java como XFIRE da Codehaus e JAX-WS da própria Sun e excessões equivalentes ocorriam. Foi então que resolvi analisar melhor o WSDL do serviço gerado em Delphi.Percebi então que a estrutura deste webservice era totalmente diferente de um gerado em Java ou .Net.Pesquisando na internet encontrei informações dizendo que a plataforma Delphi gerava as interfaces de um webservice que não era compatível com o WS-I (padrão suportado pelo Java e .NET), ou seja, o serviço delphi não era interoperável com a plataforma Java e .NET.WS-I é o perfil básico de interoperabilidade.O próximo passo era tentar fazer o Delphi gerar seu serviço no padrão WS-I, porém, até a publicação deste post a empresa responsável em prover esse serviço não havia conseguido efetuar tal tarefa.Solução:Foi necessário solicitar que desenvolvessem novamente o webservice, que agora foi feito em .NET. A partir daqui a geração dos clientes se deu normalmente sem maiores complicações.Pelo que conheço de SOA e Webservices este tipo de implementação provem comunicação entre qualquer linguagem, pois sua principal caracterísca é ser baseado em XML.Um serviço web provê interoperabilidade entre máquinas em uma rede, neste caso a internet. E, um erro como esse fura o conceito dessa tecnologia. Caso esteja errado sintam-se a vontade para postar comentários e me corrigir.Obrigado a todos, Rafael Martins