web-dev-qa-db-fra.com

Comment puis-je voir le code XML généré par PHP SOAP Classe client?

Considérez cet exemple de script client 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.

Sur la dernière ligne, PHP prend les arguments du tableau que vous avez spécifié et, à l'aide du WSDL, crée la requête XML à envoyer, puis l'envoie.

Comment puis-je obtenir que PHP me montre le code XML qu'il a réellement construit?

Je dépanne une application et j'ai besoin de voir le code XML de la demande.

48
Nick

Utilisez getLastRequest . Il renvoie le XML envoyé dans la dernière demande SOAP.

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

Et rappelez-vous, cette méthode ne fonctionne que si l'objet SoapClient a été créé avec l'option trace définie sur TRUE. Par conséquent, lors de la création de l'objet, utilisez ce 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";

cela n'imprimera pas la dernière requête mais rendra les balises XML visibles dans le navigateur

16
Shankky

Si vous souhaitez afficher la demande sans établir de connexion, vous pouvez remplacer la méthode __doRequest de SoapClient pour renvoyer le code 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);
14
Quinn Comendant

En étendant la réponse de Quinn, vous pouvez également simplement enregistrer la demande avant de l'exécuter.

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

Vous devez activer le traçage lorsque vous créez votre SoapClient. Ainsi:

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

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

Appelez ensuite la méthode __getLastRequest après avoir effectué un appel de service pour afficher le code XML.

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

Cela générera la requête XML.

Plus de lecture: http://www.php.net/manual/en/soapclient.getlastrequest.php

6
Ezequiel Muns

si vous exécutez le client localement, Fiddler est une excellente méthode de mise en œuvre agnostique pour consulter les messages sur le réseau.

Si vous l'exécutez à distance, vous pouvez utiliser quelque chose comme Apache TCPMONAutonome ou via Eclipse

* juste un lien vers le premier hit de Google

3
Pratik Bhatt

Le problème avec de Quinn Comendant answer, ce $request de __doRequest() sera alors traité par __call() et l'utilisateur verra un tableau de paramètres au lieu d'une vraie requête XML. Pour éviter cela, une telle solution de contournement peut être utilisée:

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

L'option trace n'est pas nécessaire ici, car nous n'appelons pas __getLastRequest() ni d'autres fonctions pertinentes.

0
Gino Pane