Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何转储SoapClient请求以进行调试?_Php_Soap - Fatal编程技术网

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

Php 如何转储SoapClient请求以进行调试?,php,soap,Php,Soap,我需要调试一些使用soap客户端的代码。我在php.net中找到了getLast*方法,但当我尝试获取调试的最后一个请求时,它返回NULL <?php $client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL"); $response = $client->ChangePowerUnit(array( "PowerVal

我需要调试一些使用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);

?>
如何获取上一个SoapClient请求的正文和标题的内容?

只有在创建SoapClient对象时,跟踪选项设置为TRUE才有效

尝试:

调试SOAP请求
  • 使用SOAP扩展
  • 调试SOAP请求最简单、最好的*方法实际上是创建一个日志,使用类的以下函数记录来自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文件夹(请参阅
    phpinfo()
    中的
    tmp
    文件夹路径),以强制PHP SOAP客户端再次下载WSDL和XSD文件,而不是使用缓存文件(直到它们过期)

    此外,在开发时设置
    异常
    缓存wsdl
    以及
    soap_版本
    等选项非常有用:

    $options = array( 
        'soap_version'=>SOAP_1_2, 
        'exceptions'=>false, 
        'trace'=>1, 
        'cache_wsdl'=>WSDL_CACHE_NONE 
    );
    
    *使用SOAP扩展进行调试的缺点是证书错误发生在实际请求之前。因此,当出现某种连接故障时,不可能使用getLastRequest()或getLastResponse()

  • 使用Xdebug
  • 调试SoapClient的另一个有趣的选项是为Xdebug和您喜爱的IDE设置调试会话cookie

    $client = new SoapClient(
        'http://example.loc/index.php/api/v2_soap/?wsdl'
    );
    $client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
    
  • 使用专门的SOAP跟踪程序和调试器
  • 专门的SOAP跟踪和调试应用程序也非常有用:除了常见的可疑程序(如所述)之外,还有中间跟踪代理(如Charles)。这种方法的缺点是增加了更多的层,因此可能会带来新的问题,例如握手问题

    也有一些商业的SOAP调试器是值得花钱的,比如做验证和调用的or。无论如何,SoapUI总是一个很好的伴侣

    如果怀疑网络协议级别存在问题,请尝试使用Unix和Windows网络协议分析器

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

    我只是将其打包以供操作:

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

    尽管@xdazz是正确的,但我强烈建议您也添加
    “异常”=>0
    添加到SoapClient方法中的参数中,这样即使收到错误的响应,您也可以查看正在进行的调用。我添加了这一点,因为这经常出现,唯一的答案没有添加上下文。
    在PHP中开发SOAP解决方案时,清理PHP tmp文件夹也是一个好主意
    非常感谢您的帮助缓存信息,我不知道,这对我很有帮助!
    $client = new SoapClient(
        'http://example.loc/index.php/api/v2_soap/?wsdl'
    );
    $client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
    
    $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());
    }