Sinatra-soap gem makes task to create SOAP API really simple. Inspired by WashOut gem for Rails. But remember, the only reason why you should use SOAP is legacy code.
In case of simplicity and quick first working release:
A classic application would work like that:
require 'sinatra'
require 'sinatra/soap'
soap "SomeAction" do
do_something_with_params # hash to be returned
end
A modular application would look like that:
require 'sinatra/base'
require 'sinatra/soap'
class SoapAPI < Sinatra::Base
#remember to register extenstion if you are using modular style
register Sinatra::Soap
soap "SomeAction" do
params # hash to be returned
end
end
- :wsdl_route — url for getting wsdl, either static or dynamically generated file
set :wsdl_route, '/wsdl'
Defines route for app to response with wsdl. Default is '/wsdl'
- :endpoint — url for sending SOAP Requests
set :endpoint, '/action'
Defines route for SOAP Requests. Default is '/action'
- :wsdl_file — app will send static file, if this setting specified
set :wsdl_file, "wsdl.xml"
If wsdl_file is set, app will try to read wsdl file from :public_folder
(by default ./public directory). If file does not exist, app will raise an error. You also don't need to specify :namespace
or :service
if you want to serve static wsdl.
- :namespace — wsdl setting, required for generating wsdl
set :namespace, "http://schemas.xmlsoap.org/wsdl/"
Namespace is taking it's place in xmlns:tns
and targetNamespace
definitions of SOAP Envelope
- :service — wsdl setting, required for generating wsdl
set :service, "sinatra"
Service involved in portType
, binding
and service
definitions as a prefix for name attribute.
If you want to be able to generate wsdl on a fly, you need to specify incoming and outgoing nodes with their types.
soap :test, in: {circle: {center: {x: :integer,
y: :integer},
radius: :double}
},
out: nil do
params #=> {circle: {center: {x: 3, y: 2}, radius: 12.0} }
nil
end
The code above will respond to request like this:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="anynamespacehere" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<wsdl:test>
<circle>
<center>
<x>3</x>
<y>2</y>
</center>
<radius>12.0</radius>
</circle>
</wsdl:test>
</env:Body>
</env:Envelope>