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

时间:2009-10-26 18:17:26

标签: php xml soap soap-client

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

背景:

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

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

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

然后作为参数传递到调用“Person”=> $人; 还有其他几个。但每次我收到错误

  

SoapException:服务器无法执行   处理请求---> System.Exception的:   人是必需的。在服务名称。

为了进一步排除故障,我希望看到正在发送的XML文档,以查看它是否按照我期望的方式创建复杂类型。 我正在使用$client = new SoapClient('wsdldoc.asmx?WSDL');使用$client->CreateUser($params);调用它来创建服务,然后尝试使用函数$client->__getLastRequest();查看它,但它从未进入__getLastRequest,因为它在调用CreateUser时遇到致命错误($ params)方法。

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

3 个答案:

答案 0 :(得分:80)

Upfront remark:为了成功使用__getLastRequest()方法,您必须在客户端构建时将'trace'选项设置为true:

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

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


主要答案:

要在发送请求之前/之后访问生成的XML ,您需要继承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);
  }
}

然后在调试问题时使用此扩展类而不是原始SoapClient。

答案 1 :(得分:8)

我在处理同样的问题时发现了这个线程,并且因为我使用的类已经扩展了SoapClient()类并且不想过多地使用它而感到沮丧。但是,如果在启动类时添加“exceptions”=&gt; 0标记,则不会抛出致命错误(尽管它会打印异常):

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

这样做允许我运行__getLastRequest()并分析我发送的XML。

答案 2 :(得分:1)

我不相信有一种方法可以让你看到正在创建的任何XML ...主要是因为该功能在尝试创建/传递它时失败。

不确定您是否已经尝试过,但如果您在尝试确定需要传递给您可以使用的功能的确切内容时遇到问题:

$客户端 - &GT; __ getTypes();

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

希望这有帮助!