查看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

使用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

可以直接通过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

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

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

关于全局变量的更多信息请点击这里。

然后记录器输出主机、http动词和请求和响应的完整xml ("headers"和body)。

虽然我确信有更好的方法来做到这一点,但我只是覆盖了响应。

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

自上一篇文章以来,他们已经更新了API。在Savon中设置此设置。Client::pretty_print_xml => true。呼叫后,在日志中搜索SOAP请求:。输出被放入标准输出。如果您正在从控制台测试连接,请检查控制台控制台历史记录。

Savon使用http来执行SOAP请求。HTTP是一个基于各种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进行基本基于夹具的测试的小助手。

我有同样的问题,并修补了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端点。它不以同样的方式接受block参数。Call可以,所以它不能复制您发出的所有类型的请求,但它目前满足了我的需求。

相关内容

  • 没有找到相关文章

最新更新