如何查看 PHP SOAP 客户端类生成的实际 XML?

Posted

技术标签:

【中文标题】如何查看 PHP SOAP 客户端类生成的实际 XML?【英文标题】:How do I see the actual XML generated by PHP SOAP Client Class? 【发布时间】:2011-04-04 02:21:59 【问题描述】:

考虑这个示例 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。

【问题讨论】:

【参考方案1】:

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

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

请记住,此方法仅在使用设置为 TRUEtrace 选项创建的 SoapClient 对象时有效。因此,在创建对象时,请使用以下代码:

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

【讨论】:

6 年后仍然有用 同样,如果你想得到响应 XML,使用SoapClient::__getLastResponse()。见this。【参考方案2】:

您需要在创建 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

【讨论】:

我试图获取 XML 值,我的代码:justpaste.it/3rwzs 并将值作为对象返回,我怎样才能将我的值作为 XML 获取?谢谢@Ezequiel Muns @Gem 您可以使用echo htmlentities($SOAP->__getLastRequest()); 将其视为 XML【参考方案3】:

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

如果您是远程运行它,那么您可以使用Apache TCPMON Standalone 或通过eclipse* 之类的东西

*只是链接到Google的第一个命中

【讨论】:

如果 SOAP 服务在 https 之后,Fiddler 将毫无用处,因为 php_openssl.dll 无法追踪,因为它没有使用 wininet。【参考方案4】:
$SOAP = new SoapClient($WSDL, array('trace' => true));

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

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

这不仅会打印最后一个请求,还会使 XML 标记在浏览器中可见。

【讨论】:

是的,这是我的 GOTCHA!我愚蠢地忘记了 Chrome 只是删除了它找到的所有 XML,因此
 包装响应并认为 SoapClient 拒绝显示最后一个请求并不重要。一个简单的 view:source 纠正了这一点,而 htmlspecialchars() 让它变得更好。
【参考方案5】:

如果您想在不实际建立连接的情况下查看请求,您可以覆盖 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);

【讨论】:

【参考方案6】:

扩展 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);


【讨论】:

【参考方案7】:

Quinn Comendant's 的问题是,来自__doRequest()$request 然后将由__call() 处理,用户将看到一个参数数组而不是真正的 xml 请求。为了防止这种情况,可以使用这样的解决方法:

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()或其他相关函数。

【讨论】:

以上是关于如何查看 PHP SOAP 客户端类生成的实际 XML?的主要内容,如果未能解决你的问题,请参考以下文章

始终在soap客户端php中作为无效会话令牌获得响应

如何使用代码生成的 SOAP 客户端?

查看 WCF 生成的 SOAP 消息体

PHP SOAP 扩展 Web Service 例子

尝试在 PHP 中使用 x.509 证书对 SOAP 调用进行数字签名

浅学soap--------2