Question

J'écris une application Web qui permettra à l'utilisateur de spécifier une URL pour un SoapClient. Je voulais valider que php puisse se connecter au client lorsque l'utilisateur soumet un formulaire. Je pense que je pourrais le faire via try catch ou set_error_handler (ou une combinaison des deux). Cependant, il semble que cela ne soit pas possible pour les erreurs fatales. Existe-t-il un moyen de faire en sorte que SoapClent teste une URL qui ne génère pas une erreur irrémédiable?

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'

Je souhaite qu’il signale une erreur, car l’URL n’existe pas, mais j’aimerais pouvoir l’attraper.

Sinon, je suppose que je pourrais essayer de télécharger et de valider l'URL moi-même, mais j'aurais pensé qu'il serait possible de le faire à partir de SoapClient.

Cela devrait-il être une erreur fatale?

Modifier

Après avoir lu la réponse de rogeriopvl, j’ai déclaré que j’aurais dû dire que j’avais essayé l’option 'exceptions' du constructeur soapclient et (en désespoir de cause) la fonction use-soap-error-handler.

Était-ce utile?

La solution

Utilisez-vous xdebug? Selon ce rapport de bogue PHP et cette discussion , le problème a été corrigé au moins depuis. PHP 5.1, mais le ce bogue de xdebug a une erreur "Erreur fatale lors de conversions par exception" dans une manière que l’exception ne soit pas générée et que l’erreur fatale "traverse".

Je peux reproduire cela localement, avec xdebug activé:

try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Cela me donne l'erreur fatale que vous avez décrite, sans même entrer dans la clause catch:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Cela fonctionne si je désactive xdebug juste avant l'appel:

xdebug_disable();
try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Ceci déclenche l'exception comme prévu, et j'obtiens un objet SoapFault approprié dans la clause catch avec le message suivant:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Donc, fondamentalement, les exceptions fonctionnent comme annoncé. S'ils ne fonctionnent pas dans votre cas, vous pouvez rencontrer le bogue xdebug, ou peut-être un problème similaire avec un autre composant tiers.

Autres conseils

Citant la documentation sur SoapClient :

  

L'option exceptions est une valeur booléenne définissant si les erreurs soap déclenchent des exceptions de type SoapFault.

Vous devriez donc essayer quelque chose comme:

$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));

De cette façon, les exceptions SoapFault vous permettant de les intercepter .

Voir: http://bugs.xdebug.org/view.php?id= 249

Solution possible:

Index: trunk/www/sites/all/libraries/classes/defaqtoSoapClient.class.php
===================================================================
--- classes/defaqtoSoapClient.class.php
+++ classes/defaqtoSoapClient.class.php
@@ -31,10 +31,23 @@

     try {
+        // xdebug and soap exception handling interfere with each other here 
+        // so disable xdebug if it is on - just for this call
+        if (function_exists('xdebug_disable')) {
+            xdebug_disable();
+        }
       //Create the SoapClient instance
       parent::__construct($wsdl, $options);
     }
     catch(Exception $parent_class_construct_exception) {
+        if (function_exists('xdebug_enable')) {
+            xdebug_enable();
+        }
       // Throw an exception an say that the SOAP client initialisation is failed
       throw $parent_class_construct_exception;
+    } 
+    if (function_exists('xdebug_enable')) {
+        xdebug_enable();
     }
   }

vous pouvez essayer de faire une requête curl ou fsockopen pour vérifier que l'URL est valide.

Pour votre information, j'utilise SoapClient avec PHPUnit pour tester les WebServices distants et j'ai le même problème!

  • lors de l'utilisation d'une ancienne version de PHPUnit (3.3.x) en tant que tierce partie, crash de phpunit
  • lors de l'utilisation de la version actuelle de PHPUnit (3.4.6) en tant que tierce partie, l'affichage de phpunit "quot RuntimeException".

Voici ma première méthode de test:

public function testUnavailableURL() {
    $client = new SoapClient("http://wrong.URI");
}

Voici le premier résultat de PHPUnit:

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

Voici ma deuxième méthode de test:

public function testUnavailableURL() {
        try {
          $client = @new SoapClient("http://wrong.URI");
        } catch (SoapFault $fault) {
          print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
        }
}

Voici le deuxième résultat du test PHPUnit:

PHPUnit 3.4.6 by Sebastian Bergmann.

.SOAP Fault: (faultcode: WSDL, faultstring: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wrong.URI' : failed to load external entity "http://wrong.URI"
)...

Time: 3 seconds, Memory: 4.25Mb

OK

NB: j'ai trouvé un ticket phpunit sur ce sujet: ticket 417

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top