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

How do I see the actual XML generated by PHP SOAP Client Class?

考虑以下示例SOAP Client脚本:

1
2
3
4
5
6
$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。


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

1
2
3
echo"REQUEST:\
"
. $SOAP->__getLastRequest() ."\
"
;

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

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


1
2
3
4
5
6
7
$SOAP = new SoapClient($WSDL, array('trace' => true));

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

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

这将不会打印上一个请求,但也会使xml标记在浏览器中可见


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

如果要远程运行它,则可以使用Apache TCPMON Standalone或通过eclipse *之类的工具

*仅链接到Google的第一则匹配


Quinn Comendant的答案存在问题,即__call()中的$request然后将由__call()处理,并且用户将看到参数数组,而不是实际的xml请求。为防止这种情况,可以使用以下解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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,因为我们不会调用__getLastRequest()或其他相关函数。