Difference between revisions of "Access an external web service using SOAP"

From AgileApps Support Wiki
imported>Aeric
imported>Aeric
Line 66: Line 66:
</syntaxhighlight>
</syntaxhighlight>


And here is the code that uses that WSDL to access the remote service and connect to it. To use this code, you would place it into a <tt>Calculator</tt> class, and invoke the <tt>add()</tt> method from a Rule or from other platform code.
Here is the code that uses that WSDL to access the remote service and connect to it. To use this code, you would place it into a <tt>Calculator</tt> class, and invoke the <tt>add()</tt> method from a Rule or from other platform code.
:<syntaxhighlight lang="xml" enclose="div">
:<syntaxhighlight lang="xml" enclose="div">
import com.platform.api.*;
import com.platform.api.*;
Line 93: Line 93:
"</SOAP-ENV:Envelope>";
"</SOAP-ENV:Envelope>";
        
        
       HttpConnection con = new HttpConnection(CONSTANTS.HTTP.METHOD.POST, "http://mydomain.com/Calculator/Calculator.asmx");
       HttpConnection con = new HttpConnection(
     
          CONSTANTS.HTTP.METHOD.POST,
      con.addHeader("SOAPAction","http://mydomain.com/calculator/#Add");
          "http://mydomain.com/Calculator/Calculator.asmx");
        
        
      con.addHeader("SOAPAction","http://mydomain.com/calculator/#Add");     
       con.addHeader("Content-Type","text/xml");
       con.addHeader("Content-Type","text/xml");
     
       con.setRequestBody(soapRequest);
       con.setRequestBody(soapRequest);
        
        
       int code = con.execute();
       int code = con.execute();
     
       String response = con.getResponse();
       String response = con.getResponse();
       /*
       /*
Sample Response
Sample Response
Line 116: Line 114:
  </SOAP-ENV:Body>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
</SOAP-ENV:Envelope>
       */
       */
   
   
       //Extracting the result element from the response
       //Extract the result element from the response:
       //First convert xml response to JSON using org.json package
       // - First convert xml response to JSON using org.json package
       //Then extract the result element
       // - Then extract the result element
       JSONObject jo = org.json.XML.toJSONObject(response);
       JSONObject jo = org.json.XML.toJSONObject(response);      
     
       String resultElement = jo.getJSONObject("SOAP-ENV:Envelope")
       String resultElement = jo.getJSONObject("SOAP-ENV:Envelope")
.getJSONObject("SOAP-ENV:Body")
.getJSONObject("SOAP-ENV:Body")
      .getJSONObject("mns1:AddResponse")
      .getJSONObject("mns1:AddResponse")
      .getString("result");
      .getString("result");
     
     }
     }
}
}
</syntaxhighlight>
</syntaxhighlight>

Revision as of 22:38, 2 July 2013

This sample shows how to make a SOAP request to an external service.

It is based on a working example, but it has been simplified so it is (somewhat) easier to follow. It therefore will not work "as is". Use it as a template to guide your own developments.

Here is the sample WSDL (Web Service Description Language) the code is based on:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
  xmlns:y="http://mydomain.com/calculator/" 
  xmlns:ns="http://mydomain.com/calculator/types/" 
  targetNamespace="http://mydomain.com/calculator/">
   <types>
     <xs:schema targetNamespace="http://mydomain.com/calculator/types/" 
       xmlns="http://mydomain.com/calculator/types/" 
       elementFormDefault="unqualified" attributeFormDefault="unqualified">
         <xs:complexType name="CalculatorInput">
            <xs:sequence>
               <xs:element name="x" type="xs:double"/>
               <xs:element name="y" type="xs:double"/>
            </xs:sequence>
         </xs:complexType>
         <xs:complexType name="CalculatorOutput">
            <xs:sequence>
               <xs:element name="result" type="xs:double"/>
            </xs:sequence>
         </xs:complexType>
         <xs:element name="Add" type="CalculatorInput"/>
         <xs:element name="AddResponse" type="CalculatorOutput"/>
      </xs:schema>
   </types>
   <message name="AddMessage">
      <part name="parameters" element="ns:Add"/>
   </message>
   <message name="AddResponseMessage">
      <part name="parameters" element="ns:AddResponse"/>
   </message>
   <portType name="CalculatorInterface">
      <operation name="Add">
         <input message="y:AddMessage"/>
         <output message="y:AddResponseMessage"/>
      </operation>
   </portType>
   <binding name="CalculatorSoapHttpBinding" type="y:CalculatorInterface">
      <soap:binding style="document" 
         transport="http://schemas.xmlsoap.org/soap/http"/>
      <operation name="Add">
         <soap:operation soapAction="http://mydomain.com/calculator/#Add"/>
         <input>
            <soap:body use="literal"/>
         </input>
         <output>
            <soap:body use="literal"/>
         </output>
      </operation>
   </binding>
   <service name="CalculatorService">
      <port name="CalculatorEndpoint" binding="y:CalculatorSoapHttpBinding">
         <soap:address location="http://mydomain.com/Calculator/Calculator.asmx"/>
      </port>
   </service>
</definitions>

Here is the code that uses that WSDL to access the remote service and connect to it. To use this code, you would place it into a Calculator class, and invoke the add() method from a Rule or from other platform code.

import com.platform.api.*;
import org.json.*;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

public class Calculator
{
    //This method makes a request to 
    public void add(Parameters p) throws Exception
    {
      String x = (String)p.get("x");
      String y = (String)p.get("y");
      
      String soapRequest =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
	"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:http=\"http://schemas.xmlsoap.org/wsdl/http/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:mime=\"http://schemas.xmlsoap.org/wsdl/mime/\" xmlns:y=\"http://mydomain.com/calculator/\" xmlns:ns=\"http://mydomain.com/calculator/types/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"+
	"   <SOAP-ENV:Body>"+
	"      <mns1:Add xmlns:mns1=\"http://mydomain.com/calculator/\">"+
	"         <x>" + x + "</x>"+
	"         <y>" + y + "</y>"+
	"      </mns1:Add>"+
	"   </SOAP-ENV:Body>"+
	"</SOAP-ENV:Envelope>";
      
      HttpConnection con = new HttpConnection(
          CONSTANTS.HTTP.METHOD.POST,
          "http://mydomain.com/Calculator/Calculator.asmx");
      
      con.addHeader("SOAPAction","http://mydomain.com/calculator/#Add");      
      con.addHeader("Content-Type","text/xml");
      con.setRequestBody(soapRequest);
      
      int code = con.execute();
      String response = con.getResponse();
      /*
	Sample Response

	<?xml version=\"1.0\" encoding=\"UTF-8\"?>
	<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:http=\"http://schemas.xmlsoap.org/wsdl/http/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:mime=\"http://schemas.xmlsoap.org/wsdl/mime/\" xmlns:y=\"http://mydomain.com/calculator/\" xmlns:ns=\"http://mydomain.com/calculator/types/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"+
	   <SOAP-ENV:Body>"+
	      <mns1:AddResponse xmlns:mns1=\"http://mydomain.com/calculator/\">
	         <result>1</result>
	      </mns1:AddResponse>
	   </SOAP-ENV:Body>
	</SOAP-ENV:Envelope>
      */
 
      //Extract the result element from the response:
      // - First convert xml response to JSON using org.json package
      // - Then extract the result element
      JSONObject jo = org.json.XML.toJSONObject(response);	      
      String resultElement = jo.getJSONObject("SOAP-ENV:Envelope")
				.getJSONObject("SOAP-ENV:Body")
	    		  	.getJSONObject("mns1:AddResponse")
	    		  	.getString("result");
    }
}