60

我需要调试一些使用肥皂客户端的代码。我在 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

这些函数仅在创建 SoapClient 对象且跟踪选项设置为 TRUE时才有效。

尝试:

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

调试 SOAP 请求

  1. 使用 SOAP 扩展

调试 SOAP 请求的最简单和最好的*方法确实是创建一个SOAP 扩展,使用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_wsdlsoap_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 Tracer & Debugger

专门的 SOAP Trace & Debug 应用程序也非常有用:除了像SoapUI这样的常见嫌疑人之外,还有像 Charles 这样的中间跟踪代理,如此所述。这种方法的缺点是添加了更多的层,因此可能会引入新的问题,例如握手问题。

还有一些物有所值的商业 SOAP 调试器,例如XML Spy SOAP DebuggerSOAPSonar ,它们可以进行验证和调用。无论如何,SoapUI 总是一个很好的伴侣。

如果您怀疑网络协议级别存在问题,请尝试Wireshark,这是一个适用于 Unix 和 Windows 的网络协议分析器。

日志,日志,日志

基本错误信息也可以在 PHP 日志和 Web 服务器日志中找到。确保您已打开完整的错误日志记录。

于 2018-06-14T00:11:30.583 回答
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());
}
于 2018-07-02T06:58:04.027 回答