如何转储SoapClient请求进行调试?

时间:2012-12-25 11:30:50

标签: php soap

我需要调试使用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请求的正文和标题的内容?

3 个答案:

答案 0 :(得分:55)

These functions 仅在SoapClient对象创建且跟踪选项设置为TRUE 时才有效。

尝试:

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

答案 1 :(得分:14)

调试SOAP请求

  1. 使用SOAP扩展
  2. 调试SOAP请求的最简单和最好的 * 方法确实是创建一个SOAP extension来记录来自Web服务或Web服务客户端的原始SOAP请求和原始SOAP响应使用SoapClient类的以下函数:

    要使其正常工作,您必须在打开跟踪选项的情况下创建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文件而不是使用缓存文件(直到它们过期)。

    此外,在开发时设置exceptionscache_wsdl以及soap_version版本等选项非常有用:

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

    * 使用SOAP扩展进行调试的缺点是证书错误发生在实际请求之前。因此,当某种连接失败时,无法使用getLastRequest()或getLastResponse()。

    1. 使用Xdebug
    2. 调试SoapClient的另一个有趣选项是为Xdebug和您最喜欢的IDE设置调试会话cookie

      $client = new SoapClient(
          'http://example.loc/index.php/api/v2_soap/?wsdl'
      );
      $client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
      
      1. 使用专门的SOAP Tracer&amp;调试器
      2. 专业SOAP跟踪&amp;调试应用程序也非常有用:除了像SoapUI这样的常见嫌疑人之外,还有像Charles所描述的here之类的中间跟踪代理。这种方法的缺点是增加了更多的层,因此可能引入新的问题,例如握手问题。

        还有一些商业SOAP调试器是值得的,比如执行验证和调用的XML Spy SOAP DebuggerSOAPSonar。无论如何,SoapUI始终是一个很好的伴侣。

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

        日志,日志,日志

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

答案 2 :(得分: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());
}