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 :

Créer (create) POST /product
Afficher (read) GET /product
Mettre à jour (update) PUT /product/{id}
Supprimer (delete) DELETE /product/{id}
rest, json, andoid, java, jwt

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.

rest, json, andoid, java, jwt

  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/