Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 查看Savon请求XML而不发送到服务器_Ruby_Xml_Soap_Savon_Httpi - Fatal编程技术网

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

Ruby 查看Savon请求XML而不发送到服务器,ruby,xml,soap,savon,httpi,Ruby,Xml,Soap,Savon,Httpi,我正在使用SavonGem,使用与下面类似的代码发出SOAP请求。它正在工作,但我想查看/捕获请求XML,而不实际调用它们的服务器。我现在可以在发出请求后查看它,方法是在请求后插入调试器行并检查客户机变量 有人知道一种不用实际发出请求就可以查看请求XML的方法吗?我希望能够使用Cucumber或Rspec根据模式验证XML client = Savon::Client.new do |wsdl, http| wsdl.document = "http://fakesite.org/fake.

我正在使用SavonGem,使用与下面类似的代码发出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
用于执行SOAP请求。HTTPI是各种rubyhttp客户机之上的通用接口。您可能可以通过以下方式模拟/存根Savon执行的HTTP请求:

HTTPI.expects(:post).with do |http|
  SchemaValidation.validate(:get_user, http.body)
end
请注意,我用于模拟SOAP请求、获取HTTP主体并根据某种验证方法(伪代码)对其进行验证

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

如果您需要Savon来支持此功能,请让我知道并


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

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

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

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

我也有同样的问题,并修补了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那样接受块参数,因此它无法复制您发出的每种类型的请求,但它现在满足了我的需要。

使用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 2.11,我可以通过客户端中的globals来实现:

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


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

您可以直接通过
Savon::Client#build_request
方法

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

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

用peak@获取完整文档。

谢谢您的建议。我可以不使用这个功能,只是想知道它是否可行。这是帮助调试的一种既便宜又简单的方法。谢谢。如果我想这样做,但同时将请求发送到服务器,那该怎么办?这应该是正确的答案,因为它是最直接的,并且使用Savon而无需修改它的任何部分。(将上面的
替换为
pretty
)另请注意
pretty\u print\u xml