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

2022-08-30 11:28:38

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

背景:

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

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

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

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

Soap异常: 服务器无法处理请求--->系统。异常: 人员是必需的。在服务名称处。

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

问题又来了:有没有办法查看由 CreateUser($params) 调用创建的 XML,而无需实际发送它并导致致命错误


答案 1

前言:为了成功使用 __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。


答案 2

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

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

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

这样做使我能够运行和分析我正在发送的XML。__getLastRequest()


推荐