2010-01-05 3 views
2

J'essaie d'utiliser une fonction de SOAP, qui va chercher des détails sur un élément de nouvelles spécifique. Le problème est que je n'obtiens pas les résultats attendus, juste une erreur étrange. J'utilise le client SOAP intégré en PHP5.Erreur SOAP codage de la référence externe dans PHP

Mon erreur est:

Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: External reference ' https://newsclient.omxgroup.com/cdsPublic/viewDisclosure.action?disclosureId=379485&messageId=454590 ' in /home/********/public_html/********/updatenews3.php:15

Mon code est:

<?php 
    $login = '***'; 
    $password = '***'; 
    $client = new SoapClient(
    'https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl', 
    array(
     'login' => $login, 
     'password' => $password 
    )); 
    $param = array('lastPublicationId' => 361825); 
    $result = $client->fetchNews($param); 
?> 

L'erreur est la même pour tous lastPublicationId, où un résultat se trouve. Il semble que PHP essaie de charger un lien, qui se trouve quelque part dans la réponse XML (l'URL, qui est dans le message d'erreur), et ne peut pas y accéder. Même si j'ai beaucoup googlé cela, je ne trouve aucune solution. La seule chose que je peux trouver est que cela semble avoir été signalé comme un bug dans une version précédente de PHP, mais l'erreur fait référence à PHP 5.2.2. Comme j'utilise PHP 5.2.9, je pense que ça peut l'être. t être ça. Je me doute que le caractère & soit la cause de cette erreur?

Le fichier WSDL peut être trouvé ici: https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl

Quelqu'un sait cette erreur, et savoir de toute solution?

Répondre

2

Il est possible que le code XML renvoyé par $client->fetchNews($param); ne soit pas correctement échappé - il semble y avoir un & non échappé dans l'URL indiquée dans le message d'erreur.

La meilleure chose est sans doute de vérifier exactement ce que XML est retourné, en tournant sur le traçage et l'impression de la dernière réponse:

$client = new SoapClient(
'https://newsclient.omxgroup.com/wsdl/DisclosureNewsService.wsdl', 
array(
    'login' => $login, 
    'password' => $password, 
    'trace' => 1 
)); 
$param = array('lastPublicationId' => 361825); 

try { 
    $result = $client->fetchNews($param); 
} 
catch (SoapFault $sf) { 
    print '<pre>'; 
    // print the exception 
    print_r($sf); 

    // print the XML response 
    print $client->__getLastResponse(); 
} 

Une solution de contournement (si le serveur est de retour XML non valide) est d'utiliser un code similaire à ce qui précède pour attraper l'exception. Vous pouvez ensuite obtenir manuellement le code XML renvoyé (en utilisant __getLastResponse()) et le nettoyer vous-même (par exemple en utilisant htmlenties ou une expression rationnelle), avant de le renvoyer et de l'utiliser dans le reste de votre application.