检查由PHP SoapClient调用在/不发送请求之前创build的XML

问题:在实际发送请求之前,有没有办法查看使用PHP SoapClient函数调用创build的XML?

背景:

我是WSDL通信的新手,我有一个客户希望我使用PHP进行开发,这是一种与使用ASP.NET编写的WSDL服务进行通信的方式。 我已经得到了很多,但是在传递一个复杂的types时遇到了一个问题。 到目前为止,我已经尝试了几个不同的东西。

1)设置单个数组,例如$params->Person->name $params->Person->address

2)设置一个数组$Person = array('name'=>"joe",'address' = "123");

然后作为parameter passing给调用“Person”=> $ Person; 和其他一些。 但每次我得到错误

SoapException:服务器无法处理请求—> System.Exception:Person是必需的。 在服务名称。

为了进一步解决问题,我想查看正在发送的XML文档,以查看它是否以我期待的方式创build复杂types。 我正在使用$client = new SoapClient('wsdldoc.asmx?WSDL');创build服务$client = new SoapClient('wsdldoc.asmx?WSDL');$client->CreateUser($params);调用它$client->CreateUser($params); 然后尝试使用函数$client->__getLastRequest();来查看它$client->__getLastRequest(); 但它从来没有使__getLastRequest,因为它在调用CreateUser($ params)时发生致命错误。

再次的问题:有没有办法查看由CreateUser($ params)调用创build的XML而不实际发送它,并导致致命的错误

预先注释:为了成功使用__getLastRequest()方法,必须在客户端构造上将“trace”选项设置为true:

 $client = new SoapClient('wsdldoc.asmx?WSDL', array('trace' => TRUE)); 

这样,您的请求仍然会被发送 (因此仍然失败),但是您可以通过调用$client->__getLastRequest()来检查发送的xml。


主要答案:

为了发送请求之前或之后访问生成的XML,您需要__doRequest() SoapClient以覆盖__doRequest()方法:

 class SoapClientDebug extends SoapClient { public function __doRequest($request, $location, $action, $version, $one_way = 0) { // Add code to inspect/dissect/debug/adjust the XML given in $request here // Uncomment the following line, if you actually want to do the request // return parent::__doRequest($request, $location, $action, $version, $one_way); } } 

然后,在debugging问题时,使用这个扩展类而不是原始的SoapClient。

我在处理同样的问题时发现了这个线程,因为我使用的类已经扩展了SoapClient()类,并且不想太过于使用它。 但是,如果在启动类时添加“exceptions”=> 0标记,则不会引发致命错误(尽pipe它会打印一个exception):

 SoapClient($soapURL,array("trace" => 1,"exceptions"=>0)); 

这样做可以让我运行__getLastRequest()并分析我发送的XML。

我不相信有一种方法可以看到正在创build的任何XML ……主要是因为该函数尝试创build/传递该函数失败。

不知道你是否已经尝试过了,但是如果在尝试确定你需要传递给函数的时候遇到了麻烦,你可以使用:

$客户 – > __ getTypes();

http://us3.php.net/manual/en/soapclient.gettypes.php

希望这可以帮助!