【问题标题】:How to dump SoapClient request for debug?如何转储 SoapClient 请求以进行调试?
【发布时间】:2012-12-25 11:30:49
【问题描述】:

我需要调试一些使用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 请求的 body 和 headers 的内容?

【问题讨论】:

    标签: php soap


    【解决方案1】:

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

    试试:

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

    【讨论】:

    • 即使@xdazz 是正确的,我强烈建议您也将"exceptions" =&gt; 0 添加到 SoapClient 方法中的参数中,这样即使收到错误的响应,您也可以查看正在拨打的电话。跨度>
    【解决方案2】:

    调试 SOAP 请求

    1. 使用 SOAP 扩展

    调试 SOAP 请求的最简单和最好的* 方法确实是创建一个 SOAP extension,它使用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 文件夹(请参阅 phpinfo() 中的 tmp 文件夹路径)以强制 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

    调试 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 跟踪和调试应用程序也非常有用:除了像 SoapUI 这样的常见嫌疑人之外,还有像 here 所述的 Charles 等中间跟踪代理。这种方法的缺点是添加了更多的层,因此可能会引入新的问题,例如握手问题。

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

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

    日志,日志,日志

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

    【讨论】:

    • 我添加了这个,因为它经常出现,唯一的答案没有添加上下文。
    • When developing SOAP solutions in PHP it is also a good idea to clean the PHP tmp folder
    • 非常感谢缓存信息,不知道,对我帮助很大!
    【解决方案3】:

    我只是总结一下:

    $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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多