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) {
-
- 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:
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