Skip to main content

Exposing a SOAP service as a REST API

In this post i will be explaining how we can transform a SOAP based backend to receive requests in a restful manner through the WSO2 API Cloud.

Steps.

First log into the WSO2 Cloud and navigate to the API Cloud.

In the API cloud select the option to add a new API. We will be creating an API to demonstrate an invocation to the backend soap service ws.cdyne.com/phoneverify/phoneverify.asmx?wsdl

Give a name, context and version to the API and add a resource name with a GET Method. The resource name can be anything which you like since we will invoke the actual service usiing a custom sequence.

Mention the URI template as indicated in the below screenshot.



Next go to the implement tab. And select the endpoint type as HTTP/SOAP Endpoint and specify the endpoint as http://ws.cdyne.com/phoneverify/phoneverify.asmx. There is an important step we need to do here. We need to set the SOAP version for this request. In order to do that we need to select the advanced option for the endpoint. You can find the icon to configure advanced options below.


Click on the advanced option and set the format as the SOAP version we need to set. In this case we will set it as SOAP 1.1



In the next step we need to add a custom sequence which tranforms this rest call to a SOAP call and sends it to our SOAP backend. So we need to create a sequence simillar to the one below and save it as an xml file. I have saved my sequence as phoneInSequence.xml. I will explain what each step does.

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="phoneInSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
   <header description="SOAPAction" name="SOAPAction" scope="transport" value="http://ws.cdyne.com/PhoneVerify/query/CheckPhoneNumber"/>
   <property name="uri.var.phoneNumber" expression="$url:PhoneNumber"/>
   <property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>
   <payloadFactory description="transform" media-type="xml">
    <format>
       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:quer="http://ws.cdyne.com/PhoneVerify/query">
           <soapenv:Header/>
           <soapenv:Body>    
                 <quer:CheckPhoneNumber>
                       <!--Optional:-->
                        <quer:PhoneNumber>$1</quer:PhoneNumber>
                          <!--Optional:-->
                         <quer:LicenseKey>0</quer:LicenseKey>
                      </quer:CheckPhoneNumber>
                  </soapenv:Body>
                 </soapenv:Envelope>
          </format>
           <args>
               <arg expression="get-property('uri.var.phoneNumber')"/>
          </args>
     </payloadFactory>
    <property description="messageProperty" name="messageType"
scope="axis2" type="STRING" value="application/soap+xml"/>
</sequence>


Next we need to create an out sequence which transforms the response as a json and sends it back to the API as the response. I created the out sequence as outSequence.xml. The content is as mentioned below.

<?xml version="1.0" encoding="UTF-8"?>
    <sequence name="phoneOutSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property description="message" name="messageType" scope="axis2"
type="STRING" value="application/json"/>
</sequence>

We need to then upload these two sequences to the in an out sequence of the API as below.



n the manage tab select a tier and publish the API.

Next navigate to the API in the store and subscribe to it with one of the tiers mentioned and generate the tokens for the subscription.

Next we can now invoke the API by just simply providing the phone number as the input. This phone number is captured into a variable and then using this the request payload will be construcred. Using the header mediator we can then set the SOAP action and the constructed request payload will be sent to the soap backend. The soap backend will accept this and return a xml payload. But due to the transformation in the out sequence it will return it as a JSON. This is what happens in the transformation.

Comments

  1. Thank you for sharing such valuable information and tips. This can give insights and inspirations for us; very helpful and informative! Would love to see more updates from you in the future.
    java certification training in chennai
    struts training in chennai

    ReplyDelete
  2. Thanks for this. I am looking for an inverse solution of exposing a soap service from a Rest API.

    ReplyDelete

Post a Comment

Popular posts from this blog

Processing large payloads with the esb script mediator iteratively

Overview WSO2 ESB uses Rhino engine to execute JavaScripts. Rhino engine converts the script to a method inside a Java class. Therefore, when processing large JSON data volumes, the code length must be less than 65536 characters, since the Script mediator converts the payload into a Java object. However, you can use the following alternative options to process large JSON data volumes. The script mediator which is used in ESB is powered by the Rhino engine. Therefore, when processing large JSON data volumes, the code length must be less than 65536 characters which is a limitation in the script mediator being used in the esb versions less than 5.0.0. In ESB 5.0.0 there is a higher capability to process larger payloads using script mediator. In order to process such large payloads we can follow the below two approaches. 1. Replace the javascript tranformation logic using java code by writing a custom mediator. [1] 2. Break down the large payload and execute them as sections using

Invoking external endpoints using the call mediator in wso2 api manager

Introduction In API Manager if you need to do any service chaining use cases the call mediator comes in handy. If you need to use the response received by invoking one endpoint and then use it to invoke another endpoint you can use the call mediator in API Manager. The call mediator behaves in a synchronous manner. Hence, mediation pauses after the service invocation and resumes from the next mediator in the sequence when the response is received. You can read more about the call mediator in the wso2 esb documentation [1] . In api manager 1.10.0 the call mediator works in the blocking mode. Prerequisite Before we can use the call mediator in API Manager 1.10.0 we need to make the following changes to some configs. We need to comment the jms transport sender in axis2_blocking_client.xml found in the location APIM_HOME/repository/conf/axis2. This will resolve the jms sender initialization issues.   <!--transportSender name="jms"                      class