2

我正在尝试发出肥皂请求,但是当我使用该operation.body方法时,每个数组似乎都不在 xml 之后operation.build

这是 WSDL 的一部分:

<xs:element name="Item" type="ns1:TList_Item"/>
--
<xs:complexType name="TList_Item">
  <xs:complexContent>
    <xs:restriction base="soapenc:Array">
      <xs:sequence/>
      <xs:attribute xmlns:n1="http://schemas.xmlsoap.org/wsdl/" ref="soapenc:arrayType" n1:arrayType="ns1:TItem[]"/>
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>
--
<xs:complexType name="TItem">
  <xs:sequence>
    <xs:element name="Item_Name" type="xs:string"/>
    <xs:element name="Item_Code" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

我试过这个:

operation.body = { Item: [item1,item2,..] }

但收到此错误:

ArgumentError: Expected a Hash for the :Item complex type

我也试过这个:

如何在Ruby中将数组作为参数传递给SOAP

没有错误,但内容从未进入 xml 之后operation.build

我应该如何处理这个?

4

1 回答 1

1

贝尔纳多,

这里的问题是您的 WSDL 是 RPC/Encoded(也由 xs:restriction 基本属性上的“soapenc”命名空间前缀表示)并且 Savon 版本 3(尚未正式发布,只能通过 GitHub 获得)不支持这个风格呢。

RPC/Encoded 很少使用,但通常用于遗留系统。它定义了一个全新的类型系统,现在还没有实现。我仍在为 XML Schema 开发一个合适的类型系统,推荐用于 WSDL 文档,这已经是很多工作了。所以我不确定何时支持 RPC/Encoded。

我建议您改用第 2 版。请确保遵循文档,因为版本 2 的工作方式与版本 3 完全不同: http: //savonrb.com/version2.html

版本 2 没有使用来自 WSDL 的太多信息,因此您可以选择是否使用它。您可能需要尝试不同的选项才能为您的服务工作(有很多),但它应该可以工作。

编辑:我将更改版本 3 以引发 RPC/Encoded SOAP 操作的错误,以明确当前不支持此功能。谢谢你。

于 2013-06-18T21:21:48.387 回答