[RESOLU] soap et les webservices

Mammouth du PHP | 737 Messages

14 nov. 2012, 15:09

BONJOUR sam,

Oui le bignou fonctionne maintenant.

Si tu veux de l'aide, il faut être plus précis et un minimum courtois.

Cdlt,

Mega
;)
Dyslexics are teople poo

MamboJambo
Invité n'ayant pas de compte PHPfrance

20 déc. 2012, 10:25

Bonjour Megadeth,

Pourrais-tu nous faire part de la façon dont tu as résolu le problème ?
Je suis dans un cas similaire. tout fonctionne nickel depuis un site web sur le réseau local mais dès que je veux attaquer le web-service depuis un site externe, j'obtiens un beau message d'erreur comme le tien :
Warning: SoapClient::SoapClient(http://xxx.xxx.xxx.xxx:4080/WSLEO_WEB/a ... .awws?wsdl) [function.SoapClient-SoapClient]: failed to open stream: Connection timed out in /htdocs/public/sitetest/test.php on line 14

Warning: SoapClient::SoapClient() [function.SoapClient-SoapClient]: I/O warning : failed to load external entity "http://xxx.xxx.xxx.xxx:4080/WSLEO_WEB/a ... .awws?wsdl" in /htdocs/public/sitetest/test.php on line 14

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://xxx.xxx.xxx.xxx:4080/WSLEO_WEB/a ... .awws?wsdl' in /htdocs/public/sitetest/test.php:14 Stack trace: #0 /htdocs/public/sitetest/test.php(14): SoapClient->SoapClient('http://xxx.xxx.xxx...', Array) #1 {main} thrown in /htdocs/public/sitetest/test.php on line 14
Et, comme toi, je m'arrache les cheveux à essayer de comprendre

Pourtant le code de la page de test est simplissime :
<?php
$wsleo = "";

echo '<a href="http://xxx.xxx.xxx.xxx:4080/WSLEO_WEB/awws/wsLEO.awws?wsdl">WSDL</a><br />';

// Connexion au webservice
$wsleo = new SoapClient("http://xxx.xxx.xxx.xxx:4080/WSLEO_WEB/awws/wsLEO.awws?wsdl",array('soap_version' => SOAP_1_2, 'login' => 'xxx', 'password' => 'xxx'));
// Connecter();
$Retour = $wsleo->AfficherChemins();
print_r($Retour);
?>
Pourtant, le lien direct vers le wsdl fonctionne bien

Merci

Mammouth du PHP | 737 Messages

20 déc. 2012, 10:46

Bonjour,

Je consultais ma messagerie à l'instant quand j'ai vu ton post ^^

Dans ton cas, j'ai pas l'impression qu'il s'agisse d'un problème de script puisque tu me dis qu'il fonctionne. A première vue, je dirai qu'il s'agit plutôt d'un problème de configuration ou d'environnement. Typiquement le "failed to open stream" renvoie à quelque chose d'inexistant ou sur lequel tu n'aurais pas les droits. Le serveur distant a l'autorisation d'interroger les webservices ? Tiens-nous au courant.

++

Mega
;)
Dyslexics are teople poo

MamboJambo
Invité n'ayant pas de compte PHPfrance

20 déc. 2012, 13:01

Bonjour,

J'ai trouvé !
En fait j'ai voulu en faire trop et ajouter de la sécurité, alors que ce n'est pas du tout mon domaine, en utilisant un port 4080 (choisit au hasard - 4000 parce que les ports sont disponibles vers ce numéro et 80 pour rappeler le port HTTP).
J'avais, sur ma box, redirigé les trames TCP du port 4080 vers le port 80 du PC hébergeant le serveur web qui fait tourner le web-service.

Et c'est cet usage d'un port autre que 80 qui bloquait l'accès. Alors qu'en utilisant cette même translation de port pour attaquer le même site web en interne (URL = "http://MonAdresseIpPublique:4080/sitetest/test.php"), ça marchait nickel.

En me contentant de modifier ma règle de routage pour rediriger le port 80 vers le port 80 du PC local, ça marche. Je suppose que certaines trames passent forcément par le port 80 et qu'elles étaient alors bloquées par la box.

Ça m'embête un peu car j'ai l'impression qu'en terme de sécurité, c'est pas top de rediriger tout le trafic HTTP vers un PC sur le réseau local mais j'essaierai de trouver un pro en sécurité web pour finaliser le projet.

Par contre, pour en revenir à la façon dont tu as résolu ton problème, ce serait quand même intéressant si tu pouvais décrire ta solution parce que, je cherchais depuis plusieurs jours à résoudre mon problème et j'ai vu des dizaines de sujet à propos de ce
SoapClient: failed to open stream
mais jamais de réponse.

Avec la mienne, cela en ferait déjà 2 ;-)

Cordialement

MamboJambo
Invité n'ayant pas de compte PHPfrance

20 déc. 2012, 13:11

Ah, et j'ai aussi dû modifier le fichier Wsdl.

Dans mon cas, ce fichier est automatiquement créé à l'installation (ou la mise à jour) du web-service car je le développe sous Windev.
Or, une des dernières ligne du fichier pointait vers un nom de machine du réseau local (celle où il est installé) :

Code : Tout sélectionner

<soap:address location="http://PC-Eric/WSLEO_WEB/awws/wsLEO.awws"/>
A priori, en attaquant le web-service depuis l'extérieur, cette adresse doit certainement être utilisée telle quel. Et, c'est sûr que d'essayer de se connecter à "http://PC-Eric..." depuis internet ne doit pas être super efficace.

J'ai donc du le modifier pour y mettre l'adresse publique de la box :

Code : Tout sélectionner

<soap:address location="http://xxx.xxx.xxx.xxx/WSLEO_WEB/awws/wsLEO.awws"/>
Voilà