web-dev-qa-db-ja.com

デバッグのためにSoapClientリクエストをダンプする方法は?

Soapクライアントを使用するコードをデバッグする必要があります。 php.netでgetLast *メソッドを見つけましたが、デバッグの最後の要求を取得しようとすると、NULLが返されます

<?php

    $client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL");

    $response = $client->ChangePowerUnit(array(
        "PowerValue" => 100,
        "fromPowerUnit" => "horsepower",
        "toPowerUnit" => "megawatts"
    ));


    echo "====== REQUEST HEADERS =====" . PHP_EOL;
    var_dump($client->__getLastRequestHeaders());
    echo "========= REQUEST ==========" . PHP_EOL;
    var_dump($client->__getLastRequest());
    echo "========= RESPONSE =========" . PHP_EOL;
    var_dump($response);

?>

コード実行の結果:

$php soap_test.php 

====== REQUEST HEADERS =====
NULL
========= REQUEST ==========
NULL
========= RESPONSE =========
object(stdClass)#2 (1) {
  ["ChangePowerUnitResult"]=>
  float(0.0746)
}

最後のSoapClientリクエストの本文とヘッダーのコンテンツを取得する方法は?

52

SOAPリクエストをデバッグする

  1. SOAP拡張機能を使用する

最も簡単で最高の* SOAPリクエストをデバッグする方法は、実際に SOAP拡張 を作成することです。これは、生のSOAPリクエストと生のSOAPレスポンスを記録します SoapClient クラスの以下の機能を使用するWebサービスまたはWebサービスクライアント:

動作させるには、xdazzで述べられているように、トレースオプションをオンにしてSoapClientオブジェクトを作成する必要があります。

_$client = new MySoapClient($wsdlUrl, array('trace' => 1));
_

次に、try-catchブロックにラップされたSOAP呼び出しを実行します。

_try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup request failed! Response: ".$client->__getLastResponse());
}
_

SOAPでPHPソリューションを開発する場合、WSDLコントラクトが変更されたときにPHP tmpフォルダーを削除することもお勧めします(tmpphpinfo())のフォルダーパスを使用して、キャッシュファイルを使用する代わりに(有効期限が切れるまで)PHP SoapClientにWSDLファイルとXSDファイルを再度ダウンロードさせます。

さらに、開発中にexceptionsや_cache_wsdl_などのオプションと_soap_version_バージョンを設定すると便利です。

_$options = array( 
    'soap_version'=>SOAP_1_2, 
    'exceptions'=>false, 
    'trace'=>1, 
    'cache_wsdl'=>WSDL_CACHE_NONE 
);
_

*SOAP拡張機能を使用したデバッグの欠点は、実際の要求などの前に証明書エラーが発生することです。そのため、何らかの接続障害が発生した場合、getLastRequest()またはgetLastResponse()を使用することはできません。

  1. Xdebugの使用

SoapClientをデバッグする別の興味深いオプションは、Xdebugおよびお気に入りのIDEのデバッグセッションCookieを設定することです

_$client = new SoapClient(
    'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
_
  1. 特殊なSOAPトレーサーとデバッガーを使用する

特殊なSOAP Trace&Debugアプリも非常に便利です: SoapUI のような通常の容疑者に加えて、Charlesのような中間トレースプロキシもあります here 。この方法の欠点は、レイヤーが追加されるため、新しい問題が発生する可能性があることです。ハンドシェイクの問題。

XML Spy SOAP Debugger または SOAPSonar のような、お金に見合う商用SOAPデバッガーもあります。検証と呼び出し。いずれにしても、SoapUIは常に良い仲間です。

ネットワークプロトコルレベルに問題があると思われる場合は、UnixおよびWindows用のネットワークプロトコルアナライザーである Wireshark を試してください。

ログ、ログ、ログ

基本的なエラー情報は、PHPログおよびWebサーバーログにもあります。完全なエラーログを有効にしていることを確認します。

22
wp78de

これらの関数は、SoapClientオブジェクトがに設定され、トレースオプションがTRUE

試してください:

$client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL", array('trace' => 1));
55
xdazz

私はただ行動のためにそれをまとめます:

$client = new \SoapClient("http://127.0.0.1/services/wsdl2",array('trace' => 1,));
try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup Request Failed! Response:\n".$client->__getLastResponse());
}
1
MSS