Nick
Nick

Reputation: 11394

How do I see the actual XML generated by PHP SOAP Client Class?

Consider this example SOAP Client script:

$SOAP = new SoapClient($WDSL); // Create a SOAP Client from a WSDL

// Build an array of data to send in the request.
$Data = array('Something'=>'Some String','SomeNumber'=>22); 

$Response = $SOAP->DoRemoteFunction($Data); // Send the request.

On the last line, PHP takes the arguments from the array you specified, and, using the WSDL, builds the XML request to send, then sends it.

How can I get PHP to show me the actual XML it's built?

I'm troubleshooting an application and need to see the actual XML of the request.

Upvotes: 66

Views: 117335

Answers (7)

Shankky
Shankky

Reputation: 341

$SOAP = new SoapClient($WSDL, array('trace' => true));

$Response = $SOAP->DoRemoteFunction($Data);

echo "REQUEST:\n" . htmlentities($SOAP->__getLastRequest()) . "\n";

This will not only print the last request but also make the XML tags visible in the browser.

Upvotes: 24

Gino Pane
Gino Pane

Reputation: 5011

The problem with Quinn Comendant's answer, that $request from __doRequest() will then be processed by __call() and the user will see an array of parameters instead of real xml request. To prevent this, such workaround can be used:

class DummySoapClient extends SoapClient {
    function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
    }

    function __doRequest($request, $location, $action, $version, $one_way = 0) {
        throw new Exception($request);
    }

    function __call($function_name, $arguments)
    {
        try {
            parent::__call($function_name, $arguments);
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }
}

Option trace is not necessary here, because we do not call __getLastRequest() or other relevant functions.

Upvotes: 1

TorranceScott
TorranceScott

Reputation: 1527

Extending Quinn's answer, you can also just log the request before you perform the request.

class SoapClientDebug extends SoapClient
{

public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
    error_log("REQUEST:\n" .$request . "\n");
    error_log("LOCATION:\n" .$location . "\n");
    error_log("ACTION:\n" .$action . "\n");
    error_log("VERSION:\n" .$version . "\n");
    error_log("ONE WAY:\n" .$one_way . "\n");

    return parent::__doRequest($request, $location, $action, $version, $one_way);
}
}

Upvotes: 11

Quinn Comendant
Quinn Comendant

Reputation: 10576

If you'd like to view the request without actually making a connection, you can override SoapClient's __doRequest method to return the XML:

class DummySoapClient extends SoapClient {
    function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
    }
    function __doRequest($request, $location, $action, $version, $one_way = 0) {
        return $request;
    }
}
$SOAP = new DummySoapClient('http://example.com/?wsdl', array('trace' => true));
echo $SOAP->GetRequestDetail($params);

Upvotes: 20

Pratik Bhatt
Pratik Bhatt

Reputation: 687

if you are running the client locally, Fiddler is a great implementation agnostic way of looking at the messages on the wire.

If you are running it remotely then you could use something like Apache TCPMON Standalone or through eclipse*

*just linking to the first hit from Google

Upvotes: 3

Ezequiel Muns
Ezequiel Muns

Reputation: 7762

You need to enable tracing when you create your SoapClient. Like so:

$SOAP = new SoapClient($WSDL, array('trace' => true));

$Data = array('Something'=>'Some String','SomeNumber'=>22); 

Then call the __getLastRequest method after you've made a service call to see the XML.

$Response = $SOAP->DoRemoteFunction($Data);
echo $SOAP->__getLastRequest();

This will output the request XML.

More reading: http://www.php.net/manual/en/soapclient.getlastrequest.php

Upvotes: 7

shamittomar
shamittomar

Reputation: 46702

Use getLastRequest. It returns the XML sent in the last SOAP request.

echo "REQUEST:\n" . $SOAP->__getLastRequest() . "\n";

And remember, this method works only if the SoapClient object was created with the trace option set to TRUE. Therefore, when creating the object, use this code:

$SOAP = new SoapClient($WDSL, array('trace' => 1));

Upvotes: 150

Related Questions