60

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 リクエストの本文とヘッダーの内容を取得する方法は?

4

3 に答える 3

58

これらの関数は、トレース オプションを TRUE に設定してSoapClient オブジェクトが作成された場合にのみ。

試す:

$client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL", array('trace' => 1));
于 2012-12-25T11:33:41.630 に答える
34

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

  1. SOAP 拡張機能の使用

* SOAP リクエストをデバッグする最も簡単で最良の方法は、 SoapClientクラスの次の関数を使用して、Web サービスまたは Web サービス クライアントからの未加工の SOAP リクエストと未加工の SOAP 応答をログに記録するSOAP 拡張機能を作成することです。

それを機能させるには、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());
}

PHP で SOAP ソリューションを開発する場合は、WSDL コントラクトが変更されたときに PHP tmp フォルダーをクリーンアップして (tmpフォルダー パスを参照phpinfo())、キャッシュされたファイルを使用する代わりに、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 をデバッグするもう 1 つの興味深いオプションは、Xdebug とお気に入りの IDE のデバッグ セッション Cookie を設定することです。

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

特化したSOAPトレース & デバッグアプリも非常に便利です。この方法の欠点は、より多くのレイヤーが追加されるため、ハンドシェイクの問題などの新しい問題が発生する可能性があることです。

検証と呼び出しを行うXML Spy SOAP DebuggerSOAPSonarなど、価値のある市販の SOAP Debugger もあります。いずれにせよ、SoapUI は常に良い仲間です。

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

ログ、ログ、ログ

基本的なエラー情報は、PHP ログと Web サーバー ログでも確認できます。完全なエラー ログがオンになっていることを確認します。

于 2018-06-14T00:11:30.583 に答える