Pull to refresh
0

SOAP-сервер на Rails 3.x (WashOut)

Reading time 2 min
Views 5.6K
Поддержка 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.

Как заставить это работать?



Подключить 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.

Спасибо.
Tags:
Hubs:
+13
Comments 14
Comments Comments 14

Articles

Information

Website
roundlake.ru
Registered
Founded
Employees
11–30 employees
Location
Россия