0

PHP 5.2.10を使用していて、標準のSOAP拡張機能を使用して複雑なデータ型を返すWebサービスを利用しようとしています。

問題は、SoapClientが他のオブジェクト/オブジェクトの配列にネストされているオブジェクトを設定しないことです。getUtenteメソッドを呼び出して、パラメーターとして「my_unique_id」を指定すると、次のようになります。

stdClass Object
(
    [getUtenteReturn] => stdClass Object
        (
            [userName] => my_unique_id
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

WDSLの説明の関連部分は次のとおりです。

<element name="getUtenteResponse">
  <complexType>
    <sequence>
      <element name="getUtenteReturn" type="tns1:Cliente"/>
    </sequence>
  </complexType>
</element>
...
<complexType name="Utilizzatore">
  <sequence>
    <element name="userName" nillable="true" type="xsd:string"/>
  </sequence>
</complexType>
...
<complexType name="Cliente">
  <complexContent>
    <extension base="tns1:Utilizzatore">
      <sequence> 
        <element name="fieldOne" nillable="true" type="xsd:string"/>
        <element name="fieldTwo" nillable="true" type="xsd:string"/>
        <element name="utilizzatore" nillable="true" type="impl:ArrayOf_tns1_Utilizzatore"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

私が見つけたのは、この問題を経験しているのは私だけではありません。特に、PHPの公式ドキュメントと他のフォーラムエントリでこのコメントを見つけて、問題へのアプローチ方法について2つの異なるアイデアを提供しましたが、これら2つのアイデアのいずれも実用的な解決策に変えることができませんでした。与えられた例の背後にあるロジックを完全に理解してください。

誰かがこれについて私を導いてくれたらありがたいです:別のWebサービスで動作するコードを歓迎しますが、私が主に求めているのは、問題と提案された解決策のロジックを本当に理解することです(魚ではなく魚のレーン!) 。:)

4

3 に答える 3

1

古い質問、答えはありません。私は最近この投稿に出くわしました。それは問題を説明し、解決策を提供します:PHPでSOAPcomplexTypeウェブサービスを消費する

于 2011-04-28T07:58:07.653 に答える
0

Mac、迅速な対応に感謝します。私が転んだものを見てください..私は以前にこれを見ていませんでした。したがって、これを共有したいと思います。

于 2010-02-17T13:24:33.700 に答える
0

これが私の当面の考えです。申し訳ありませんが、これは適切な答えではなく、いくつかのアイデアです...

まず、soapサーバーに送信されたsoapリクエスト(封筒)を表示してみましたか?動作するように見えますか?どこが悪いのかわかりますか?エラーが戻ってきただけですか、soapFaultが発生したのですか、それとも間違ったデータが発生したのですか、それとも何も発生していませんか?

次に、SoapParamクラスを使ってみましたか?

最後に、あなたはこれを正しく行っていると確信していますが、構築しているオブジェクトにはユーザー名とfieldOneとfieldTwoがすべて並んでいることに気付きましたが、WSDLはfieldOneとfieldTwoがクラスClienteの一部であることを示しています(例に表示されます)ユーザー名はutilizzatore配列内にある必要があるため、次のようにすべきではありません。

stdClass Object
(
    [Cliente] => stdClass Object
        (
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

SoapClientクラスは私にとって非常に苛立たしいものです。したがって、これを批判として受け取らないでください。私は、役立つアイデアを提供することによって、自分自身でそれをよりよく理解したいと思っています。

于 2010-02-09T07:05:20.523 に答える