我需要调试使用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 extension,它使用SoapClient类的以下函数从Web服务或Web服务客户端记录原始SOAP请求和原始SOAP响应:
要使其工作,您必须创建SoapClient对象并启用跟踪选项,如xdazz所述:
$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()。
调试SoapClient的另一个有趣选项是为Xdebug和您喜欢的IDE设置调试会话cookie
$client = new SoapClient(
'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
专门的SOAP跟踪和调试应用程序也非常有用:除了像SoapUI这样的常见嫌疑人之外,还有像Charles这样的中间跟踪代理here。这种方法的缺点是增加了更多的层,因此可能引入新的问题,例如握手问题。
还有一些商业SOAP调试器是值得的,如XML Spy SOAP Debugger或SOAPSonar进行验证和调用。无论如何,SoapUI始终是一个很好的伴侣。
如果您怀疑网络协议级别存在问题,请尝试使用适用于Unix和Windows的网络协议分析程序Wireshark。
也可以在PHP日志和Web服务器日志中找到基本错误信息。确保已打开完整错误日志记录。
These functions仅在创建SoapClient对象并将trace选项设置为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());
}