L’architecture REST
1. Introduction
REST (Representational State Transfer) est un style d’architecture permettant de construire des applications (Web, Intranet, Web Service etc..).
Il s’agit d’un ensemble de conventions et de bonnes pratiques à respecter et non d’une technologie à part entière. L’architecture REST utilise les spécifications originelles du protocole HTTP, plutôt que de réinventer une surcouche (comme le font SOAP ou XML-RPC par exemple).
2. Les verbes HTTP
HTTP propose les verbes correspondant :
| ![]() |
|||||||||||||||
Attention : Par défaut seul GET et POST peuvent envoyer des paramètres, la norme RESTful spécifie la bonne implémentation pour que PUT et DELETE transmetent des messages (cf: notre exemple).
3. Les réponses HTTP
Cette architecture permet un nombre important de format de réponses comme le HTML, le XML, le CSV, le JSON et bien d’autres formats.
Pour notre exemple nous allons utiliser le format JSON (Javascript).
4. Exemple d’implémentation
Pour notre exemple nous allons utiliser un serveur de base de donnée MySQL avec php coté serveur et coté client nous utiliserons Java ou Androïd.
Pour envoyer vos fichiers et créer le répertoire product sur votre serveur vous pouvez utiliser le client FTP FilleZilla.

a. La base de données MySQL
Pour créer notre base de données nous allons utiliser un accès à phpmyadmin et créer une table produit avec le code suivant :
CREATE TABLE IF NOT EXISTS `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `type` varchar(50) NOT NULL, `price` double NOT NULL, PRIMARY KEY (`id`)) ENGINE = MYISAM; INSERT INTO `product` (`id`, `name`, `type`, `price`) VALUES (1, 'Apple', 'Fruit', 1.2), (2, 'Pear', 'Fruit', 1.3), (3, 'Banana', 'Fruit', 1.1), (4, 'Mushroom', 'Vegetable', 2.7), (5, 'Pepper', 'Vegetable', 3.6);
b. Le script php
Concernant l’interface à notre base de données myql nous utiliserons un script php (index.php) implémentant l’architecture REST. Ce dernier sera placer dans le répertoire product et nous retournera les résultats au format JSON.
<?php
try {
//connection a la base de donnees
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=<BASE DE DONNEES>', '<UTILISATEUR>', '<MOT DE PASSE>', $pdo_options);
$id = (!empty($_GET['id']))?$_GET['id']:null;
//Gestion des actions en fonction du verbe HTTP
switch($_SERVER['REQUEST_METHOD']){
case "POST": //Création
$data = (!empty($_POST['data']))?$_POST['data']:null;
$data = urldecode($data);
$produit = json_decode($data, true);
$name = $produit['name'];
$type = $produit['type'];
$price = $produit['price'];
$sql = 'INSERT INTO product (name, type, price) VALUES ("'.$name.'", "'.$type.'",'.$price.');';
$bdd->query($sql);
// Affiche l'id du produit créé
echo $bdd->lastInsertId();
break;
case "GET": // Recupere les donnees
$sql = 'SELECT id, name, type, price FROM product';
if($id!=null){
$sql .= ' WHERE id='.$id.';';
}
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO::FETCH_ASSOC);
//Affiche le resultat au format JSON
echo json_encode($output);
break;
case "DELETE": //Supprime
$sql = 'DELETE FROM product WHERE id = '.$id.';';
$bdd->query($sql);
break;
case "PUT": //Met à jour
//On redirige le fichier dans un tableau
$_SERVER['REQUEST_METHOD']==="PUT" ? parse_str(file_get_contents('php://input', false , null, 0 , $_SERVER['CONTENT_LENGTH'] ), $_PUT): $_PUT=array();
$data = (!empty($_PUT['data']))?$_PUT['data']:null;
$data = urldecode($data);
$produit = json_decode($data, true);
$name = $produit['name'];
$type = $produit['type'];
$price = $produit['price'];
$sql = 'UPDATE product SET name = "'.$name.'", type="'.$type.'", price='.$price.' WHERE id = '.$id.';';
$bdd->query($sql);
break;
default:
echo '{"message": "ERROR"}';
break;
}
//Gestion des erreurs
} catch (Exception $e) {
die('Erreur :'.$e->getMessage());
}
?>
c. Le fichier .htaccess
Afin de respecter les recommandation de la norme REST nous avons besoin de récupéré les url pour les verbes GET, PUT et DELETE. Pour cela nous aurons besoin d’un fichier .htaccess à mettre avec le fichier index.php dans le répertoire product.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^((?s).*)$ index.php?id=$1 [QSA,L]
</IfModule>
La suite : Client Java REST ou Client Android REST
Sources :
https://blog.nicolashachet.com/niveaux/confirme/larchitecture-rest-expliquee-en-5-regles/
https://larlet.fr/david/biologeek/archives/20070413-pour-ne-plus-etre-en-rest-comprendre-cette-architecture/
https://restfulapi.net/http-methods/
https://github.com/mevdschee/php-crud-api
https://www.leaseweb.com/labs/2015/10/creating-a-simple-rest-api-in-php/

