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

História do Assembly

Provavelmente a primeira linguagem de programação. O Assembly surgiu em meados da década de 50. Os computadores ainda usavam válvulas. Considerada uma grande evolução na linguagem de computação, pois se utilizou de grandes abstrações, aumentando produtividade e segurança. O Assembly substitui uma instrução em linguagem de máquina por um comando legível ao ser humano. Exemplos de instruções em Assembly: add, mul, div, and, not, or. Pondendo-se ainda, o usuário, criar variváveis e lidar com elas através dessas instruções e algumas outras existentes na linguagem Assembly. A linha de instrução "add x, y" significa dizer que estou mandando somar os valores de x e y. Esse resultado deve ser armazenado em um registrador. Registradores são áreas dentro de um processador mais rápidas que operadores de memória. São 8 registradores gerais: EAX, EDX, ECX, EBX, ESI, EBP, ESP e EDI. Programando, devemos utilizar apenas 6 destes registradores, devido a os registradores ESP e EBP serem uti...

DISTINCT x UNIQUE, existe diferença?

Não. "Utilize DISTINCT ou UNIQUE se você quiser que o Oracle retorne apenas uma cópia de cada conjunto de linhas duplicadas selecionadas (estas duas palavras-chave são sinônimos). As linhas duplicadas são aquelas com valores correspondentes para cada expressão na lista de seleção." UNIQUE é uma função do ORACLE e não funcionará em outros bancos de dados (MySQL, PostgreSQL, etc...) Fonte: Oracle9i SQL Reference Release 2