Sunday, December 17, 2017

Java Code to process Soap Request

 Hi guys, welcome to my blog. This post contains a sample java code to send soap request with XML post body. Recently in our project, we got a different requirement that we need to send soap request using Java code. For this example demo, I am using sample request available on this website.

In this example below are the details which I am going to use.

URL - www.dneonline.com/calculator.asmx
POST Body-
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Add xmlns="http://tempuri.org/">
      <intA>1</intA>
      <intB>2</intB>
    </Add>
  </soap:Body>
</soap:Envelope>

Headers-
Content-Type:text/xml; charset=utf-8
Content-Length:length
SOAPAction:"http://tempuri.org/Add"

Below is the Java code for sending the above request,


package com.srikanth.SoapRequestExample;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class SoapRequest {
  
  public static void main(String a[]){
   try {
    int a1=3;
    int b=4;
    String requestXML="<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><Add xmlns=\"http://tempuri.org/\"><intA>"+a1+"</intA><intB>"+b+"</intB></Add> </soap:Body></soap:Envelope>";
    
    //We are creating and instance for URL class which is pointing to our specified url path
    URL url = new URL("http://www.dneonline.com/calculator.asmx");
    
    //Now we are opening the url connection  using the URLConnection class
    URLConnection connection = url.openConnection();
    
    //Converting the connection HTTP
    //If you want to convert to HTTPS use HttpsURLConnection
    HttpURLConnection httpConn = (HttpURLConnection) connection;
    
    //Below are the statements that gives the header details for the url connection
    httpConn.setRequestProperty("Content-Length", "length");
    httpConn.setRequestProperty("Content-Type","text/xml");
    httpConn.setRequestProperty("SOAPAction","http://tempuri.org/Add");
    httpConn.setRequestMethod("POST");
    
    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);

    //Sending the post body to the http connection
    OutputStreamWriter out=new OutputStreamWriter(httpConn.getOutputStream());
    out.write(requestXML);
    out.close();
    
    InputStream newIP=httpConn.getInputStream(); 
    String temp;
    String tempResponse = "";
    String responseXML;
    
    // Read the response and write it to standard out.
    InputStreamReader isr = new InputStreamReader(newIP);
    BufferedReader br = new BufferedReader(isr);
    
    
    // Create a string using response from web services
    while ((temp = br.readLine()) != null) {
     tempResponse = tempResponse + temp;
     
    }
    responseXML = tempResponse;
    System.out.println(responseXML);
    //this.outputResponse=responseXML;
    br.close();
    isr.close();
    
    }
   catch (java.net.MalformedURLException e) {
    System.out.println("Error in postRequest(): Secure Service Required");
    e.printStackTrace();
   
   } catch (Exception e) {
    System.out.println("Error in postRequest(): " + e.getMessage());
    }
   
  }
  
}

      Most of the explanation for the above code is given in form of comments.

Note: We need to use a try-catch block to capture the exception as the URLConnection/ HttpURLConnection will throw an exception.


After successful execution, we can see the following result in the console.

Outut Response Body:
<?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>
        <AddResponse
            xmlns="http://tempuri.org/">
            <AddResult>7</AddResult>
        </AddResponse>
    </soap:Body>
</soap:Envelope>