Rails 3.x上のSOAPサーバー(WashOut)

Railsでの(サーバーとしての)SOAPのサポートは、バージョンごとに悪化しています。 バージョン1.xでは、レールにAWSが装備されていました。 バージョン2.xでは、AWSは愛好家がサポートするいくつかの分岐に分かれました。 バージョン3.xより前の安定した動作バージョンでは、AWSは存続しませんでした。 SOAPにイデオロギー的に類似した態度は楽しいかもしれないし、そうでないかもしれませんが、現実の生活では、私たちは偉大で恐ろしい企業家に囲まれています。 また、1Cから自動化された銀行システムまで、あらゆる統合で双方向SOAPのサポートが必要になる場合があります。



さらに多くの(まだ?)バージョン3のAWSフォークをサポートする代わりに、 WashOutを作成しました



gemは、それ自体が登録するSOAPのMIMEタイプに焦点を当てたrespond_toをサポートしています。 つまり、html、jsonを同等に生成し、SOAPにも応答するコントローラーを作成できます。 同時に、WashOutはbefore_filterなどのすべての標準Rails機能をサポートしています。



動作させる方法は?





gemを接続する



gem 'wash_out'



gem 'wash_out'



追加します。



目的のコントローラーを拡張する



アドレス空間を乱雑にしないために、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
      
      







利益!



このコントローラーのWSDLは、/ api / wsdl(または/ your_controller / wsdl)にあります。 SOAPは、他のすべてのメソッドとそのパスをすでに見つけています。



これが機能することをテストするには、Savon gemを使用できます。



 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"
      
      







OSS軍隊にあなたが欲しい!



問題や開発のアイデアがある場合は、GithubでのIssueおよびPullリクエストをお待ちしています。



ありがとう



All Articles