Inspect XML created by PHP SoapClient call before/without sending the request

为君一笑 提交于 2019-12-17 15:23:06

问题


The question: Is there a way to view the XML that would be created with a PHP SoapClient function call BEFORE you actually send the request?

background:

I am new to WSDL communication, and I have a client who wants me to develop in PHP, a way to communicate with a WSDL service written in ASP.NET. I have gotten pretty far, but am running into an issue when it comes to passing a complex type. I have tried a couple of different things so far.

1) Setting up a single array such as $params->Person->name $params->Person->address

2) Setting up a single array $Person = array('name'=>"joe",'address' = "123");

then passing into the call as a param "Person" => $Person; and a few others. But every time I get the error

SoapException: Server was unable to process request ---> System.Exception: Person is Required. at service name.

In order to further the troubleshooting, I would like to see the XML document that is being sent to see if it is creating a complex type in the way I am expecting it to. I am creating the service using $client = new SoapClient('wsdldoc.asmx?WSDL'); calling it with $client->CreateUser($params); and then trying to see it using the function $client->__getLastRequest(); but it never makes it to the __getLastRequest because it hits a fatal error when calling CreateUser($params).

The question again: Is there any way to view the XML created by the CreateUser($params) call WITHOUT actually sending it and causing a fatal error


回答1:


Upfront remark: In order to use the __getLastRequest() method successfully, you have to set the 'trace' option to true on client construction:

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

This way, your request will still be sent (and therefore still fail), but you can inspect the sent xml afterwards by calling $client->__getLastRequest().


Main answer:

To get access to the generated XML before/without sending the request, you'd need to subclass the SoapClient in order to override the __doRequest() method:

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);
  }
}

You'd then use this extended class instead of the original SoapClient while debugging your problem.




回答2:


I found this thread while working on the same problem, and was bummed because I was using classes that already extended the SoapClient() class and didn't want to screw around with it too much. However if you add the "exceptions"=>0 tag when you initiate the class, it won't throw a Fatal Error (though it will print an exception):

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

Doing that allowed me to run __getLastRequest() and analyze the XML I was sending.




回答3:


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!



来源:https://stackoverflow.com/questions/1626423/inspect-xml-created-by-php-soapclient-call-before-without-sending-the-request

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!