Opening a Legacy SOAP Web Service as a REST API
The request to open a legacy SOAP Web Service as a REST API often arises especially in cases where existing services are to be used by newly developed mobile applications or JavaScript-based Web applications. Options for rewriting an existing service with REST or developing a new REST API that emulates its methods are not effective solutions in terms of neither time or cost.
Apinizer enables SOAP Web services to be opened as REST and all necessary transformations can be done with configuration.
This section describes how a SOAP Web Service can be served as REST to clients.
Creating a REST API Proxy for a SOAP Web Service
1- When creating a new API Proxy, the appropriate one among the Enter URL or Upload File options can be selected for the WSDL type. In this example, the Enter URL option is used.
2- After the URL is entered and the Parse button is pressed, the REST to SOAP to REST option is selected in the Protocol Transformation section on the screen that appears. API Proxy is created by filling in the other mandatory information.
Method Transformations
After the API Proxy is created, it is possible to customize how the methods transforms request and response messages from/to REST/SOAP message structures. For this, go to the Development Tab of API Proxy.
When All is selected in the method list on the left, icons that open the transformation settings of request messages at the top and response messages at the bottom appear in the middle section.
Clicking any of the icons opens the corresponding protocol transformation interface below. In this interface, there are Request Options and Response Options tabs. Depending on which icon the user clicks, the corresponding tab is open by default.
In this interface, configuration is made on how to convert the incoming REST request message according to the SOAP structure of the Backend API. On the left, the method to update the message structure is selected. On the right are the conversion settings for that method.
Transformation Options
When a SOAP Service is opened to clients as REST, the request and response messages need to be transformed. The JSON message from the client must be converted to an XML message before it is sent to the SOAP service, and the XML message returned by the SOAP service must be converted to a JSON message before it is sent to the client. There are several options for this operation:
- Jackson Transformation: It is preferred in cases where the JSON message to be used in request and response messages should be plain and easy to understand. It is highly customizable compared to others and it is the most preferred method.
- JsonML Transformation: It is preferred if the JSON message to be used in request and response messages also includes XML Attribute values and XML Namespaces. Compared to others, the JSON format is more complex. Data size increases as it resembles XML representation due to Namespaces.
- Template Message: Regardless of the format of the incoming JSON message, it works on the idea of preparing the XML template to be sent to the SOAP Service. Request Data Manipulation or Response Data Manipulation is used to populate the parameters in the XML template. It is useful in case of simple XMLs as there is no support for multiple sub-elements. It is especially preferred if it is desired to get data from the request's header or parameters instead of the JSON message.
The available fields of each option are explained below.
Request Message Transformation Options
This section describes the details of the transformation options for request messages.
Use Jackson Transformation
Field | Description |
---|---|
Ignore fields with NULL | If checked, NULL values in the requested JSON message will not be added as XML Elements to the XML message to be sent to the Backend API. |
Ignore EMPTY fields | If checked, empty values in the requested JSON message will not be included as XML Elements in the XML message to be sent to the Backend API. |
Use xsi:nil="true" for NULL values | If checked, the xsi:nil="true" attribute is used for NULL values in the JSON message received in the request, inside the XML message to be sent to the Backend API. Otherwise, an empty element for the relevant value is inserted into the XML message. Activating the value ensures that a value sent as null in a JSON message is transmitted with the xsi:nil="true" attribute when converted to XML. |
Target XPath | Specifies where the XML obtained after the incoming JSON message is converted to XML will be placed in the XML message that the SOAP service expects. |
Replace Children | If the option is checked, the children of the output element of the Target XPath are deleted, replacing them with the converted part from JSON. Otherwise, the element is completely replaced. |
Paths for Arrays within message | Specifies which parts of the JSON message should be interpreted as arrays. Each Path is written starting at the level of the Target XPath (the highest level if no Target XPath is given) and a # sign between the levels. Example: The expression "envelope#body#abc" indicates that the "abc" element in "envelope", inside "body" will be treated as an array. When There Is an Array Within an Array If there is an array within an array, and some objects sometimes come as arrays and sometimes as singular items, writing starts from the path of the outermost array, and the #* expression must be added after the array expressions when moving down to the lower object. |
Request Data Manipulation | Any part of the original request can be transferred to a specified part of the transformed request. The Source Value/Variable specifies which part of the original request message to be transmitted, and the Target Value/Variable specifies where to put this data in the transformed message. |
Show Sample Message | The Request Message created according to the settings can be displayed. |
Transformed Message Example:
JSON Request Message Expected by API Proxy from Client | XML Request Message that Backend API/Service expects |
---|---|
YML
|
XML
|
Field | Description |
---|---|
Use JSON Object | Converts XML Elements to JSON Objects. |
Use JSON Array | Converts XML Elements to JSON Arrays. |
Request Data Manipulation | Any part of the original request can be transferred to a specified part of the transformed request. The Source Value/Variable specifies which part of the original request message to be transmitted, and the Target Value/Variable specifies where to put this data in the transformed message. |
Show Sample Message | The Request Message created according to the settings can be displayed. |
Transformed Message Example:
Transformation Type | JSON Request Message Expected by API Proxy from Client | XML Request Message that Backend API/Service expects |
---|---|---|
JSON Object |
YML
|
XML
|
JSON Array |
YML
|
XML
|
Use Template Message
Field | Description |
---|---|
Template Message | XML request message template that the Backend API/Service expects |
Request Data Manipulation | Any part of the original request can be transferred to a specified part of the transformed request. The Source Value/Variable specifies which part of the original request message to be transmitted, and the Target Value/Variable specifies where to put this data in the transformed message. |
Response Message Transformation Options
This section describes the details of the transformation options for response messages.
Use Jackson Transformation
Field | Description |
---|---|
Ignore fields with NULL | If selected, NULL fields in the XML message received from the Backend API are not included in the JSON message. |
Ignore EMPTY fields | If selected, NULL fields in the XML message received from the Backend API are not added as empty values in the JSON message. |
Write Numbers as Strings | If selected, numeric values are written as strings in the JSON message. |
Use xsi:nil="true" for NULL values | If selected, it ensures that data received with the xsi:nil="true" attribute in an XML message is transmitted as null when converted to JSON. |
Source XPath | Enter the XPath of the part of the response message returned as XML that will be converted to JSON. |
Unwrap Element | If checked, it transforms the inside (children) of the element given with Source XPath, otherwise the element itself (with its content/children). |
Paths for Arrays within message | Specifies which parts of the JSON message should be interpreted as arrays. Each Path is written starting at the level of the Target XPath (the highest level if no Target XPath is given) and a # sign between the levels. Example: The expression "envelope#body#abc" indicates that the "abc" element in "envelope", inside "body" will be treated as an array. When There Is an Array Within an Array If there is an array within an array, and some objects sometimes come as arrays and sometimes as singular items, writing starts from the path of the outermost array, and the #* expression must be added after the array expressions when moving down to the lower object. |
Response Data Manipulation on Success | Any part of the original answer can be transferred to a specified part of the transformed answer. The Source Value/Variable specifies which part of the original response message to transmit, and the Target Value/Variable specifies where to put this data in the converted message. The defined operations are performed only if the Backend API/Service returns a successful response. |
Show Sample Message | The Response Message created according to the settings can be displayed. |
Transformed Message Example:
XML Response Message returned by Backend API/Service | JSON Response Message Returned by API Proxy to Client |
---|---|
XML
|
YML
|
Field | Description |
---|---|
Use JSON Object | Converts XML Elements to JSON Objects. |
Use JSON Array | Converts XML Elements to JSON Arrays. |
Response Data Manipulation on Success | Any part of the original answer can be transferred to a specified part of the transformed answer. The Source Value/Variable specifies which part of the original response message to transmit, and the Target Value/Variable specifies where to put this data in the converted message. The defined operations are performed only if the Backend API/Service returns a successful response. |
Show Sample Message | The Response Message created according to the settings can be displayed. |
Example:
Transformation Type | XML Response Message returned by Backend API/Service | JSON Response Message Returned by API Proxy to Client |
---|---|---|
JSON Object |
XML
|
YML
|
JSON Array |
XML
|
YML
|
Use Template Message
Field | Description |
---|---|
Template Message | JSON response message to be returned to the client |
Response Data Manipulation on Success | Any part of the original answer can be transferred to a specified part of the transformed answer. The Source Value/Variable specifies which part of the original response message to transmit, and the Target Value/Variable specifies where to put this data in the converted message. The defined operations are performed only if the Backend API/Service returns a successful response. |