Inspect XML created by PHP SoapClient call before/without sending the request
php, soap, soap-client, xml
Solution
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.
Problem
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