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

在发送请求之前/不发送请求时检查PHP SoapClient调用创建的XML,php,xml,soap,soap-client,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

问题是: 在实际发送请求之前,是否有一种方法可以查看通过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:服务器无法运行 处理请求--->系统。异常: 需要一个人。在服务名称处

为了进一步排除故障,我想查看正在发送的XML文档,看看它是否以我期望的方式创建了复杂类型。 我使用
$client=newsoapclient('wsdldoc.asmx?WSDL')创建服务使用
$client->CreateUser($params)调用它$client->\uu getLastRequest()查看它
但它从未到达_getLastRequest,因为它在调用CreateUser($params)时遇到致命错误

问题再次提出:
是否有任何方法可以查看CreateUser($params)调用创建的XML而不实际发送它并导致致命错误

我不相信有任何方法可以查看正在创建的任何XML。。。主要是因为函数在尝试创建/传递它时失败

不确定您是否已经尝试过,但如果您在尝试确定您需要传递到您可以使用的函数中的确切内容时遇到困难:

$client->__getTypes();


希望这有帮助

预先备注:为了成功使用该方法,必须在客户端构造时将“跟踪”选项设置为true:

$client = new SoapClient('wsdldoc.asmx?WSDL', array('trace' => TRUE));
这样,您的请求仍然会被发送(因此仍然会失败),但是您可以在之后通过调用
$client->\uu getLastRequest()
来检查发送的xml


主要答案:

要在发送请求之前/不发送请求的情况下访问生成的XML,您需要对SoapClient进行子类化,以便覆盖该方法:


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

我在处理同一问题时发现了此线程,我感到很不高兴,因为我使用的类已经扩展了SoapClient()类,不想过多地使用它。但是,如果在初始化类时添加“exceptions”=>0标记,则不会引发致命错误(尽管它会打印异常):


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

如果他遇到异常(“SoapException:服务器无法处理请求”),则会在服务器端引发错误,因此他应该能够通过
\uu getLastRequest()
检查发送的XML,如果他使用“trace”选项,我确实将trace设置为true,但由于某种原因,脚本在调用后会死掉。甚至不能执行$client->createuser();然后是回音“完成呼叫”;电话总是打不通。然而,你的主要答案正是我想要的。非常感谢。我现在发现,由于某种原因,XML文档中没有传递任何参数。也许我没有正确调用函数或者其他什么。我会继续找的。再次感谢你。我从没想过要超过这个要求。这让我看到了解决类似问题所需的方法。SoapClient在失败时抛出异常。您可能需要将调用包装在try/catch块中,以便稍后调用
\uu getLastRequst()
。这是一个非常有用的答案,谢谢您,Henrik!如果在\uuuu call或\uuuu soapcall内验证失败,则返回null。请给我一天时间。如果没有设置为0的异常,则getLastRequest不会返回任何内容。
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($soapURL,array("trace" => 1,"exceptions"=>0));