Pular para o conteúdo principal

Problemas para criar cliente java de um webservice gerado no delphi

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:

  1. try {
  2. String wsURL = "http://server-call/webcliente/WebAgenda.dll/wsdl/IWebagenda?wsdl";
  3. Object[] params = { id, nome, nasc, sexo, doc, tel, cel, conv, mat, temp};
  4. Service service = new Service();
  5. Call call = (Call) service.createCall();
  6. call.setTargetEndpointAddress(wsURL);
  7. call.setOperationName("ReceberCliente");
  8. String ret = (String) call.invoke(params);
  9. System.out.println("Resultado: " +ret);
  10. } catch (Exception e) {
  11. // TODO Auto-generated catch block
  12. System.out.println(e.getMessage());
  13. e.printStackTrace();
  14. }
Quando tentava invocar o método do serviço passando os parametros necessários caia nessa exception:

  1. nested exception is:
  2. org.xml.sax.SAXException: Bad envelope tag: definitions
  3. AxisFault
  4. faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
Busquei 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

Comentários

Anônimo disse…
Hi, i got this error from the client in php "Bad envelope tag: definitions" the web service was made in Axis 1.4
Please Help
Anônimo disse…
Olá Rafael.

Eu passei pela mesma situação quando uma aplicação J2ME que eu estava desenvolvendo precisava acessar um webservice delphi.

Consegui resolver usando o projeto KSOAP. Postei no meu blog a solução.

http://programadorcarlosmaciel.blogspot.com/

Abraço.
Rafael Martins disse…
Opa, Carlos Maciel.
Obrigado pelo comentário.

É sempre bom ver essa troca de informações.
Na época não lembro de ter encontrado nada sobre o KSOAP, bom saber de sua existência.

Abração.
Decio Schmitt disse…
Boa tarde;

So para comentar passei pelo mesmo problema um outra solução, e montar o elemento Soap no braco, é trabalhoso mas funciona monte o request xml e envie o envelope usando as classes:

SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
MessageFactory messageFactory = MessageFactory.newInstance();

SOAPMessage message = messageFactory.createMessage(new MimeHeaders(), new ByteArrayInputStream(xml.getBytes(Charset.forName("UTF-8"))));

String response = message.getSOAPPart().getEnvelope().getBody().getTextContent()

Falow.

Postagens mais visitadas deste blog

Cursos Gratuitos Udemy

Aproveitem para acumular conhecimento! Cursos pagos que estão de graça na Udemy: Python:  https://lnkd.in/epdtT8Y Ionic 3:  https://lnkd.in/e8mdY4V HTML5:  https://lnkd.in/eRZVUSN Android:  https://lnkd.in/eHg7kbz C++:  https://lnkd.in/eZvb4rV Python:  https://lnkd.in/ekavMui C e C++:  https://lnkd.in/eKUJ97p Unity 5:  https://lnkd.in/e-ftZCJ Unreal Engine 4:  https://lnkd.in/ekzWpBg Web com Github pages:  https://lnkd.in/eNfr_eS Git:  https://lnkd.in/er4im7H WordPress:  https://lnkd.in/eYExqay Jekyll:  https://lnkd.in/e4m5Q7q WordPress:  https://lnkd.in/eMffdp2 React.js:  https://lnkd.in/eE67yas Unity3D:  https://lnkd.in/ecM63B6 HTML:  https://lnkd.in/eAQFGqy C++:  https://lnkd.in/evqDkeM Algoritmos e lógica:  https://lnkd.in/ehuYnvN JavaScript:  https://lnkd.in/e9EppKs Qlikview:  https://lnkd.in/e5ZufxV Algoritmos e lógica:  https://lnkd.in/e_E3Dry Python:  https://lnkd.in/ejTKa3W Introdução à programação de computadores:  https://goo.gl/Mi3hbF Terminal L

SOA - Service Oriented Architecture (Arquitetura Orientada a Serviços)

O SOA representa uma nova geração da plataforma da computação distribuída. SOA é uma filosofia de TI que visa facilitar a integração entre sistemas, orientando a criação e a disponibilização de soluções modulares e fracamente acopladas baseadas no conceito de serviços. É um estilo de arquitetura de software cujo princípio fundamental prega as funcionalidades implementadas pelas aplicações devem ser disponibilizadas na forma de serviços. Freqüentemente estes serviços são conectados através de um “barramento de serviços” que disponibiliza interfaces, ou contratos, acessíveis através de Web Service ou outra forma de comunicação entre aplicações. ::benefícios... Facilidade de criar/controlar processos, diminuição de redundâncias (em todos os níveis), aumento da capacidade de expandir operações.  Muitos são as vantagens de se implementar SOA, abaixo descrevemos alguns: ::onde atuar... Dificuldade de comunicação entre aplicações, dificulda