Bonjour,
Dans le cadre d’un projet, je dois créer un webservice qui prend en argument un identifiant et me retourne l’utilisateur correspondant dans un fichier CSV ou la liste de tous les utilisateurs si aucun identifiant est passé. Ma fonction retourne un ArrayObject d’objet de type User. Je parcours ensuite le retour via un iterator sur mon ArrayObject.
J’ai réussi à développer la fonctionnalité et je tente de la passer en webservice via SOAP. En appelant la fonction directement, aucun problème cela fonctionne comme voulu. En appellant la fonction via un webservice SOAP, j’ai un soucis de conversion de type, tous mes retours sont convertis en StdClass.
Je pourrais bien entendu réaliser la conversion du StdClass vers mes propres objets mais je trouve la solution sale et réaliser la transformation User ->StdClass -> User est dommage.
Voici un exemple de type de retour suite à l’appel SOAP :
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 | object(stdClass)[4] public 'BOGUS' => array (size=5) 0 => object(stdClass)[5] public '_id' => string '1' (length=1) public '_name' => string 'Bland' (length=5) public '_surname' => string ' Angie' (length=6) public '_phone' => string '0611111111' (length=10) 1 => object(stdClass)[6] public '_id' => string '2' (length=1) public '_name' => string 'Dole�alov� ' (length=11) public '_surname' => string ' Michaela' (length=9) public '_phone' => string '0622222222' (length=10) 2 => object(stdClass)[7] public '_id' => string '3' (length=1) public '_name' => string 'Williams ' (length=10) public '_surname' => string ' Sherri ' (length=8) public '_phone' => string '0633333333' (length=10) 3 => object(stdClass)[8] public '_id' => string '4' (length=1) public '_name' => string 'Koutoux�dou' (length=11) public '_surname' => string ' Nikol�tta ' (length=11) public '_phone' => string '0644444444' (length=10) 4 => object(stdClass)[9] public '_id' => string '6' (length=1) public '_name' => string 'Vandesteene ' (length=12) public '_surname' => string ' Els' (length=4) public '_phone' => string '0655555555' (length=10) |
Je joins également le code du webservice :
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 50 51 52 53 54 | <?php class Server { protected $_path; //TODO : à modifier pour faire appel à un service de gestion de paramétrage public function __construct() { $this->_path = 'usersList.csv'; } public function extractUser($id = 0) { $user = null; $usersList = new ArrayObject(); //erreur 404 à déclencher try { $csv = new SplFileObject($this->_path); } catch(RuntimeException $e) { throw new SoapFault('fileNotFound', 'Le fichier d\'entrée est introuvable'); } $csv->setFlags(SplFileObject::READ_CSV); $csv->setCsvControl(';', '"', '"'); if($id > 0) { foreach($csv as $line) { if($line[0] == $id) { $user = new User($line[0], $line[1], $line[2], $line[3]); $usersList->append($user); return $usersList; } } throw new SoapFault('userNotFound', 'Aucun adhérent ne correspond à votre demande'); } else { foreach($csv as $line) { $user = new User($line[0], $line[1], $line[2], $line[3]); $usersList->append($user); } if($usersList->count() > 0) return $usersList; else throw new SoapFault('emptyFile', 'Aucun adhérent n\'est présent'); } } } ` |
En l’appelant de cette manière cela fonctionne parfaitement :
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 | <?php //TODO : à sécuriser if(isset($_GET['id'])) { $id = intval($_GET['id']); try { $usersList = $soapServer->extractUser($id); } catch(SoapFault $e) { echo $e->getMessage(); exit(); } $usersList->offsetGet(0)->printer(); } else { try { $usersList = $soapServer->extractUser(); } catch(SoapFault $e) { echo $e->getMessage(); exit(); } //parcourir usersList $iterator = $usersList->getIterator(); // Simple while loop echo 'Nombre d\'utilisateurs : ' . $usersList->count() . '<br />'; while ($iterator->valid()) { echo $iterator->current()->printer() . "<br />"; $iterator->next(); } } |
En l’appelant via un webservice SOAP (pas déclaré de WSDL pour le moment par soucis de rapidité et de simplicité de développement), cela réalise la conversion de tous mes objet en StdClass :
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 | <?php $options = array('location' => 'http://localhost/test/server.php', 'uri' => 'http://localhost/test/', 'encoding'=>'ISO-8859-1'); //create an instante of the SOAPClient (the API will be available) $api = new SoapClient(NULL, $options); //TODO : à sécuriser if(isset($_GET['id'])) { $id = intval($_GET['id']); try { //$usersList = $soapServer->extractUser($id); $usersList = $api->extractUser($id); } catch(SoapFault $e) { echo $e->getMessage(); exit(); } $usersList->offsetGet(0)->printer(); } else { try { //$usersList = $soapServer->extractUser(); $usersList = $api->extractUser(); } catch(SoapFault $e) { echo $e->getMessage(); exit(); } var_dump($usersList); |
Si quelqu’un a une idée pour conserver le type de retour en sortie d’un webservice, je suis preneur.
Merci d’avance de votre aide,