How to send a SOAP request using WebServiceTemplate?
You can use following code, you do not need to define anything in xml file.
try { SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory( MessageFactory.newInstance()); messageFactory.afterPropertiesSet(); WebServiceTemplate webServiceTemplate = new WebServiceTemplate( messageFactory); Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("PACKAGE"); marshaller.afterPropertiesSet(); webServiceTemplate.setMarshaller(marshaller); webServiceTemplate.afterPropertiesSet(); Response response = (Response) webServiceTemplate .marshalSendAndReceive( "address", searchFlights); Response msg = (Response) response; } catch (Exception s) { s.printStackTrace(); }
To send different SOAP requests to different SOAP services, you just need to make your WebServiceTemplate aware of all requests and responses it will have to process.
Create a Java class for each request and response like so:
package models;import javax.xml.bind.annotation.XmlRootElement;import java.io.Serializable;@XmlRootElementpublic class FlyRequest implements Serializable { private boolean nearByDeparture; public FlyRequest() {} public boolean isNearByDeparture() { return nearByDeparture; } public void setNearByDeparture(boolean nearByDeparture) { this.nearByDeparture = nearByDeparture; }}
(The @XmlRootElement is because we use JAXB marshaller below; see Jaxb reference for more info).
The setup of the template is done for example like so:
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance()); messageFactory.afterPropertiesSet(); WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory); Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("models"); marshaller.afterPropertiesSet(); webServiceTemplate.setMarshaller(marshaller); webServiceTemplate.afterPropertiesSet();
"models" is the name of the package where the Request/Responses classes are, so that jaxb can find them.
Then you just instantiate the request of the class you want to perform the call, like so:
// call fly service: FlyRequest flyRequest = new FlyRequest(); flyRequest.setNearByDeparture(false); Object flyResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/fly", flyRequest); // call purchase service: PurchaseRequest purchaseRequest = new PurchaseRequest(); purchaseRequest.setPrice(100); Object purchaseResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/purchase", purchaseRequest);
Similarly, you can cast the response objects into your JAXB classes defined above.
Here is an Example what you should be looking for
Soap has a lot of restriction unlike REST
, It follows some standards which have to be meet before you get Network call to work,
But unlike Rest
, in Soap if you have WSDL
URL you can get all the information needed to call the Soap call
private final String NAMESPACE = "http://www.w3schools.com/webservices/";private final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";private final String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit";private final String METHOD_NAME = "CelsiusToFahrenheit";
this code was written in Android
so you can ignore some part of it but I still kept it in answer so someone from android background can put a good use to it
Open [WSDL][1]
in browser and check for the things which matter to call a remote method on server.
1 you will see an attribute
targetNamespace
whose value would beNamespace
which you will use in this caseNamespace
ishttp://www.w3schools.com/webservices/
2 Now you require the name of the method this
WSDL
has four method each of the are int attributes:element
with the value is the name of the Method in this case four methods areFahrenheitToCelsius
,FahrenheitToCelsiusResponse
,CelsiusToFahrenheit
,CelsiusToFahrenheitResponse
3 Now you have to fure out the
SOAP Action
which isNAMESPACE+METHOD
but WSDL also gives information about that as well, look for the tagsoap:operation
and it'ssoapAction
attribute havs the Soap action as it's value in this case which we want to call ishttp://www.w3schools.com/webservices/CelsiusToFahrenheit
private class MyTask extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog.show(); } @Override protected String doInBackground(Void... params) { try { SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); soapObject.addProperty("Celsius","12"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE httpTransportSE = new HttpTransportSE(URL); httpTransportSE.call(SOAP_ACTION, envelope); SoapPrimitive soapPrimitive = (SoapPrimitive)envelope.getResponse(); Log.d("TAG", "doInBackground: "+soapPrimitive.toString()); return soapObject.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String aVoid) { super.onPostExecute(aVoid); progressDialog.dismiss(); textView.setText(""+aVoid); }}