wake-up-neo.com

Wie sehe ich das eigentliche XML von PHP SOAP Kundenklasse?

Betrachten Sie dieses Beispielskript SOAP:

$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.

In der letzten Zeile entnimmt PHP die Argumente aus dem von Ihnen angegebenen Array, erstellt mithilfe der WSDL die zu sendende XML-Anforderung und sendet sie dann.

Wie kann ich PHP dazu bringen, mir das tatsächlich erstellte XML anzuzeigen?

Ich behebe eine Anwendung zur Fehlerbehebung und muss die tatsächliche XML der Anforderung sehen.

48
Nick

Verwenden Sie getLastRequest . Es gibt das XML zurück, das in der letzten SOAP -Anforderung gesendet wurde.

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

Denken Sie daran, dass diese Methode nur funktioniert, wenn das SoapClient-Objekt mit der Option trace erstellt wurde, die auf TRUE gesetzt ist. Verwenden Sie daher beim Erstellen des Objekts den folgenden Code:

$SOAP = new SoapClient($WDSL, array('trace' => 1));
96
shamittomar
$SOAP = new SoapClient($WSDL, array('trace' => true));

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

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

dadurch wird nicht die letzte Anforderung gedruckt, sondern auch die XML-Tags im Browser sichtbar

16
Shankky

Wenn Sie die Anfrage anzeigen möchten, ohne tatsächlich eine Verbindung herzustellen, können Sie die __doRequest-Methode von SoapClient überschreiben, um die XML-Datei zurückzugeben:

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);
14
Quinn Comendant

Wenn Sie die Antwort von Quinn erweitern, können Sie die Anfrage auch einfach protokollieren, bevor Sie die Anfrage ausführen.

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

Sie müssen die Ablaufverfolgung aktivieren, wenn Sie Ihren SoapClient erstellen. So wie:

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

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

Rufen Sie anschließend die __getLastRequest-Methode auf, nachdem Sie einen Serviceaufruf ausgeführt haben, um die XML anzuzeigen.

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

Dadurch wird die Anforderungs-XML ausgegeben.

Mehr lesen: http://www.php.net/manual/de/soapclient.getlastrequest.php

6
Ezequiel Muns

wenn Sie den Client lokal ausführen, ist Fiddler eine großartige implementierungsunabhängige Möglichkeit, die Nachrichten auf dem Draht zu betrachten.

Wenn Sie es remote ausführen, können Sie etwas wie Apache TCPMONStandalone oder durch Eclipse * verwenden. 

* Verlinkung auf den ersten Treffer von Google

3
Pratik Bhatt

Das Problem mit der Antwort von Quinn Comendant , dass $request von __doRequest() dann von __call() verarbeitet wird und der Benutzer ein Array von Parametern anstelle einer echten XML-Anforderung sieht. Um dies zu verhindern, kann eine solche Problemumgehung verwendet werden:

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

Die Option trace ist hier nicht erforderlich, da wir __getLastRequest() oder andere relevante Funktionen nicht aufrufen.

0
Gino Pane