Este exemplo é uma forma incomum de consumir um Web Service é enviar de sua aplicação uma mensagem no formato SOAP para um ou mais métodos daquele serviço, a pouco tempo tive de tratar um caso assim, e por isso montei esse exemplo referente a esta forma de tratar uma requisição. Para simplificar a implementação monto um exemplo baseado no tópico : Gerando WebServices com JAX-WS.
Para realizar a requisição a um método do Web Service utilizo a Classe UrlConnection para fazer a conexão, chamar o método e setar as propriedades de requisição.
O método a ser testado é o retornarString para isso enviaremos a seguinte mensagem SOAP.
Não indico consumir um serviço desta forma, a melhor forma sempre será gerar os stubs do lado cliente, porém podemos também consumir um serviço desta maneira, realizo a implementação de forma simples passando a requisição dentro de uma String mas também podemos montar essa entrada dentro do próprio código com XStream nada nos impede de criar e implementar códigos de modo genérico para que atendam nossas necessidades.
package br.com.service.soap.request;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
public class RequisicaoSoap {
public static void main(String[] args) {
try{
String msgRetorno = "";
// Definir a URL Do Serviço sem a ?WSDL no fim
URL url = new URL("http://localhost:8080/WsServidor");
URLConnection conn = url.openConnection();
// Define que a Conexão terá uma saída/retorno
conn.setDoOutput(true);
// Método a ser Consumido pela requisição
conn.setRequestProperty("SOAPAction","http://localhost:8080/WsServidor/retornarString");
// Propriedades da Mensagem SOAP
conn.setRequestProperty("Type","Request-Response");
conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
conn.setRequestProperty("Accept-Encoding","gzip,deflate");
conn.setRequestProperty("User-Agent","Jakarta Commons-HttpClient/3.1");
// Canal de Saída da Requisição
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
// Mensagem no Formato SOAP
String xml = " <soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ser='http://service/'>"+
" <soapenv:Header/>"+
" <soapenv:Body>"+
" <ser:retornarString>"+
" <msg>Testando Requisicao SOAP</msg>"+
" </ser:retornarString>"+
" </soapenv:Body>"+
" </soapenv:Envelope>";
wr.write(xml);
wr.flush();
System.out.println("Requisição >> "+conn.getOutputStream());
// Leitura da Resposta do Serviço
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// Leituras das Linhas da Resposta
while (rd.ready()){
msgRetorno += rd.readLine();
}
wr.close();
rd.close();
conn.getInputStream().close();
System.out.println("Resposta >> "+ msgRetorno);
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("Fim");
}
}
}