Enviando uma Requisição SOAP a um Serviço

Enviando uma Requisição SOAP a um Serviço

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.

Exemplo Mensagem no Padrão SOAP

<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>

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");
	    }
      }
}

Resposta do Serviço:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:retornarStringResponse xmlns:ns2="http://service/">
         <return>echo :: Testando Requisicao SOAP</return>
      </ns2:retornarStringResponse>
   </S:Body>
</S:Envelope>

Last updated