我正在使用Savon来构建客户端,但想知道如何创建实际的信封。
我正在考虑使用Nokogiri XML Builder并传递值,但不确定这是否正确。
可以在此处找到SOAP信封规范:
答案 0 :(得分:3)
我的回答是:不要。
Savon会自动为您创建一个信封。您可以传递任何所需的标题和正文,如数组和散列或XML字符串。您可以操作现有(默认)命名空间甚至覆盖输入操作。我不确定为什么有人需要在像nokogiri这样的XML解析器中构造SOAP信封。
如果您不想使用Savon构建信封的原因是它缺少端点所需的某种功能,请告诉我确切的问题是什么。我不得不在过去对Savon做出相当大的改动以满足某些API,所以很有可能我已经为你准备了一个补丁。如果没有,我当然可以指出你正确的方向,以便你创建自己的补丁。
如果您仍然需要在Savon之外构建一个信封,我建议您根本不使用Savon,只需通过其中一个很好的http库发送XML。
编辑:
为了说明如何使用SOAP头(和命名空间),您可以在请求方法中包含它们以及body:
client = Savon::Client.new "http://url.to/wsdl"
response = client.get do |soap|
# Use merge! for namespaces so that you don't overwrite all of the original namespaces (while still retaining the ability to overwrite individual ones)
soap.namespaces.merge!({
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema"
})
# Use soap.header just like you would soap.body
soap.header = {
# SOAP header hash
}
# soap.body as usual
soap.body = {
# SOAP body hash
}
end
答案 1 :(得分:1)
Savon将SOAP服务的输入视为嵌套哈希。信封是由萨翁建造的,所以你通常不需要担心太多,如果有的话。
您是否真的设法连接到该服务,如果没有,您会得到什么错误?
如果您尚未连接和/或在如何执行此操作的概念方面遇到一些问题,则应该开始使用以下内容。
require 'savon'
client = Savon::Client.new http://api.postalmethods.com/PostalWS.asmx?wsdl
response = client.UploadFile do |soap|
soap.body = {
"Username" => "My User",
"Password" => "My password"
...
}
end
如果你填写了空白...这应该让你开始,虽然解析wsdl可能不是在生产中前进的方式。请查看Savon文档,了解您遇到的具体问题。
修改强>
如果您不确定Savon和SOAP,那么您可以使用the postalmethods gem所述的here,而不是重新发明轮子