如何查看PHP SOAP Client Class生成的实际XML?

时间:2010-08-26 06:02:01

标签: php xml soap

考虑这个示例SOAP客户端脚本:

$SOAP = new SoapClient($WDSL); // Create a SOAP Client from a WSDL

// Build an array of data to send in the request.
$Data = array('Something'=>'Some String','SomeNumber'=>22); 

$Response = $SOAP->DoRemoteFunction($Data); // Send the request.

在最后一行,PHP从您指定的数组中获取参数,并使用WSDL构建要发送的XML请求,然后发送它。

如何让PHP向我展示它构建的实际XML?

我正在对应用程序进行故障排除,需要查看请求的实际XML。

7 个答案:

答案 0 :(得分:100)

使用getLastRequest。它返回上一个SOAP请求中发送的XML。

echo "REQUEST:\n" . $SOAP->__getLastRequest() . "\n";

请记住,只有在trace选项设置为TRUE的情况下创建SoapClient对象时,此方法才有效。因此,在创建对象时,请使用以下代码:

$SOAP = new SoapClient($WDSL, array('trace' => 1));

答案 1 :(得分:16)

$SOAP = new SoapClient($WSDL, array('trace' => true));

$Response = $SOAP->DoRemoteFunction($Data);

echo "REQUEST:\n" . htmlentities($SOAP->__getLastRequest()) . "\n";

这不会打印最后一个请求,但也会在浏览器中显示xml标记

答案 2 :(得分:14)

如果您想在不实际建立连接的情况下查看请求,可以覆盖SoapClient的__doRequest方法以返回XML:

class DummySoapClient extends SoapClient {
    function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
    }
    function __doRequest($request, $location, $action, $version, $one_way = 0) {
        return $request;
    }
}
$SOAP = new DummySoapClient('http://example.com/?wsdl', array('trace' => true));
echo $SOAP->GetRequestDetail($params);

答案 3 :(得分:9)

扩展Quinn的答案,您也可以在执行请求之前记录请求。

class SoapClientDebug extends SoapClient
{

public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
    error_log("REQUEST:\n" .$request . "\n");
    error_log("LOCATION:\n" .$location . "\n");
    error_log("ACTION:\n" .$action . "\n");
    error_log("VERSION:\n" .$version . "\n");
    error_log("ONE WAY:\n" .$one_way . "\n");

    return parent::__doRequest($request, $location, $action, $version, $one_way);
}
}

答案 4 :(得分:6)

您需要在创建SoapClient时启用跟踪。像这样:

$SOAP = new SoapClient($WSDL, array('trace' => true));

$Data = array('Something'=>'Some String','SomeNumber'=>22); 

然后在进行服务调用后调用__getLastRequest方法以查看XML。

$Response = $SOAP->DoRemoteFunction($Data);
echo $SOAP->__getLastRequest();

这将输出请求XML。

更多阅读:http://www.php.net/manual/en/soapclient.getlastrequest.php

答案 5 :(得分:3)

如果您在本地运行客户端,Fiddler是一种很好的与实现无关的方式来查看线路上的消息。

如果您远程运行它,那么您可以使用Apache TCPMON Standaloneeclipse *

之类的内容

*只是链接到Google

的第一个匹配

答案 6 :(得分:1)

Quinn Comendant's回答的问题,来自$request的{​​{1}}将由__doRequest()处理,用户将看到一系列参数而不是真正的xml请求。为防止这种情况,可以使用此类解决方法:

__call()

此处不需要选项class DummySoapClient extends SoapClient { function __construct($wsdl, $options) { parent::__construct($wsdl, $options); } function __doRequest($request, $location, $action, $version, $one_way = 0) { throw new Exception($request); } function __call($function_name, $arguments) { try { parent::__call($function_name, $arguments); } catch (Exception $e) { return $e->getMessage(); } } } ,因为我们不会调用trace或其他相关功能。