Comment monter notre premier WS en tant que fournisseur
Zend Framework dispose d'outils prêts à l'emploi pour gérer les WS que ce soit en architecture REST ou SOAP. Pour la suite, nous allons privilégier l'architecture REST et le format de sortie XML.
SOAP ou REST, le débat
Beaucoup de WS sont utilisables selon l'architecture SOAP ou REST. Si professionnellement vous êtes contraint à une architecture spécifique, vous n'aurez guère de choix.
Si vous êtes seul décideur de l'architecture de votre WS coté serveur, privilégiez l'architecture REST qui est plus souple et moins verbeuse que l'architecture SOAP.
L'architecture SOAP nécessite de dévoiler le catalogue des méthodes au travers d'un document d'échange WDSL (Web Services Description Language), ce qui n'est pas forcément sécurisant. En SOAP, les échanges WSDL et flux XML trop fréquents alourdissent la charge du serveur.
L'autre argument en faveur de l'architecture REST est sa simplicité de mise en oeuvre, de tests simplifiés et à l'utilisation finale.
Pré requis pour notre serveur REST
Nous travaillons sur un serveur au modèle MVC contrôlé par Zend Framework.
Nous devons donc impérativement avoir ZF d'installé et opérationnel. Dans cet environnement, les URLs seront de cette forme:
http://www.mon-serveur.com/rest?method=getSite&id=3
Notre serveur fournisseur de WS est monté sur le même serveur que le serveur web classique. On ne change rien du tout au niveau du serveur web. Le WS sera simplement une extension du serveur web, sans intérêt pour l'utilisateur humain.
Explications sur l'URL d'appel du WS
Si on reprend l'URL donné en exemple:
http://www.mon-serveur.com/rest?method=getSite&id=3
nous retrouvons:
- l'URL racine du site web: http://www.mon-serveur.com/
- le controleur rest
- la méthode appelée: ?method=getSite
- le(s) paramètre(s): &id=3
Définition du contrôleur
Dans notre URL, nous avons appelé un contrôleur rest. Nous aurions pu l'appeler autrement. Va pour rest. On va créer dans le répertoire application/controllers le script RestController.php qui contient:
<?php class RestController extends Oft_Controller_Action { public function init() { $this->_helper->layout()->disableLayout(); } /** * Point d'entrée par défaut de l'application */ public function indexAction() { $server = new Zend_Rest_Server(); $server->setClass('My_Restserver'); $server->handle(); } }
Voilà!
C'est tout pour la partie serveur!
L'action index de notre contrôleur rest instancie un objet $server:
$server = new Zend_Rest_Server();
On rattache ensuite à cet objet la classe contenant les méthodes utilisables par notre serveur REST:
$server->setClass('My_Restserver');
et on passe la main au serveur REST:
$server->handle();
Définition des méthodes utilisées par le serveur
Comme nous l'avons vu, nous avons rattaché à l'objet $server une classe applicative My_Restserver:
$server->setClass('My_Restserver');
Cette classe va contenir les méthodes utilisables dans notre serveur REST. Pour créer cette classe, on va l'installer dans le répertoire library/My dans le fichier My_Restserver.php qui contient ceci:
<?php class My_Restserver { /** * Récupère la fiche d'un site * @param int $id id fiche site * @return array Données d'un site */ public function getSite($id) { // cherche fiche site par id $Site = new Application_Model_Sites(); $resultat = $Site->getFicheSiteParId($id); // on renvoie les données trouvées return $resultat; } }
Dans cet exemple, la méthode getSite recherche la fiche d'un site dans notre base de données au travers d'un modèle Sites dont nous ne détaillerons pas le fonctionnement.
Ici, nous n'avons défini qu'une méthode. Le paramètre $id est celui utilisé par la méthode getSite. Si nous avions défini:
public function getSite($numero) { // .... }
l'URL pour exploiter notre WS deviendrait:
http://www.mon-serveur.com/rest?method=getSite&numero=3
Rajout de méthode à notre WS
Pour rajouter une méthode au WS, il suffit de la définir dans notre fichier My_Restserver.php
// ...rajout d'une méthode dans My_Restserver.php
/**
* Récupère la liste des sites comemnçant par $debut
* @param string $debut debut nom du site site
* @return array liste de sites
*/
public function listeSiteS($debut) {
// cherche liste de sites commençant par $debut
$Site = new Application_Model_Sites();
$resultat = $Site->getListeSites($debut);
// on renvoie les données trouvées
return $resultat;
}
Et l'URL pour exploiter cette nouvelle méthode:
http://www.mon-serveur.com/rest?method=listeSites&debut=PAR
Renverra la liste des sites commençant par PAR.
Voyons maintenant comment sécuriser un peu notre WS