Enviar solicitud de HTTP Post con acción SOAP usando org.apache.http

Intento escribir una solicitud de publicación HTTP codificada con acción SOAP, usando la API ap.apache.http. Mi problema es que no encontré la forma de agregar un cuerpo de solicitud (en mi caso, acción SOAP). Me alegrará por alguna orientación.

import java.net.URI; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.RequestWrapper; import org.apache.http.protocol.HTTP; public class HTTPRequest { @SuppressWarnings("unused") public HTTPRequest() { try { HttpClient httpclient = new DefaultHttpClient(); String body="DataDataData"; String bodyLength=new Integer(body.length()).toString(); System.out.println(bodyLength); // StringEntity stringEntity=new StringEntity(body); URI uri=new URI("SOMEURL?Param1=1234&Param2=abcd"); HttpPost httpPost = new HttpPost(uri); httpPost.addHeader("Test", "Test_Value"); // httpPost.setEntity(stringEntity); StringEntity entity = new StringEntity(body, "text/xml",HTTP.DEFAULT_CONTENT_CHARSET); httpPost.setEntity(entity); RequestWrapper requestWrapper=new RequestWrapper(httpPost); requestWrapper.setMethod("POST"); requestWrapper.setHeader("LuckyNumber", "77"); requestWrapper.removeHeaders("Host"); requestWrapper.setHeader("Host", "GOD_IS_A_DJ"); // requestWrapper.setHeader("Content-Length",bodyLength); HttpResponse response = httpclient.execute(requestWrapper); } catch (Exception e) { e.printStackTrace(); } } } 

El soapAction debe pasar como un parámetro de encabezado http: cuando se usa, no es parte del http-body / payload.

Busque aquí un ejemplo con apache httpclient: http://svn.apache.org/repos/asf/httpcomponents/oac.hc3x/trunk/src/examples/PostSOAP.java

Este es un ejemplo completo de trabajo:

 import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; public void callWebService(String soapAction, String soapEnvBody) { // Create a StringEntity for the SOAP XML. String body =""+soapEnvBody+""; StringEntity stringEntity = new StringEntity(body, "UTF-8"); stringEntity.setChunked(true); // Request parameters and other properties. HttpPost httpPost = new HttpPost("http://example.com?soapservice"); httpPost.setEntity(stringEntity); httpPost.addHeader("Accept", "text/xml"); httpPost.addHeader("SOAPAction", soapAction); // Execute and get the response. HttpClient httpClient = new DefaultHttpClient(); HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); String strResponse = null; if (entity != null) { strResponse = EntityUtils.toString(entity); } } 

... using org.apache.http api. ...

SOAPAction incluir SOAPAction como encabezado en la solicitud. Como tiene los httpPost y requestWrapper , hay tres maneras de agregar el encabezado.

  1. httpPost.addHeader( "SOAPAction", strReferenceToSoapActionValue ); 2. httpPost.setHeader( "SOAPAction", strReferenceToSoapActionValue ); 3. requestWrapper.setHeader( "SOAPAction", strReferenceToSoapActionValue ); 

La única diferencia es que addHeader permite múltiples valores con el mismo nombre de encabezado y setHeader permite nombres únicos de encabezado. setHeader(... sobre escribe el primer encabezado con el mismo nombre.

Puede ir con cualquiera de estos en su requerimiento.

La forma más sencilla de identificar lo que debe establecerse en la acción soap al invocar el servicio WCF a través de un cliente java sería cargar el wsdl, ir al nombre de la operación que coincida con el servicio. A partir de ahí, seleccione el URI de acción y configúrelo en el encabezado de acción de soap. Estás listo.

eg: de wsdl

    

Ahora en el código java debemos establecer la acción soap como el URI de acción.

 //The rest of the httpPost object properties have not been shown for brevity string actionURI='http://tempuri.org/IMyService/MyOperation'; httpPost.setHeader( "SOAPAction", actionURI); 

Daba el código de respuesta 415 Http como error,

Así que agregué

 httppost.addHeader("Content-Type", "text/xml; charset=utf-8"); 

Todo está bien ahora, Http: 200