Service web REST-Full avec ZendFramework
Pourquoi le mode REST? C'est un mode simple à mettre en oeuvre.
L'appel aux données est possible avec quatre méthodes distinctes: GET POST PUT
et DELETE. La méthode la plus simple est GET et qui invoque l'appel
des données selon le schéma classique d'appel à un URL avec passage de paramètres dans l'URL:
http://www.monUrl.com/monSciptRest.php?method=maMethode&arg1=xxx&arg2=yyy
où l'on retrouve le nom de la fonction utilisée et les paramètres passés.
En retour, on récupère en général les données au format XML. Exemple:
http://www.monUrl.com/wsRest/wsRest.php?method=getMessages&numero=298805
et qui nous restitue ceci:
<restExchange generator="zend" version="1.0"> <getMessage> <numero>298805</numero> <msg_id>f0r24pak92il</msg_id> <msg_ip>90.53.89.197</msg_ip> <date_heure_msg>2009-03-20 12:03:36</date_heure_msg> <!-- … partie coupée... --> <status>success</status> </getMessage> </restExchange>
Commençons par écrire le code qui accède aux données:
/** * récupère les données d'un message * * @param int $numero * @return array */ function getMessage($numero) { $sql = "SELECT * FROM messages WHERE numero=".$numero; $resultat = $this->fetch($sql); $row = $resultat[0]; if (!empty($row)) { $outDatas = array(); foreach ($row AS $key => $val) { $outDatas[$key] = $this->toUtf8($val); } return $outDatas; } return array( 'status' => 'failed' ); }
Ce code est intégré à une classe applicative, restExchange par exemple.
Voici comment utiliser notre méthode au travers de cette classe et le ZendFramework qui va assembler notre serveur WS REST:
require_once 'inc/restExchange.class.php'; // notre classe applicative $restExchange = new restExchange(); require_once 'Zend/Rest/Server.php'; // chargement du module REST du ZF $server = new Zend_Rest_Server(); // instanciation du serveur REST $server->setClass('restExchange'); // on indique quelle est notre classe applicative $server->handle(); // on indique quelle fonction de notre classe applicative est exécutable au travers du WS REST $server->addFunction('getMessage');
Enfin, on va monter sur notre serveur client la partie de code qui va exploiter cet appel de données:
require_once 'Zend/Rest/Client.php'; $client = new Zend_Rest_Client('http://www.monUrl.com/wsRest/wsRest.php'); // URL de notre WS REST $xx = $client->getMessage()->numero('298807')->get(); // appel de la méthode avec passage paramètre echo "<b>:".$xx->numero().":</b>"; // test de récupération de la donnée numero
affiche 298805
Coté serveur, on a monté un WS REST en 5 lignes de code (hors code classe applicative), coté client, l'appel à ce WS REST est écrit en trois lignes de code (hors exploitation ultérieure des données récupérées).
On voit donc que l'échange de données au travers d'un WS REST est considérablement simplifié:
- pas de description WSDL,
- transaction simplifiée,
- mise au point aisée des fonctions coté serveur car possibilité d'appel en direct au travers d'un URL de test en méthode GET
La transaction peut être sécurisée en passant d'autres paramètres: password, ou appid,
et test sur la classe applicative de l'URL appelant...