web-dev-qa-db-ja.com

サーバーに送信せずにSavonリクエストXMLを表示する

Savon gemを使用して、以下のようなコードを使用してSOAPリクエストを作成しています。動作していますが、サーバーを実際に呼び出さずにリクエストXMLを表示/キャプチャしたいと思います。 。リクエストの後にデバッガー行を貼り付け、クライアント変数を調べることで、リクエストが行われた後に表示できるようになりました。

実際にリクエストを行わずにリクエストXMLを表示する方法を知っている人はいますか? CucumberまたはRspecを使用してスキーマに対してXMLを検証できるようにしたい。

client = Savon::Client.new do |wsdl, http|
  wsdl.document = "http://fakesite.org/fake.asmx?wsdl"
end

client.request(:testpostdata, :xmlns => "http://fakesite.org/") do
  soap.header = { :cAuthentication => {"UserName" => "MyName", "Password" => "MyPassword" } }
  soap.body = { :xml_data => to_xml }
end
29
Peter Brown

Savon[〜#〜] httpi [〜#〜] を使用してSOAPリクエストを実行します。HTTPIは、さまざまな上にある共通のインターフェースです。 Ruby HTTPクライアント。おそらく、Savonによって実行されたHTTPリクエストを次の方法でモック/スタブすることができます。

HTTPI.expects(:post).with do |http|
  SchemaValidation.validate(:get_user, http.body)
end

SOAPリクエストをモックし、HTTPボディを取得し、何らかの検証メソッド(擬似コード)に対して検証するために Mocha を使用したことに注意してください。

現在、Savonは、リクエストを実行せずにリクエストを作成することをサポートしていません。したがって、リクエストを検証する唯一の方法は、リクエストをインターセプトすることです。

この機能をサポートするためにSavonが必要な場合は、私に知らせてください GitHubでチケットを開いてください

編集: savon_spec もあります。これは、Savonを使用した基本的なフィクスチャベースのテストの少しのヘルパーです。

7
rubiii

Savon 2を使用して、このようにし、クライアントからリクエスト本文を返すメソッドを記述します。

 client = Savon::Client.new(....)

これはドキュメントに記載されていません

  def get_request
     # list of operations can be found using client.operations
     ops = client.operation(:action_name_here)

     # build the body of the xml inside the message here        
     ops.build(message: { id: 42, name: "Test User", age: 20 }).to_s
  end
44
carbonr

Savon::Client#build_requestメソッドを介して直接行うことができます。

例:

request = client.build_request(:some_operation, some_payload)
request.body # Get the request body
request.headers # Get the request headers

完全なドキュメントについては、@ https://github.com/savonrb/savon/blob/master/lib/savon/request.rb をピークにしてください。

31
bez

私はSavon2.11を使用していますが、クライアントのグローバルでそれを実現できます。

def client
  @client ||= Savon.client(soap_version: 2,
                           wsdl:         config.wsdl,
                           logger:       Rails.logger,
                           log:          true)
end

グローバルの詳細はこちら

次に、ロガーは、要求と応答の両方について、ホスト、http動詞、および完全なxml(「ヘッダー」と本文)を吐き出します。

13
ecoologic

これを行うためのより良い方法があると確信していますが、私は応答を無効にしました。

class Savon::SOAP::Request
  def response
    pp   self.request.headers
    puts
    puts self.request.body
    exit
  end
end
11
Petruchio

前回の投稿以降、APIを更新しています。 Savon.clientでこの設定を設定します:: pretty_print_xml => true。呼び出し後、ログでSOAP request:を検索します。出力はstdoutに出力されます。コンソールからの接続をテストしている場合は、コンソールコンソールの履歴を確認してください。

9
Cris LeMaster

私は同じ問題を抱えていて、次のようにSavonにパッチを適用しました。

module Savon
  class Client
    def get_request_xml operation_name, locals
      Savon::Builder.new(operation_name, @wsdl, @globals, locals).pretty
    end
  end
end

これにより、XMLが作成され、APIエンドポイントに送信されずに文字列として返されます。 client.callと同じようにブロック引数を受け入れないため、作成しているすべてのタイプのリクエストを再現することはできませんが、今のところ私のニーズを満たしています。

6
Kai Stinchcombe