2

PHP での SOAP 呼び出しに関する問題があります。「DoBulkOperation」という名前の Web サービスがあります。これは、何でもリストを取得し、何かを実行し、実行内容に関する情報を含むリストを返します。ここで重要なことは、リクエストの各リスト要素が、レスポンスの同じインデックスに対応する要素を持つことです。

私が得る応答はそのようなものです:

<Body>
  <DoBulkOperationResponse>
    <items>
      <OperationResponse>
        <result>17</result>
      </OperationResponse>
      <Error>Some error occured</Error>
      <OperationResponse>
        <result>18</result>
      </OperationResponse>
      <OperationResponse>
        <result>19</result>
      </OperationResponse>
      <OperationResponse>
        <result>20</result>
      </OperationResponse>
    </items>
  </DoBulkOperationResponse>
</Body>

それは私の要求に対する正しい応答です。ここで、リクエストの 2 番目のリスト要素に何か問題があると言えます。

PHP SoapClient から得られるものは、私が期待したものではありません:

object(stdClass)#49 (1) {
  ["items"]=>
  object(stdClass)#51 (2) {
    ["OperationResponse"]=>
    array(4) {
      [0]=>
      object(stdClass)#53 (1) {
        ["customerID"]=>
        int(17)
      }
      [1]=>
      object(stdClass)#52 (1) {
        ["customerID"]=>
        int(18)
      }
      [2]=>
      object(stdClass)#50 (1) {
        ["customerID"]=>
        int(19)
      }
      [3]=>
      object(stdClass)#54 (1) {
        ["customerID"]=>
        int(20)
      }
    }
    ["Error"]=>
    string(17) "Some error occured"
  }
}

要素の順序は完全に壊れています。現在、どのリクエスト要素がどのレスポンス要素につながるかを判断することは不可能です。

WSDL では、「アイテム」はシーケンスとして定義されます。

SoapClient インスタンスに応答の構造を保持させる方法はありますか?

よろしくお願いします、

マーカス

4

1 に答える 1

5

ここにはいくつかのオプションがありますが、決定的な答えを得るには、この呼び出しの WSDL を提示する必要があります。

PHP SoapClient が定義されている配列を常に返すように強制します。

array('features' => SOAP_SINGLE_ELEMENT_ARRAYS)SoapClient のオプションとして設定または追加します。複数の要素が検出された場合にのみ、結果が配列を持つことを防ぎます。PHP が内部処理を行っていると私が信じていることから: 最初の要素の遭遇では、それは作成され、次の遭遇では、最初の要素が配列に移動され、2 番目の要素が追加されます。

これは、あなたが見ている構造をすでに説明している可能性があり、それを修正できる可能性があります.

予想される構造を事前に定義するオブジェクトでクラスマップを使用します。

WSDL で ComplexType 構造の名前を見つける必要があり、stdClass. これは、IDE がオートコンプリートを提供できるため、すべてに非常に役立ちます。また、IDE を使用することで、どの要素を扱っているかを実際に確認できますget_class()。一方、itemsXML の構造として適切に機能する PHP オブジェクトを作成することはできません。

カスタム クラスで魔法__set()を使用して、結果の作成を妨害します。

itemsすべてのプロパティを設定するために使用されるカスタム クラスを作成できる場合があります。マジック関数内で、データをプッシュしてみることができます。少なくとも、いくつかの出力でデバッグすることができます。

リクエストを追跡し、XML 結果に直接アクセスします。

trace => trueoptions 配列にオプションを設定し、 を使用しますSoapClient::__getLastResponse

失敗に備えてください。

PHP は、取得した XML 構造を適切な結果に変換できない可能性があります。提供された SOAP API のせいだと思います。通常、リクエストにある種の ID を添付し、結果でこの ID を再利用して、クライアントが自分のものを識別できるようにすることを提案します。少なくとも「リクエストの順序で」返される構造は、常に同じアイテムを返し、次のように内部のどこかに結果を運ぶ必要があります。

<OperationResponse>
    <result>17</result>
</OperationResponse>
<OperationResponse>
    <Error>Some error occured</Error>
</OperationResponse>
于 2013-04-06T18:24:34.783 に答える