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を使用するコントローラーごとに、モジュールを個別に接続する必要があります。
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です)。
利益!
このコントローラーのWSDLは、/ api / wsdl(または/ your_controller / wsdl)にあります。 SOAPは、他のすべてのメソッドとそのパスをすでに見つけています。
これが機能することをテストするには、Savon gemを使用できます。
require 'savon' client = Savon::Client.new("http://localhost:3000/api/wsdl") client.wsdl.soap_actions
OSS軍隊にあなたが欲しい!
問題や開発のアイデアがある場合は、Githubでの
Issueおよび
Pullリクエストをお待ちしています。
ありがとう