IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Web Service][SOAP] client php et web service windev


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 79
    Points
    79
    Par défaut [Web Service][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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:

    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.

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 79
    Points
    79
    Par défaut
    Aprés correction du code, j'ai le message suivant:

    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?

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 79
    Points
    79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 79
    Points
    79
    Par défaut
    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?

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    716
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 716
    Points : 112
    Points
    112
    Par défaut
    Merci tu m'as bien aidé^^

Discussions similaires

  1. [SOAP] client PHP- Serveur Perl
    Par anek971 dans le forum Web
    Réponses: 2
    Dernier message: 20/10/2011, 14h39
  2. [Web Service][SOAP] Client de Web Service en PHP
    Par Senki dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 18/04/2011, 11h23
  3. [Web Service][SOAP] Client PHP et Serveur JAVA
    Par Asfaloth dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/05/2010, 11h19
  4. [Web Service] SOAP Client PhP avec services J2EE - Passage de tableau
    Par wheelshot dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 03/04/2009, 14h00
  5. [Web Service][SOAP] Client soap PHP et C#
    Par zulot dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/04/2007, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo