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.
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));
$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
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);
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);
}
}
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
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
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.