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リクエストをお待ちしています。

ありがとう

Source: https://habr.com/ru/post/J135614/


All Articles