Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Services Web
Services Web Forum d'entraide pour les services Web en PHP, qui permettent de créer et de consommer facilement des webservices (génération de WSDL etc.). Exemples : SOAP, NuSOAP, REST, SCA-SDO... Avant de poster -> Cours webservices
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2007, 12h07   #1
Membre du Club
 
Inscription : août 2007
Messages : 94
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 94
Points : 60
Points : 60
Par défaut [SOAP] client php et web service windev

Dans le cadre d'un projet de stage, j'ai mis en place un service web avec windev. La génération du service a bien crée une description WSDL du service et l'installation est effectuée sur un serveur soap. Le serveur a pu etre testé avec une appilcation cliente windev. Mon service web est donc bien fonctionnel selon moi.

Cependant, j'aimerais écrire un client en PHP 5 avec l'extension soap qui puisse appeler les fonctions de mon service web. J'utilise pour cela le serveur wamp afin d'avoir la version de php5 et toutes les librairies et extensions correspondante à la classe Soap.

Voici la description wsdl de mon service:

Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="iso-8859-1" ?> 
- <definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:s0="TestPE" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="TestPE">
- <types>
  <xsd:schema elementFormDefault="qualified" targetNamespace="TestPE" /> 
  </types>
  <message name="TestPE_babar_MessageIn" /> 
- <message name="TestPE_babar_MessageOut">
  <part name="parameters" type="xsd:string" /> 
  </message>
- <portType name="TestPESOAPPortType">
- <operation name="babar">
  <input message="s0:TestPE_babar_MessageIn" /> 
  <output message="s0:TestPE_babar_MessageOut" /> 
  </operation>
  </portType>
- <binding name="TestPESOAPBinding" type="s0:TestPESOAPPortType">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> 
- <operation name="babar">
  <soap:operation soapAction="TestPE/babar" style="document" /> 
- <input>
  <soap:body use="literal" /> 
  </input>
- <output>
  <soap:body use="literal" /> 
  </output>
  </operation>
  </binding>
- <service name="TestPE">
- <port name="TestPESOAPPort" binding="s0:TestPESOAPBinding">
  <soap:address location="http://formation4/TestPE/TestPE.soap" /> 
  </port>
  </service>
  </definitions>
Dans mon code client, je veux appeler une bete fonction "babar" qui ne prend aucun paramétres et qui renvoie juste une chaine de caractére. Voici mon code:

Code :
1
2
3
4
5
6
7
8
9
<?php
 
$client = new SoapClient("http://formation4/TestPE/TestPE.xml");
var_dump($client->__getFunctions());
 
$result = $client->babar();
echo $result;
 
?>
J'ai appeler avant la méthode getfunction pour vérifier si le client était bien instancié, et sa fonctionne. La ou sa coince c'est au nivo de l'appel de la fonction. meme avec la méthode soapCall j'ai la meme erreur:

Citation:
Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:\wamp\www\test3.php:8 Stack trace: #0 [internal function]: SoapClient->__call('babar', Array) #1 C:\wamp\www\test3.php(8): SoapClient->babar() #2 {main} thrown in C:\wamp\www\test3.php on line 8
Je ne comprend vraiment pas d'ou vient le probléme.

Auriez vous des suggestion pour me débloquer?

trés cordialement.
pev15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 12h18   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Ce genre d'erreur indique souvent que c'est la fonction coté serveur qui a planté, du coup elle ne renvoie pas de réponse SOAP (d'ou le "on n'a pas de XML dans la réponse")

Un bon moyen de comprendre ce qui se passe est d'utiliser le mode trace:
Code :
1
2
3
4
5
6
7
8
9
// Link the SoapClient with our WSDL and our classmap
$client = new SoapClient("http://formation4/TestPE/TestPE.xml",
	array
	(
	"trace"      => 1,
	"exceptions" => 0,
	'classmap' => $classmap
	)
);
Ensuite tu peux faire ca apres l'appel à la fonction :
Code :
1
2
3
4
5
print "<pre>\n";
print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>"; 
var_dump($result);
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 12h54   #3
Membre du Club
 
Inscription : août 2007
Messages : 94
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 94
Points : 60
Points : 60
Aprés correction du code, j'ai le message suivant:

Citation:
Request :
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body/></SOAP-ENV:Envelope>

Response:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Le nom de la WDL contenant le service doit être précisé dans l'espace de nommage.

NameSpace must contain the WDL name</faultstring> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

object(SoapFault)#2 (9) { ["message:protected"]=> string(33) "looks like we got no XML document" ["string:private"]=> string(0) "" ["code:protected"]=> int(0) ["file:protected"]=> string(21) "C:\wamp\www\test3.php" ["line:protected"]=> int(13) ["trace:private"]=> array(2) { [0]=> array(4) { ["function"]=> string(6) "__call" ["class"]=> string(10) "SoapClient" ["type"]=> string(2) "->" ["args"]=> array(2) { [0]=> string(5) "babar" [1]=> array(0) { } } } [1]=> array(6) { ["file"]=> string(21) "C:\wamp\www\test3.php" ["line"]=> int(13) ["function"]=> string(5) "babar" ["class"]=> string(10) "SoapClient" ["type"]=> string(2) "->" ["args"]=> array(0) { } } } ["faultstring"]=> string(33) "looks like we got no XML document" ["faultcode"]=> string(6) "Client" ["faultcodens"]=> string(41) "http://schemas.xmlsoap.org/soap/envelope/" }
Je ne vois pas du tout comment je peux corriger cette erreur, que dois je faire?
pev15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 13h17   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Je pense que tu as un problème dans ton WSDL, il a l'air de dire qu'il y manque des infos mais je t'avoue ne pas pouvoir t'en dire plus que ça, je suis loin d'être un expert en webservice...

Mais je ne comprends pas pourquoi ta requete est quasiment vide, il n'y a rien dans le body de la requete SOAP c'est étrange. Peut-être peux-tu regarder de ce coté la?

Désolé de ne pouvoir t'en dire plus que ça.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 14h21   #5
Membre du Club
 
Inscription : août 2007
Messages : 94
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 94
Points : 60
Points : 60
Je pense que le WSDL et correcte, car si je fais le test disponible sur la page html de présentation du service ,j'obtient bien le message xml de ma fonction. Si j'ai bien compris l'interet du web service, c'est du générer le message XML en fonction des appels du client. Voici le message XML correspondant a l'appel de la fonction soap "babar":

Code :
1
2
3
4
5
6
7
8
 <?xml version="1.0" encoding="ISO-8859-1" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
- <SOAP-ENV:Body>
- <ns1:Response xmlns:ns1="urn:dummy" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <return xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:string">t'es trop fort PE</return> 
  </ns1:Response>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
il y a bien une chaine de caractére a retourner dans ce XML : "t'es trop fort PE" (PE c'est moi ).

Alors pourquoi l'appel de la fonction en php ne traite la fonction soap?
l'extension soap est elle fiable en php5?
pev15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2007, 15h48   #6
Membre du Club
 
Inscription : août 2007
Messages : 94
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 94
Points : 60
Points : 60
bah alors? personne n'a une idée de l'origine du probléme?
comment on peux régler le probléme: "Le nom de la WDL contenant le service doit être précisé dans l'espace de nommage."?
Serait il plus judicieux d'utiliser du JSP plutot que php pour les webservices?
pev15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2008, 11h58   #7
Invité de passage
 
Inscription : juin 2008
Messages : 1
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 1
Points : 1
Points : 1
Citation:
Envoyé par pev15 Voir le message
bah alors? personne n'a une idée de l'origine du probléme?
comment on peux régler le probléme: "Le nom de la WDL contenant le service doit être précisé dans l'espace de nommage."?
Serait il plus judicieux d'utiliser du JSP plutot que php pour les webservices?
Bonjour,

Je suis dans le même cas de figure que toi : WS Windev, client PHP.

Si j'ai bien compris la source du problème, c'est que l'extension SOAP de PHP te construit une requête SOAP non valide pour Windev.

Voici ma requête générée par SOAP :

Code :
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Wgescom_WebService">
<SOAP-ENV:Body>
<ns1:getTest/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Et l'erreur :

Code :
1
2
3
4
5
6
7
8
<SOAP-ENV:Envelope   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body> 
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Le nom de la WDL contenant le service doit être précisé dans l'espace de nommage. NameSpace must contain the WDL name</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Je ne comprenais pas trop d'où venait le problème, mais j'ai eu la bonne idée de regarder le code javascript que Windev utilise pour les tests.
Le verdict tombe : l'espace de nommage "NomDuFichierWDL" doit se trouver dans la balise du nom de la fonction appelée.

Code :
1
2
3
4
5
6
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<soap:body>
<getTest xmlns="Wgescom_WebService">
</getTest>
</soap:body>
<soap:Envelope>
J'ai donc tenté de simuler les requêtes SOAP avec l'extension curl, et de créer la requête comme le faisait très bien les fichiers demo.html de WinDev :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class MySOAP{
 
    public static function callFunction(){
 
        $data = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
                <soap:body>
                <getTest xmlns="Wgescom_WebService">
                </getTest>
                </soap:body>
                <soap:Envelope>';
 
        $ch = curl_init("http://10.93.4.36/WGESCOM/Wgescom_WebService.soap12");
        curl_setopt($ch, CURLOPT_POST, TRUE);    
        curl_setopt($ch, CURLOPT_POSTFIELDS, "xml=".$data);    
        curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8080");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        return curl_exec($ch);
    }
 
}
 
echo MySOAP::callFunction();
?>
Et le résultat est : un joli n'XML comme on le désirait à la base.

Moralité : en WS WinDev, autant créer ta propre classe de gestion d'appel de fonctions distantes.

Bon courage

edit : oops, j'avais pas vu le 2007 :s
AdvenCed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2010, 13h48   #8
Membre régulier
 
Inscription : janvier 2006
Messages : 675
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 675
Points : 74
Points : 74
Merci tu m'as bien aidé^^
franfr57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h33.


 
 
 
 
Partenaires

Hébergement Web