HTML5 / CSS 2.x/3 / PHP / MySQL ...

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

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...

Tous les articles sur ce thème