使用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是否正在创建或正确发布。或者如果这是正确的方法......
提前感谢您的帮助!
答案 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()方法。