web-dev-qa-db-ja.com

PHP SoapClient呼び出しで作成されたXMLを、リクエストを送信する前または送信せずに検査します

質問:実際にリクエストを送信する前に、PHP SoapClient関数呼び出しで作成されるXMLを表示する方法はありますか?

バックグラウンド:

私はWSDL通信に不慣れであり、ASP.NETで記述されたWSDLサービスと通信する方法であるPHPでの開発を望んでいるクライアントがいます。私はかなり遠くまで来ましたが、複合型を渡すことになると問題に遭遇しています。これまでにいくつかのことを試しました。

1)_$params->Person->name_ _$params->Person->address_などの単一配列の設定

2)単一配列のセットアップ$Person = array('name'=>"joe",'address' = "123");

次に、パラメーター "Person"として呼び出しに渡します=> $ Person;と他のいくつか。しかし、エラーが発生するたびに

SoapException:サーバーは要求を処理できませんでした---> System.Exception:個人が必要です。サービス名。

トラブルシューティングをさらに進めるために、送信されているXMLドキュメントを確認して、期待どおりに複雑なタイプを作成しているかどうかを確認します。 $client = new SoapClient('wsdldoc.asmx?WSDL');を使用してサービスを作成し、$client->CreateUser($params);で呼び出してから、関数$client->__getLastRequest();を使用してサービスを表示しようとしていますが、__ getLastRequestに到達しないため、 CreateUser($ params)を呼び出すときの致命的なエラー。

もう一度質問します。CreateUser($ params)呼び出しによって作成されたXMLを実際に送信せずに致命的なエラーを引き起こさずにXMLを表示する方法はありますか

38
Joshua Cook

前書き:__getLastRequest() メソッドを正常に使用するには、「トレースを設定する必要があります'クライアント構築でtrueにするオプション:

_$client = new SoapClient('wsdldoc.asmx?WSDL', array('trace' => TRUE));
_

このようにして、リクエストは引き続き送信されます(したがって失敗します)が、送信されたxmlを後で検査できます$client->__getLastRequest()を呼び出します。


主な答え:

生成されたXMLbefore/withoutにリクエストを送信するためにアクセスするには、SoapClientをサブクラス化して __doRequest()をオーバーライドする必要があります。 メソッド:

_class SoapClientDebug extends SoapClient
{
  public function __doRequest($request, $location, $action, $version, $one_way = 0) {
      // Add code to inspect/dissect/debug/adjust the XML given in $request here

      // Uncomment the following line, if you actually want to do the request
      // return parent::__doRequest($request, $location, $action, $version, $one_way);
  }
}
_

その後、問題のデバッグ中に、元のSoapClientの代わりにこの拡張クラスを使用します。

81
Henrik Opel

同じ問題に取り組んでいるときにこのスレッドを見つけましたが、すでにSoapClient()クラスを拡張しているクラスを使用していて、あまりいじりたくなかったので困惑しました。ただし、クラスを開始するときに「exceptions」=> 0タグを追加すると、致命的なエラーはスローされません(例外が出力されます)。

SoapClient($soapURL,array("trace" => 1,"exceptions"=>0));

これにより、__ getLastRequest()を実行して、送信していたXMLを分析できました。

8
andrewembassy

作成中のXMLを確認できる方法はないと思います。主に、関数が作成または渡そうとして失敗しているためです。

すでに試したかどうかはわかりませんが、関数に渡す必要があるものを正確に判断するのに問題がある場合は、次のように使用できます。

$ client-> __ getTypes();

http://us3.php.net/manual/en/soapclient.gettypes.php

お役に立てれば!

1
BrandonCS