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リクエストの本文とヘッダーのコンテンツを取得する方法は?
最も簡単で最高の* 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フォルダーを削除することもお勧めします(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()を使用することはできません。
SoapClientをデバッグする別の興味深いオプションは、Xdebugおよびお気に入りのIDEのデバッグセッションCookieを設定することです
_$client = new SoapClient(
'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
_
特殊なSOAP Trace&Debugアプリも非常に便利です: SoapUI のような通常の容疑者に加えて、Charlesのような中間トレースプロキシもあります here 。この方法の欠点は、レイヤーが追加されるため、新しい問題が発生する可能性があることです。ハンドシェイクの問題。
XML Spy SOAP Debugger または SOAPSonar のような、お金に見合う商用SOAPデバッガーもあります。検証と呼び出し。いずれにしても、SoapUIは常に良い仲間です。
ネットワークプロトコルレベルに問題があると思われる場合は、UnixおよびWindows用のネットワークプロトコルアナライザーである Wireshark を試してください。
基本的なエラー情報は、PHPログおよびWebサーバーログにもあります。完全なエラーログを有効にしていることを確認します。
これらの関数は、SoapClientオブジェクトがに設定され、トレースオプションがTRUE。
試してください:
$client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL", array('trace' => 1));
私はただ行動のためにそれをまとめます:
$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());
}