Récupérer un array via un webservice ?

Eléphanteau du PHP | 19 Messages

18 juin 2007, 09:07

Bonjour,

Je galère depuis plusieurs jours en essayant de mettre sur pied un webservice en php
dont la fonction retourne un array.
Voici le code:

request_service.php

Code : Tout sélectionner

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 : Tout sélectionner

<?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 : Tout sélectionner

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; }
lorsque je charge la page request_client, 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.

Merci d'avance

Invité
Invité n'ayant pas de compte PHPfrance

18 juin 2007, 11:22

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 :wink:

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 : Tout sélectionner

$client->__soapCall('reqFunc', array());
Il suffit simplement de le récupérer dans... un autre tableau
Ce qui donne:

Code : Tout sélectionner

$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. :wink: