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

Den*_*hin 53 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);

?>
Run Code Online (Sandbox Code Playgroud)

代码执行的结果:

$php soap_test.php 

====== REQUEST HEADERS =====
NULL
========= REQUEST ==========
NULL
========= RESPONSE =========
object(stdClass)#2 (1) {
  ["ChangePowerUnitResult"]=>
  float(0.0746)
}
Run Code Online (Sandbox Code Playgroud)

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

xda*_*azz 56

只有在将trace选项设置为TRUE的情况下创建SoapClient对象时,这些函数才有效.

尝试:

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

  • 即使@xdazz是正确的,我强烈建议在SoapClient方法中的参数中添加"`""exceptions"=> 0```,这样即使收到错误的响应,您也可以查看正在进行的调用. (2认同)

wp7*_*8de 23

调试SOAP请求

  1. 使用SOAP扩展

最简单和最*的方式来调试SOAP请求的确是创建一个SOAP扩展,它记录的原始SOAP请求,并从使用以下功能的Web服务或Web服务客户端的原始SOAP响应SoapClient的类:

要使其工作,您必须创建SoapClient对象并启用跟踪选项,如xdazz所述:

$client = new MySoapClient($wsdlUrl, array('trace' => 1));
Run Code Online (Sandbox Code Playgroud)

然后运行包含在try-catch块中的SOAP调用:

try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup request failed! Response: ".$client->__getLastResponse());
}
Run Code Online (Sandbox Code Playgroud)

在PHP中开发SOAP解决方案时,最好在WSDL合约更改时清除PHP tmp文件夹(请参阅tmp文件夹路径phpinfo())以强制PHP SoapClient再次下载WSDL和XSD文件,而不是使用缓存文件(直到他们到期了).

此外,在开发过程中设置类似exceptionscache_wsdlsoap_version版本的选项很有用:

$options = array( 
    'soap_version'=>SOAP_1_2, 
    'exceptions'=>false, 
    'trace'=>1, 
    'cache_wsdl'=>WSDL_CACHE_NONE 
);
Run Code Online (Sandbox Code Playgroud)

*使用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');
Run Code Online (Sandbox Code Playgroud)
  1. 使用专门的SOAP Tracer和调试器

专门SOAP跟踪和调试应用程序是非常有用的太:除了通常的嫌疑人喜欢了SoapUI,也有如上所述中间跟踪代理像查尔斯这里.这种方法的缺点是增加了更多的层,因此可能会引入新的问题,例如握手问题.

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

如果您怀疑网络协议级别存在问题,请尝试使用Wireshark,一种用于Unix和Windows的网络协议分析器.

日志,日志,日志

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

  • “用PHP开发SOAP解决方案时,清理PHP tmp文件夹也是一个好主意。” &lt;-当我什么都没留下任何日志痕迹时,这对我来说是固定的。 (3认同)