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] Tableau php et type complexe ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut [Web Service][SOAP] Tableau php et type complexe ?
    Bonjour,

    J'essais de mettre sur pied un service web dont la fonction PHP retourne
    un tableau.
    J'ai tout d'abord mis un type Array dans la section message de mon
    fichier wsdl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <part name="return" type="xsd:SOAP-ENC:Array"/>
    mais la fonction ne retourne aucun résultat.
    Sachant que chaque langage a sa façon bien précise de gérer les tableaux je
    suppose qu'il faut que je déclare mon tableau PHP en tant que type complexe
    dans la bannière <types> du fichier wsdl.
    Est ce que quelqu'un pourrait me dire qu'est ce que je doit mettre exactement dans <types> et qu'elle est la syntaxe ?

    Merci d'avance

  2. #2
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Pas de réponse ... bon !
    Aprés de nombreuses recherches infructueuses j'ai finalement fait générer le
    fichier wsdl par Zen Studio.
    Pour une fonction php qui retourne un array, Zend Studio ne définit même pas de balise <types> mais se contente simplement d'un anyType dans la balise part de la section message
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <part name="return" type="xsd:anyType"/>
    Ceci étant réglé (en espérant que la description dans le wsdl soit bonne) mon pb est que je n'arrive pas a récupérer les données retournées dans un array par la fonction du serveur.
    Voici mon code:

    request_service.php
    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
     
    class SendData
    {
        function reqFunc()
        {
          $arr = array(1=> "Coucou", 2=> "hello", 3=> 51);
          return $arr;
        }
    }
     
     
      $server = new SoapServer('http://localhost/service/request.wsdl', 
                                array('trace'=> 1,'soap_version'=> SOAP_1_1));
      $server->setClass('SendData');
      $server->handle();
    request.wsdl
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?xml version="1.0"?>
     
    <definitions name="RequestService"
        targetNamespace="http://localhost/service/request.wsdl"
        xmlns:tns="http://localhost/service/request.wsdl"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:typens="http://localhost/service/request.wsdl"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns="http://schemas.xmlsoap.org/wsdl/">
     
     
    <message name="reqFuncRequest"/>
    <message name="reqFuncResponse">
    	<part name="return" type="xsd:anyType"/>
    </message>
     
    <portType name="RequestServicePortType">
    	<operation name="reqFunc">
    		<input message="reqFuncRequest"/>
    		<output message="reqFuncResponse"/>
    	</operation>
    </portType>
     
    <binding name="RequestServiceBinding"  type="tns:RequestServicePortType">
    	<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    	<operation name="reqFunc">
    		<soap:operation soapAction="http://localhost/service/request.wsdl"/>
    		<input>
    			<soap:body use="encoded" namespace="urn:RequestService"
    			encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    		</input>
    		<output>
    			<soap:body use="encoded" namespace="urn:RequestService"
    			encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    		</output>
    	</operation>
    </binding>
     
    <service name="RequestService">
    	<documentation>Description du service web</documentation>
            <port name="RequestServicePort" binding="tns:RequestServiceBinding">
    	      <soap:address location="http://localhost/service/request_service.php"/>
          </port>
    </service>
     
    </definitions>
    request_client.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try{
      $client = new SoapClient('http://localhost/service/request.wsdl',  
                                array('trace'=> 1,'soap_version'=> SOAP_1_1));
       $client->__soapCall('reqFunc', array());
      echo $client>1;
      echo $client->2;
      echo $client->3;
    }
    catch(SoapFault $fault)
    {
    	echo $fault;
    }
    et là php m'affiche:
    syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$'
    je n'arrive pas à voir où est l'erreur de syntaxe.
    Pour contourner le pb j'ai remplacé les indexes 1,2,3 par a,b,c et là php m'affiche:
    1
    Je ne comprends pas
    l'erreur vient-elle de la façon de faire passer le array ou de la description de la fonction dans le fichier wsdl ou des deux ?????

    Si quelqu'un pouvait m'expliquer ça m'aiderait beaucoup.

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Bon, ça y est j'ai enfin trouvé la bonne syntaxe mais ça a pas été facile
    parce que niveau exemple c'est plutôt l'omerta

    C'est au niveau de la récupération du tableau
    dans le fichier request_client.php que se situe le pb.

    En fait le tableau est retourné suite à l'appel à la fonction reqFunc (via soapCall) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $client->__soapCall('reqFunc', array());
    Il suffit simplement de le récupérer dans... un autre tableau
    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $container = array();
    $container = $client->__soapCall('reqFunc', array()); 
    echo $container[1]."<BR>"; 
    echo $container[2]."<BR>";
    echo $container[3]."<BR>";
    et on obtient bien les résultats attendus
    Voilà, il existe peut être une solution plus directe (sans utiliser $container)
    mais je ne la connais pas, si quelqu'un sait comment faire qu'il n'hésite pas.

  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 ne comprends pas bien pourquoi tu espérais récupérer ton tableau dans l'instance de la classe SoapClient qui sert à communiquer avec ton serveur en webservice.
    Il n'y a aucune raison pour que ton tableau (array) s'insère automatiquement dans ta classe SoapClient qui n'a aucune connaissance de ce résultat.
    Il faut donc bien récupérer dans une variable ce que te retourne ton webservice.

  5. #5
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    Ca me parait logique.... Si une fonction renvoie quelque choses mais que tu n'affecte pas une variable par le retour de la fonction ca ne marche pas. Ca a toujours été le cas
    Such is the situation in our Fallen Galaxy

Discussions similaires

  1. [Web Service] paramétrer mon web service soap sous php
    Par yanis3021 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 05/11/2014, 16h01
  2. Unsupported Media Type - Web Service Soap
    Par zouberi dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 03/10/2011, 09h14
  3. Appeler un web service SOAP en php avec un client JavaScript
    Par lord.66 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/06/2009, 14h04
  4. Appeler un web service SOAP en php avec un client JavaScript
    Par lord.66 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 31/05/2009, 12h42
  5. retourner tableau de string avec web service SOAP
    Par xx_FiFty_xx dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/06/2008, 10h13

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