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 16/06/2007, 11h20   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Par défaut [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 :
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
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2007, 15h20   #2
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
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 :
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 :
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 :
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 :
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:
Citation:
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:
Citation:
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.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 11h26   #3
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
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 :
1
2
 
$client->__soapCall('reqFunc', array());
Il suffit simplement de le récupérer dans... un autre tableau
Ce qui donne:
Code :
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.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 11h29   #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 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.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 11h31   #5
Membre éclairé
 
Avatar de Asmodean
 
Inscription : février 2006
Messages : 311
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : février 2006
Messages : 311
Points : 346
Points : 346
Envoyer un message via MSN à Asmodean
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
Asmodean 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 20h39.


 
 
 
 
Partenaires

Hébergement Web