Savon v3.x - 如何将完整的xml消息作为soap请求传递

时间:2014-01-31 03:40:37

标签: ruby xml soap soap-client savon

使用Savon 3.x版(当前主分支找到https://github.com/savonrb/savon)。

目前在savon 3中生成一个soap请求,你将消息正文定义为一个哈希,例如:

operation.body = {
  Search: {
    accountID: 23,
    accountStatus: 'closed'
  }
}

response = operation.call
从散列开始,savon会生成完整的肥皂消息xml(信封,标题等等),并将该消息传递给HttpClient,将请求发送到您的soap端点。

而不是哈希,我希望能够传递一个完整的xml消息作为我的请求,例如:     my_xml_request_message ='                                          .....更多嵌套节点,命名空间和大量属性等.....                           “

似乎body已发送到build以创建soap请求,然后由call发布:     https://github.com/savonrb/savon/blob/master/lib/savon/operation.rb#L79

def call
  raw_response = @http.post(endpoint, http_headers, build)
  Response.new(raw_response)
end

所以我想是猴子补丁? call允许我使用我的xml块覆盖build,例如:

def call
  raw_response = @http.post(endpoint, http_headers, my_xml_request_message)
  Response.new(raw_response)
end

这就是我们陷入困境的地方 - 我不清楚我的xml是否正在创建或正确发布。或者如果这是正确的方法......

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我还没有使用Savon3,因为它还不稳定。你在v2中可以做的是:

client.call(:authenticate, xml: "<envelope><body></body></envelope>")

我认为类似的东西也适用于v3。它存在于v1和v2中。

答案 1 :(得分:1)

猴子补丁解决了我们的问题 - 所以我认为这是现在很好的答案。 如果可能,我们希望将此解决方案添加到savon 3 master中,详细信息:https://github.com/savonrb/savon/issues/546

 class Savon
  class Operation
    attr_accessor :raw_xml_envelope

    def call
      message = (raw_xml_envelope != nil ? raw_xml_envelope : build)

      raw_response = @http.post(endpoint, http_headers, message)
      Response.new(raw_response)
    end

  end
 end

更多背景资料:

我们使用Savon为soap骨干构建了一个web服务(SOAP&amp; REST)测试框架。在我们的框架中,我们定义了几个描述每个wsdl操作的方法,我们的用例是允许在想要将xml体定义为散列(如savon的example_body()所描述)或传入时使用savon body()方法完整的原始xml信封 - 我们可以通过猴子补丁使用上面的raw_xml_envelope()方法。