Chamando serviços SOAP sem Proxy, Stubs e afins

Uma das dificuldades em projetos com Web Services utilizando SOAP/XML é a necessidade de gerar as classes clientes para a invocação do serviço. Tá certo que isso é feito de maneira muito simples com as ferramentas necessárias, mas fiquei com uma certa inveja do PHP. Nesse artigo, podemos ver que é muito simples invocar serviços SOAP no PHP. Tá certo que não tem as validações de estrutura e verificações que o jeito tradicional Java tem, mas em alguns casos, como testes unitários de serviços é muito mais simples fazer dessa forma. Pensando nisso criei um utilitário para facilitar esse tipo de requisição.

É só colocar a lib no classpath e utilizá-la. Você pode fazer o download do fonte ou dessa lib no Google Code, o código fonte está disponível também no GitHub. Para utilizá-la é muito simples. Você pode inclusive fazer tudo em uma linha, dessa forma:

[sourcecode language=”java”]
String response = new SoapClient("http://endpointhost.com/endpoint").invokeOperation("operation", "<payload>something</payload");
[/sourcecode]

Ou se você quiser algo mais organizado, segue um exemplo de um serviço de conversão de peso:

[sourcecode language=”java”]
String endpoint = "http://www.webservicex.net/ConvertWeight.asmx";
String operation = "http://www.webserviceX.NET/ConvertWeight";
String input = "<web:ConvertWeight xmlns:web=\"http://www.webserviceX.NET/\">"
+ "<web:Weight>7</web:Weight>"
+ "<web:FromUnit>Grains</web:FromUnit>"
+ "<web:ToUnit>Grams</web:ToUnit>" + "</web:ConvertWeight>";

SoapClient soapClient = new SoapClient(endpoint);

String response = response = soapClient.invokeOperation(operation, input);
[/sourcecode]

O response terá o seguinte conteúdo:

[sourcecode language=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ConvertWeightResponse xmlns="http://www.webserviceX.NET/">
<ConvertWeightResult>0.4536</ConvertWeightResult>
</ConvertWeightResponse>
</soap:Body>
</soap:Envelope>
[/sourcecode]

Agora vou usar nos meus testes de serviços.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6