44

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

背景:

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

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

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

然后作为参数 "Person" => $Person; 传入调用 和其他一些人。但每次我得到错误

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

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

再次提出问题:有什么方法可以查看由 CreateUser($params) 调用创建的 XML,而无需实际发送它并导致致命错误

4

3 回答 3

87

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

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

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


主要答案:

要在发送请求之前/不发送请求之前访问生成的 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。

于 2009-10-26T18:40:52.693 回答
8

我在处理同一个问题时发现了这个线程,并且很沮丧,因为我使用的类已经扩展了SoapClient()该类并且不想过多地使用它。

但是,如果您在"exceptions"=>0启动类时添加标签,它不会抛出致命错误(尽管它会打印异常):

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

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

于 2013-01-07T23:15:59.720 回答
1

I don't believe there is a way that you'll be able to see any XML that's being created... mainly because the function is failing on it's attempt to create/pass it.

Not sure if you tried already, but if you're having trouble trying to decide what exactly you need to pass into the function you could use:

$client->__getTypes();

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

Hope this helps!

于 2009-10-26T18:38:14.400 回答