Chapitre 3 :
Microservices - Les APIs REST
REST
Définition :
❑ Acronyme de REpresentational State Transfert
❑ REST est un style d’architecture inspiré de l’architecture
du web fortement basé sur le protocole HTTP
❑ Basée sur les méthodes HTTP (GET, POST, PUT, DELETE)
❑ Orienté Ressources, identifiées par des URI(s)
REST Caractéristiques
› Les services REST sont sans états
– Chaque requête envoyée au serveur doit contenir toutes les
informations relatives à son état et est traitée indépendamment de
toutes autres requêtes.
-> Minimisation des ressources systèmes (pas de gestion de
session, ni d’état).
URI
› Unique Resource Identifier
› Identifie les ressources de manière unique sur le Web
› 4 parties
– Protocole (http, ftp, mail, …)
– Host (google.com)
– Port (8080, 80)
– Path (Chemin vers la ressource sur le serveur)
URI :
Protocole://Host:Port/Path
4
Invocation des APIs REST
5
REST et HTTP
› Une ressource est un objet identifiable dans un système
➔ Livre, Catégorie, Client, Prêt
› Les ressources sont identifiées par des URIs. Une URI identifie de
manière unique une ressource sur le système Clef primaire
de la ressource
(https://jsonplaceholder.typicode.com/users/2) dans la BD
› Les types de requêtes HTTP (GET, POST, PUT, DELETE) vont permettre
de manipuler les ressources :
› Format d’échanges entre le client et le serveur (XML, JSON,
text/plain,…)
Action sur les ressources
› Une ressource peut subir quatre opérations de bases CRUD
correspondant aux quatre principaux types de requêtes HTTP
(GET, PUT, POST, DELETE)
› REST s’appuie sur le protocole HTTP pour effectuer ces
opérations sur les objets
– POST ➔ Créer une nouvelle ressource
– GET ➔ Récupérer une ressource sans la modifier
– PUT ➔ Mettre à jour une ressource identifié par l’URI
– DELETE ➔ Supprimer la ressource identifiée par l’URI
Les étapes d’échange (1/3)
1. Client – Génération d’un message
– Définition de la ressource demandée
– Définition de l’action et donc de la méthode HTTP à utiliser (GET
/ POST / PUT / DELETE)
GET https://jsonplaceholder.typicode.com/users/2
8
Les étapes d’échange (2/3)
2. Serveur – Réception et Réponse
– Identification de la ressource demandée
– Identification de la méthode HTTP utilisée
– Résolution de l’action
– Génération de la réponse (Représentation de la ressource, Code d’état)
USERS Réponse HTTP
I name usernam email … Statut de la réponse : 200
D e
1 … … … … {"id" :2,
GET "name" : "Ervin Howell",
2 Ervin Howell Antonette [email protected] …
"username" : "Antonette",
3 … … … … "email" : "[email protected]",
4 … … … … …}
9
… … … … …
Les étapes d’échange (3/3)
3. Client – Lecture de la réponse
– Décodage du code d’état (code résultat, code erreur)
– Si positif (200/201) : validation (création, modification, suppression, consultation)
– Si négatif (4XX/5XX) : Information sur la raison de l’échec
10
Méthode POST
› La méthode POST crée une nouvelle ressource sur le
système
POST: https://jsonplaceholder.typicode.com/users/ Corps de la
requête
{
"name": "Mario" ,
"username": "Mario", "email": "[email protected],
…
}
Client Serveur
Statut : 201, 204
Message : Created, No content Corps de la réponse
{
"id": 11
}
Méthode GET
› La méthode GET renvoie une représentation de la
ressource tel qu’elle est sur le système
GET: https://jsonplaceholder.typicode.com/users/2
Statut : 200 Message : OK
Corps de la réponse
{
"id": 2,
"name": "Ervin Howell",
Client "username": "Antonette", "email":
Serveur
"
[email protected]", "address": {
"street": "Victor Plains", "city":
"Wisokyburgh", "zipcode":
"90566-7771"
},
"phone": "010-692-6593 x09125«
}
Méthode PUT
› Mise à jour de la ressource sur le système
Identifiant de la
ressource sur le
serveur
PUT: https://jsonplaceholder.typicode.com/users/2
En-tête : …..
Corps de la requête
{
"username": "Ervin"
}
Client Statut : 200 Serveur
Message : OK
Corps de la réponse
{
"username": "Ervin",
"id": 2
}
Méthode DELETE
› Supprime la ressource identifiée par l’URI sur le serveur
Identifiant de la
ressource sur le
serveur
DELETE: https://jsonplaceholder.typicode.com/users/2
Statut : 200
Message : OK
Client Serveur
Corps de la réponse
{
}
REST, Méthode HTTP et Ressources
› L’opération à effectuer sur une ressource est déterminée par le
type de la requête HTTP
› Plusieurs actions sont possibles pour une même UR
Tout dépend du type de la méthode HTTP utilisée
GET
Exemple :
PUT https://jsonplaceholder.typicode.com/users/2
DELETE
GET
https://jsonplaceholder.typicode.com/users
POST
15
REST, Méthode HTTP et Ressources
› Crée une nouvelle personne ➔
POST https://jsonplaceholder.typicode.com/users
› Liste des personnes à ➔
GET https://jsonplaceholder.typicode.com/users
› Récupérer une personne ➔
GET https://jsonplaceholder.typicode.com/users/{id}
› Modifier une personne ➔
PUT https://jsonplaceholder.typicode.com/users/{id}
› Supprimer une personne ➔
DELETE https://jsonplaceholder.typicode.com/users/{id}
16
Les services RESTFUL
› Que se passe t-il
– si on fait de la lecture avec un POST ?
– Si on fait une mise à jour avec un DELETE ?
– Si on fait une suppression avec un PUT ?
➔ REST ne l’interdit pas
➔ Mais si vous le faites, votre application ne respecte pas
les exigences REST et donc n’est pas RESTFUL
17
Représentation des données
❑ GET ➔ Le serveur renvoie au client l’état de la ressource
❑ PUT, POST ➔ Le client envoie l’état d’une ressource au serveur
Les données échangées entre le client et le serveur pour réaliser ces actions
peuvent être sous différent format selon l’API REST développée / utilisée :
– JSON
– XML
– CSV
– Text/plain
– …
Développement d’une API
REST avec Spring Boot
19
Les annotations Spring boot
› @SpringBootApplication: annotation pour la classe main de l’application
Spring boot. Elle Englobe les annotations :
– @Configuration : donne à la classe actuelle la possibilité de définir des
configurations qui iront remplacer les traditionnels fichiers XML. Ces
configurations se font via des Beans.
– @EnableAutoConfiguration : l'annotation vue précédemment qui permet,
au démarrage de Spring, de générer automatiquement les configurations
nécessaires en fonction des dépendances situées dans notre classpath.
– @ComponentScan : indique qu'il faut scanner les classes de ce package
afin de trouver des Beans de configuration.
20
Les annotations Spring boot
› Annotation de classe :
– Placée au dessus de la déclaration de la classe
– @RestController : indique que la classe va pouvoir traiter des requêtes REST (GET,
POST, PUT, DELETE)
› Annotations de méthode :
– Placées au dessus des déclarations des méthodes
– @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
– Peuvent accepter plusieurs paramètres :
› value : indique l'URI à laquelle une méthode doit répondre.
› produces/consumes : indique le format de données (XML/JSON) que la
méthode est capable de répondre/consommer. 21
Exemples
@GetMapping("/produits")
public List<Product> listeProduits() { … }
La méthode "listeProduits" sera invoquée suite à une requête HTTP qui
utilise la méthode HTTP "GET" avec une URI qui pointe sur la ressource
"/produits".
@PostMapping("/produits")
public void ajouterUnProduit(@RequestBody Product produit) { … }
La méthode "ajouterUnProduit" sera invoquée suite à une requête
HTTP qui utilise la méthode HTTP "POST" avec une URI qui pointe sur
la ressource "/produits".
22
Passage des paramètres
@GetMapping("/produits/{id}")
public Product afficherUnProduit(@PathVariable int id) { … }
› La méthode "afficherUnProduit" sera invoquée suite à une requête
HTTP qui utilise la méthode HTTP "GET" avec une URI dynamique qui
pointe sur différentes ressources de Path variable "/produits/{id}".
› {id} est une variable utilisée dans le Path de l’URI.
› @PathVariable : utilisé lors des URLs dynamiques, pour récupérer la
valeur de la variable utilisée dans le Path de l’URI dynamique.
23
Passage des paramètres
› lorsqu’on reçoit une requête POST / PUT avec les informations JSON d’une
ressource. Il faut donc constituer un objet Java à partir de ce JSON.
› L’annotation @RequestBody demande à Spring que le JSON contenu dans la requête
HTTP soit converti en objet Java et placé dans le paramètre de la méthode.
› @RequestBody est utilisé dans les méthodes annotées @PostMapping /
@PutMapping
› Exemple :
@PostMapping("/produits")
public void ajouterUnProduit(@RequestBody Product produit)
24