查看Savon请求XML而不发送到服务器

问题描述:

我使用Savon gem来使用类似于下面的代码的SOAP请求。它正在工作,但我希望查看/捕获请求XML,而无需实际调用其服务器。通过在请求后面粘贴调试器行并检查客户端变量,我可以在请求发出后立即查看它。查看Savon请求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使用HTTPI执行SOAP请求。 HTTPI是各种Ruby HTTP客户端的通用接口。你也许可以模拟/存根通​​过由萨翁执行HTTP请求:

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

请注意,我用Mocha用于嘲讽的SOAP请求,得到了HTTP身体和验证它针对一些验证方法(伪代码)。

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

如果您需要Savon支持此功能,请告诉我,open a ticket over at GitHub

编辑:还有savon_spec,这是一个基本的与萨贡基于夹具测试的小帮手。

+0

感谢您的建议。我可以没有这个功能,只想知道它是否可能。 – 2011-05-03 14:55:50

虽然我确定有更好的方法来做到这一点,但我只是否定了回应。

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

这是帮助调试的便宜且简单的方法。谢谢。 – 2011-11-03 13:32:05

+0

如果我想要这个,但也发送请求到服务器呢? – Fakada 2013-07-01 12:20:00

+0

@Fakada'super' – 2014-03-26 03:42:43

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

我有同样的问题,并修补萨翁如下:

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那样接受block参数,所以它不能重现你所做的每一种请求,但它现在满足了我的需求。

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

'.pretty'使身体更易于阅读 – akz92 2017-09-04 11:33:23

+0

(用'pretty'替换'to_s') – 2018-01-24 19:00:05

我使用萨翁2.11文档中提到的,我可以在客户端与全局完成它:

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

More info on the globals here.

然后记录器吐出主机,http动词和完整的xml(“headers”和bo dy)的请求和响应。

您可以直接通过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为全面文档。

+0

这应该是正确的答案,因为它是最直接的,并且使用Savon而不必修改任何部分的。 – codeshaman 2017-05-22 18:51:12