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

Ruby SavonV3.x-如何将完整的xml消息作为soap请求传递,ruby,xml,soap,soap-client,savon,Ruby,Xml,Soap,Soap Client,Savon,使用Savon版本3.x(找到当前主分支) 目前,要在savon 3中生成soap请求,需要将消息体定义为散列,例如: operation.body = { Search: { accountID: 23, accountStatus: 'closed' } } response = operation.call 从散列中,savon将生成完整的soap消息xml(信封、标题等),并将该消息传递到HttpClient,以将请求发布到soap端点 我希望能够作为请求传入

使用Savon版本3.x(找到当前主分支)

目前,要在savon 3中生成soap请求,需要将消息体定义为散列,例如:

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

response = operation.call
从散列中,savon将生成完整的soap消息xml(信封、标题等),并将该消息传递到HttpClient,以将请求发布到soap端点

我希望能够作为请求传入完整的xml消息,而不是散列,例如: 我的xml请求消息 ..... 更多的嵌套节点、名称空间和大量属性等等。。。。。 "

似乎
body
被发送到
build
以创建soap请求,然后由
call
发布:

所以我想是去猴子补丁<代码>调用以允许我用xml块覆盖
生成
,例如:

def call
  raw_response = @http.post(endpoint, http_headers, my_xml_request_message)
  Response.new(raw_response)
end
这就是我们陷入困境的地方——我不清楚我的xml是否正确创建或发布。或者如果这是正确的方式继续


提前感谢您的帮助

我还没有使用Savon3,因为它还不稳定。您可以在v2中执行以下操作:

client.call(:authenticate, xml: "<envelope><body></body></envelope>")
client.call(:身份验证,xml:)

我想类似的东西也可以在v3中使用。它存在于v1和v2中。

猴子补丁解决了我们的问题-所以我认为这是目前的好答案。 我们希望尽可能将此解决方案添加到savon 3 master中,详细信息:

更多背景:


我们已经使用Savon作为SOAP主干构建了一个webservices(SOAP和REST)测试框架。在我们的框架中,我们定义了两个描述每个wsdl操作的方法,我们的用例是在希望将xml主体定义为散列(如savon的示例_body()所述)或传递完整的原始xml信封时,允许使用savon body()方法,我们可以通过monkey补丁使用上面的原始xml_信封()方法

嗨。谢谢你的回复。是的,我用v2做的。我们使用v3构建了一个框架,因为我们喜欢savon在重写时所采用的方法。到目前为止,一切都很顺利,但我们确实希望传入完整的xml(不幸的是,在本例中,savon的示例_body方法无法生成body()散列)Savon>操作中的方法:
类Savon类操作attr\u访问器:raw\u xml\u message def call message=(raw\u xml\u message!=nil?raw\u xml\u message:build)raw\u response=@http.post(端点,http\u头,消息)response.new(raw\u response)结束
然后,如果我们不想为
def body
定义has,我们将在我们的框架中包含一个新方法
def raw\u xml\u message
。这个补丁应该添加到Savon 3 master还是有更好的解决方案?
client.call(:authenticate, xml: "<envelope><body></body></envelope>")
 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