如何在Ruby中创建SOAP信封?

时间:2010-06-04 04:59:43

标签: ruby soap nokogiri

我正在使用Savon来构建客户端,但想知道如何创建实际的信封。

我正在考虑使用Nokogiri XML Builder并传递值,但不确定这是否正确。

可以在此处找到SOAP信封规范:

http://api.postalmethods.com/PostalWS.asmx?op=UploadFile

2 个答案:

答案 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,而不是重新发明轮子