44

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

バックグラウンド:

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

1)次のような単一のアレイを設定する$params->Person->name $params->Person->address

2)単一のアレイを設定する$Person = array('name'=>"joe",'address' = "123");

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

SoapException:サーバーはリクエストを処理できませんでした---> System.Exception:PersonisRequired。サービス名で。

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

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

4

3 に答える 3

87

事前の注意:メソッドを正常に使用するには、__getLastRequest()クライアントの構築時に「trace」オプションをtrueに設定する必要があります。

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

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


主な答え:

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

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の代わりにこの拡張クラスを使用します。

于 2009-10-26T18:40:52.693 に答える
8

同じ問題に取り組んでいるときにこのスレッドを見つけましたが、すでにクラスを拡張しているクラスを使用していて、SoapClient()あまりやりたくないので、失敗しました。

ただし、クラスを開始するときにタグを追加する"exceptions"=>0と、致命的なエラーはスローされません(ただし、例外が出力されます)。

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

そうすることで__getLastRequest()、送信していたXMLを実行して分析することができました。

于 2013-01-07T23:15:59.720 に答える
1

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

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

$client->__getTypes();

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

お役に立てれば!

于 2009-10-26T18:38:14.400 に答える