2

SOAP リクエストを作成しようとしていますが、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 はめったに使用されませんが、通常はレガシー システムで使用されます。現在実装されていないまったく新しい型システムを定義します。私はまだ、WSDL ドキュメントに推奨される XML スキーマの適切な型システムに取り組んでいますが、それはすでに大変な作業です。そのため、RPC/Encoded がいつサポートされるかはわかりません。

代わりにバージョン 2 を使用することをお勧めします。バージョン 2 はバージョン 3 とはかなり異なる動作をするため、必ずドキュメントに従ってください: http://savonrb.com/version2.html

バージョン 2 は WSDL からの情報をあまり使用しないため、使用するかどうかを選択できます。これをサービスで機能させるには、さまざまなオプションを試す必要があるかもしれません (かなりの数があります) が、機能するはずです。

編集: バージョン 3 を変更して、RPC/Encoded SOAP 操作でエラーを発生させ、この機能が現在サポートされていないことを明確にします。ありがとうございました。

于 2013-06-18T21:21:48.387 に答える