Nowadays, “web services” often means REST (Representational state transfer) APIs using JSON as the data exchange format. However, the first generation of web services was built using SOAP (Simple Object Access Protocol), a standard protocol based on XML. In many enterprises, SOAP web services are still important assets, and some APIs are only available via SOAP. Unfortunately, SOAP is fairly heavy weight, and working with XML-based SOAP payloads in Node.js is not very fun. It’s much nicer to use JSON and to wrap or mediate a SOAP service and expose it as a REST API.
As an API server to glue existing and new data sources, LoopBack is designed to facilitate your backend data integration. With the release of loopback-connector-soap module, you can now easily consume SOAP web services and transform them into REST APIs.
In this blog, I’ll walk you through the steps to connect to an existing SOAP web service and transform it into a REST API. The example code is available here. It uses a public SOAP-based weather service from here.
Configure a SOAP data source
To invoke a SOAP web service using LoopBack, first configure a data source backed by the SOAP connector.
var ds = loopback.createDataSource('soap', {
connector: 'loopback-connector-soap'
remotingEnabled: true,
wsdl: 'http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL'
});
SOAP web services are formally described using WSDL (Web Service Description Language) that specifies the operations, input, output and fault messages, and how the messages are mapped to protocols. So, the most critical information to configure a SOAP data source is a WSDL document. LoopBack introspects the WSDL document to map service operations into model methods.
Options for the SOAP connector
<wsdl:service name="Weather">
<wsdl:port name="WeatherSoap" binding="tns:WeatherSoap">
<soap:address location="http://wsf.cdyne.com/WeatherWS/Weather.asmx" />
</wsdl:port>
...
</wsdl:service>
operations: {
// The key is the method name
stockQuote: {
service: 'StockQuote', // The WSDL service name
port: 'StockQuoteSoap', // The WSDL port name
operation: 'GetQuote' // The WSDL operation name
},
stockQuote12: {
service: 'StockQuote', // The WSDL service name
port: 'StockQuoteSoap12', // The WSDL port name
operation: 'GetQuote' // The WSDL operation name
}
}
Create a model from the SOAP data source
NOTE: The SOAP connector loads the WSDL document asynchronously. As a result, the data source won’t be ready to create models until it’s connected. The recommended way is to use an event handler for the ‘connected’ event.
ds.once('connected', function () {
// Create the model
var WeatherService = ds.createModel('WeatherService', {});
...
}
Extend a model to wrap/mediate SOAP operations
Once the model is defined, it can be wrapped or mediated to define new methods. The following example simplifies the GetCityForecastByZIP operation to a method that takes zip and returns an array of forecasts.
// Refine the methods
WeatherService.forecast = function (zip, cb) {
WeatherService.GetCityForecastByZIP({ZIP: zip || '94555'}, function (err, response) {
console.log('Forecast: %j', response);
var result = (!err && response.GetCityForecastByZIPResult.Success) ?
response.GetCityForecastByZIPResult.ForecastResult.Forecast : [];
cb(err, result);
});
};
The custom method on the model can be exposed as REST APIs. It uses the loopback.remoteMethod to define the mappings.
// Map to REST/HTTP
loopback.remoteMethod(
WeatherService.forecast, {
accepts: [
{arg: 'zip', type: 'string', required: true,
http: {source: 'query'}}
],
returns: {arg: 'result', type: 'object', root: true},
http: {verb: 'get', path: '/forecast'}
}
);
Run the example
git clone git@github.com:strongloop/loopback-connector-soap.git
cd loopback-connector-soap
npm install
node example/weather-rest
Open http://localhost:3000/explorer
You can also test the REST API through direct URLs:
Additional Examples
There are two additional examples at https://github.com/strongloop/loopback-connector-soap/tree/master/example. Check them out:
node example/stock-ws
node example/weather-ws
What’s next?
- Install LoopBack with a simple npm command
- What’s in the upcoming Node v0.12 version? Big performance optimizations, read the blog by Ben Noordhuis to learn more.
- Need performance monitoring, profiling and cluster capabilites for your Node apps? Check out StrongOps!

