36

我正在使用 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
4

7 回答 7

52

使用 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
于 2014-08-02T05:39:45.543 回答
49

您可以直接通过该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获取完整文档。

于 2015-11-12T23:12:56.330 回答
14

我正在使用 Savon 2.11,我可以在客户端使用全局变量来完成它:

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

更多关于全局变量的信息在这里。

然后记录器为请求和响应吐出主机、http 动词和完整的 xml(“标头”和正文)。

于 2015-06-01T02:19:20.120 回答
13

虽然我确信有更好的方法可以做到这一点,但我只是忽略了响应。

class Savon::SOAP::Request
  def response
    pp   self.request.headers
    puts
    puts self.request.body
    exit
  end
end
于 2011-05-19T11:25:26.637 回答
10

自上次发布以来,他们已经更新了 API。在 Savon.client 中设置此设置::pretty_print_xml => true。通话后,在日志中搜索 SOAP 请求:。输出被放到标准输出。如果您正在从控制台测试连接,请检查控制台控制台历史记录。

于 2013-05-16T21:22:47.877 回答
8

Savon使用HTTPI来执行 SOAP 请求。HTTPI 是各种 Ruby HTTP 客户端之上的通用接口。您可能可以通过以下方式模拟/存根 Savon 执行的 HTTP 请求:

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

请注意,我使用Mocha来模拟 SOAP 请求,获取 HTTP 正文并根据某些验证方法(伪代码)对其进行验证。

目前,Savon 不支持在不执行请求的情况下构建请求。因此,验证请求的唯一方法是拦截它。

如果您需要 Savon 来支持此功能,请告诉我并在 GitHub 上开票

编辑:还有savon_spec,它是使用 Savon 进行基于夹具的基本测试的小帮手。

于 2011-05-02T20:20:06.153 回答
7

我遇到了同样的问题,并按如下方式修补了 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 那样接受块参数,因此它无法重现您正在发出的每种类型的请求,但它现在满足我的需求。

于 2013-10-18T23:47:44.323 回答