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

后端 未结 7 1617
醉酒成梦
醉酒成梦 2020-12-05 01:42

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 reques         


        
相关标签:
7条回答
  • 2020-12-05 02:03

    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);
    }
    }
    
    0 讨论(0)
  • 2020-12-05 02:06

    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

    0 讨论(0)
  • 2020-12-05 02:10

    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.

    0 讨论(0)
  • 2020-12-05 02:13

    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));
    
    0 讨论(0)
  • 2020-12-05 02:13

    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

    0 讨论(0)
  • 2020-12-05 02:20
    $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.

    0 讨论(0)
提交回复
热议问题