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:
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
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();
- }
- nested exception is:
- org.xml.sax.SAXException: Bad envelope tag: definitions
- AxisFault
- faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
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
Please Help
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.
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.
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.