Поддержка SOAP (как сервера) в Rails ухудшалась от версии к версии. В версии 1.x рельсы комплектовались AWS. В версии 2.x AWS распался на несколько форков, которые поддерживали энтузиасты. До версии 3.х, в стабильно работающем исполнении, AWS не дожил. Идеологически подобное отношение к SOAP может нравиться или не нравиться, но в реальной жизни мы окружены великим и ужасным Enterpris'ом. И поддержка двустороннего SOAP'а может понадобиться в любой интеграции: от 1С, до автоматизированных банковских систем.
Вместо поддержки еще большего количества (мертворожденных?) форков AWS для 3-ей версии, мы написали WashOut.
Гем поддерживает respond_to, ориентируясь на mime-тип SOAP, который сам и регистрирует. То есть вы можете сделать контроллер, который одинаково хорошо выдает html, json и еще и отвечает на SOAP. При этом WashOut поддерживает все стандартные фичи Rails, такие как before_filter.
Добавьте
Чтобы не засорять адресное пространство, WashOut не подмешивается в ApplicationController. Поэтому для каждого контроллера, где вы хотите использовать SOAP, модуль надо подключить самостоятельно.
Параметры каждого метода описываются отдельно, с помощью метода soap_action.
Пример с генерацией ошибки SOAP и измененным именем метода.
Роутинг также прописывается для каждого контроллера (в нашем примере это ApiController)
WSDL этого контроллера находится по адресу /api/wsdl (или /your_controller/wsdl). Все остальные методы и пути SOAP найдет уже из него.
Чтобы протестировать, что это работает, можно использовать гем Savon:
В случае возникновения проблем и/или идей по развитию, мы ждем ваших Issues и Pull-реквестов на Github.
Спасибо.
Вместо поддержки еще большего количества (мертворожденных?) форков AWS для 3-ей версии, мы написали WashOut.
Гем поддерживает respond_to, ориентируясь на mime-тип SOAP, который сам и регистрирует. То есть вы можете сделать контроллер, который одинаково хорошо выдает html, json и еще и отвечает на SOAP. При этом WashOut поддерживает все стандартные фичи Rails, такие как before_filter.
Как заставить это работать?
Подключить Gem
Добавьте
gem 'wash_out'
в ваш Gemfile.Расширить нужные контроллеры
Чтобы не засорять адресное пространство, WashOut не подмешивается в ApplicationController. Поэтому для каждого контроллера, где вы хотите использовать SOAP, модуль надо подключить самостоятельно.
# app/controllers/api_controller.rb
class ApiController < ApplicationController
include WashOut::SOAP
Описать WSDL
Параметры каждого метода описываются отдельно, с помощью метода soap_action.
soap_action "concat",
:args => { :a => :string, :b => :string },
:return => :string
def concat
render :soap => (params[:a] + params[:b])
end
Пример с генерацией ошибки SOAP и измененным именем метода.
soap_action "AddCircle",
:args => { :circle => { :center => { :x => :integer,
:y => :integer },
:radius => :double } },
:return => [],
:to => :add_circle
def add_circle
circle = params[:circle]
raise SOAPError, "radius is too small" if circle[:radius] < 3.0
Circle.new(circle[:center][:x], circle[:center][:y], circle[:radius])
render :soap => nil
end
Добавить роутинг
Роутинг также прописывается для каждого контроллера (в нашем примере это ApiController)
# config/routes.rb
HelloWorld::Application.routes.draw do
wash_out :api
end
PROFIT!
WSDL этого контроллера находится по адресу /api/wsdl (или /your_controller/wsdl). Все остальные методы и пути SOAP найдет уже из него.
Чтобы протестировать, что это работает, можно использовать гем Savon:
require 'savon'
client = Savon::Client.new("http://localhost:3000/api/wsdl")
client.wsdl.soap_actions # => [:concat, :AddCircle]
client.request(:concat) do
soap.body = { :a => "123", :b => "abc" }
end[:value] # => "123abc"
We want you for OSS army!
В случае возникновения проблем и/или идей по развитию, мы ждем ваших Issues и Pull-реквестов на Github.
Спасибо.