web-dev-qa-db-fra.com

Comment vider la demande SoapClient pour le débogage?

J'ai besoin de déboguer un code qui utilise un client de savon. J'ai trouvé les méthodes getLast * dans php.net, mais lorsque j'essaie d'obtenir la dernière demande de débogage, cela retourne NULL

<?php

    $client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL");

    $response = $client->ChangePowerUnit(array(
        "PowerValue" => 100,
        "fromPowerUnit" => "horsepower",
        "toPowerUnit" => "megawatts"
    ));


    echo "====== REQUEST HEADERS =====" . PHP_EOL;
    var_dump($client->__getLastRequestHeaders());
    echo "========= REQUEST ==========" . PHP_EOL;
    var_dump($client->__getLastRequest());
    echo "========= RESPONSE =========" . PHP_EOL;
    var_dump($response);

?>

Le résultat de l'exécution du code:

$php soap_test.php 

====== REQUEST HEADERS =====
NULL
========= REQUEST ==========
NULL
========= RESPONSE =========
object(stdClass)#2 (1) {
  ["ChangePowerUnitResult"]=>
  float(0.0746)
}

Comment obtenir le contenu du corps et des en-têtes de la dernière requête SoapClient?

52
Denis Kreshikhin

Déboguer une demande SOAP

  1. Utilisation de l'extension SOAP extension

Le plus facile et le meilleur* moyen de déboguer une demande SOAP est en effet de créer un extension SOAP qui enregistre la demande brute SOAP et le traitement brut SOAP réponse du service Web ou du client de service Web utilisant les fonctions suivantes de la classe SoapClient :

Pour que cela fonctionne, vous devez créer votre objet SoapClient avec l'option de trace activée, comme indiqué par xdazz:

$client = new MySoapClient($wsdlUrl, array('trace' => 1));

puis exécutez vos appels SOAP) encapsulés dans un bloc try-catch:

try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup request failed! Response: ".$client->__getLastResponse());
}

Lors du développement de SOAP dans PHP, il est également judicieux de nettoyer le dossier PHP tmp lorsque vos contrats changent. (voir le chemin de votre dossier tmp dans phpinfo()) pour forcer le PHP SoapClient à télécharger à nouveau les fichiers WSDL et XSD au lieu de les utiliser expirer).

De plus, il est utile de définir des options telles que exceptions et cache_wsdl Et la version soap_version Lors du développement de:

$options = array( 
    'soap_version'=>SOAP_1_2, 
    'exceptions'=>false, 
    'trace'=>1, 
    'cache_wsdl'=>WSDL_CACHE_NONE 
);

*L’inconvénient du débogage à l’aide de l’extension SOAP est que les erreurs de certificat se produisent avant la demande réelle ou autre chose. Il est donc impossible d’utiliser getLastRequest () ou getLastResponse () en cas d’échec de la connexion une sorte.

  1. Utilisation de Xdebug

Une autre option intéressante pour déboguer un SoapClient est de définir un cookie de session de débogage pour Xdebug et votre IDE préféré.

$client = new SoapClient(
    'http://example.loc/index.php/api/v2_soap/?wsdl'
);
$client->__setCookie('XDEBUG_SESSION', 'NETBEANS');
  1. Utilisation spécialisée SOAP Tracer & Debugger

Les applications spécialisées SOAP Trace & Debug sont également très utiles: en plus des suspects habituels tels que SoapUI , il existe également des mandataires de traçage intermédiaires comme Charles, comme décrit ici . L’inconvénient de cette méthode est que plus de couches sont ajoutées et sont donc susceptibles d’introduire de nouveaux problèmes, par exemple des problèmes de poignée de main.

Il existe également des débogueurs commerciaux SOAP) qui en valent la peine, comme le XML Spy SOAP Debugger ou SOAPSonar qui font la validation et l’invocation. En tout état de cause, SoapUI est toujours un bon compagnon.

Si vous pensez qu'il existe un problème au niveau du protocole réseau, essayez Wireshark , un analyseur de protocole réseau pour Unix et Windows.

Journaux, journaux, journaux

Des informations d'erreur de base peuvent également être trouvées dans le journal PHP et dans le journal du serveur Web. Assurez-vous d'avoir activé la journalisation complète des erreurs.

22
wp78de

Ces fonctions ne fonctionne que si l'objet SoapClient a été créé avec l'option de trace définie sur VRAI .

Essayer:

$client = new SoapClient("http://www.webservicex.net/ConverPower.asmx?WSDL", array('trace' => 1));
55
xdazz

Je viens de conclure pour l'action:

$client = new \SoapClient("http://127.0.0.1/services/wsdl2",array('trace' => 1,));
try{
   $result = $client->__SoapCall('routeCase', $params);
}catch (\Exception $e){
   throw new \Exception("Soup Request Failed! Response:\n".$client->__getLastResponse());
}
1
MSS