7 janvier 2014

Architecture REST


REST (REpresentational State Transfer) est un style d'architecture client/serveur.

REST n'est pas un standard, ni un protocole (contrairement à SOAP qui est un protocole standardisé).

Une implémentation RESTful peut utiliser des standards existants comme HTTP, URI, XML.

Objectif

L'objectif du REST est d'utiliser les principes qui ont fait le succès du Web pour les appliquer dans le domaine des architectures client/serveur :
  • le serveur fournit et stocke des ressources via une interface simple
  • le serveur fournit au client les liens pour naviguer entre les ressources
  • le client récupère et renvoie des ressources au serveur en utilisant des commandes simples
  • la mise en cache des ressources diminuent les trafics réseaux entre le client et le serveur
  • les serveurs ne conservent pas les états du client ni d'informations applicatives :
    • la charge mémoire du serveur est diminuée
    • les serveurs peuvent être répliqués sans incidence => scalabilité
    • il est possible d'effectuer facilement de la répartition de charge entre plusieurs serveurs pour améliorer les performances

Contraintes d'une architecture REST

  • Client / Serveur
    • le client et le serveur communiquent via une interface commune
      • exemple : HTTP
    • on applique la séparation des préoccupations entre le client et le serveur
      • exemple :
        • le client s'occupe de la présentation des données et du stockage des données de la session utilisateur
        • le serveur s'occupe du stockage des ressources
  • Serveur sans-état (stateless)
    • le serveur ne conserve pas d'informations entre deux requêtes du client
    • ceci permet la réplication et la répartition de charge entre serveurs
  • Mise en cache
    • les réponses du serveur peuvent être mises en cache soit par le client, soit par un serveur intermédiaire proxy afin de diminuer le nombre d'aller-retours avec le serveur et ainsi accélérer les temps de réponse et les performances
  • Système en couches
    • un serveur frontal peut servir d'intermédiaire entre le client et plusieurs serveurs de traitements
    • ce serveur peut effectuer de la mise en cache et du load-balancing pour rediriger les requêtes entre plusieurs serveurs et équilibrer leurs charges

Interface commune entre le client et le serveur


REST est une généralisation des principes sur lesquels repose le protocol HTTP et qui dérivent des concepts suivants :
  • Ressources
    • Le système expose des ressources à d'autres systèmes
    • exemple :
      • une facture
      • une fiche client
  • Identification des ressources
    • Les ressources sont identifiées par une adresse URI
    • En HTTP, les adresses URI ont la forme suivante :
      • /produits
        • représente toutes les ressources de type "produit"
      • /produits/{id}
        • pour accéder à une ressource de type "produit" en particulier
        • avec "{id}" l'identifiant de la ressource "produit" à consulter
        • il n'y a pas de standard concernant la forme de "{id}" : il s'agit d'avoir une syntaxe qui permette d'identifier une ressource "produit" parmi les autres ressources "produit". 
          • Exemple : /produits/{annee}/{mois}/{jour}
  • Verbes d'action
    • Chaque ressource peut être récupérée et manipulée via une liste de verbes d'action.
    • Ces verbes d'action sont simples et en nombre limité
    • En HTTP, les verbes d'actions sur les ressources sont :
      • GET : récupération
      • POST : création
      • PUT : modification
      • DELETE : suppression
      • et aussi : HEAD, OPTIONS, TRACE, CONNECT
  • Représentation d'une ressource
    • La ressource est fournie au client selon une représentation adaptée au client
    • La structure de la représentation est indiquée par le type de média, avec par exemple :
      • XML : application/xml
      • JSON : application/json
  • Hypermédia (HATEOAS)
    • Les représentations XML ou JSON des ressources contiennent des liens qui pointent vers d'autres ressources
    • Ces liens permettent au client de naviguer entre les ressources via leurs adresses URI (qui sont leurs identifiants)
    • C'est le système qui fournit ces liens, ainsi le client n'a pas à les déterminer ni à les construire
    • Ce concept d'hypermédia est appelé HATEOAS pour Hypermedia As The Engine Of Application

Verbes d'actions et URI

L'association entre l'URI et les verbes d'actions devraient produire les actions suivantes :
  • GET :
    • /produits
      • retournent toutes les ressources "produit"
Requête :
GET /produits HTTP/1.1
Réponse :
HTTP/1.1 200 OK
Content-Type: application/xml

<produits>
  <produit id="123">
    <link rel="self" href="http://demo.com/produits/123"/>
    <nom>iPhone</nom>
    <montant>199.99€</montant>
  </produit>
  <produit id="124">
    <link rel="self" href="http://demo.com/produits/124"/>
    <nom>Macbook</nom>
    <montant>1599.99€</montant>
  </produit>
  ...
</produits>
  • GET :
    • /produits/123
      • retourne la ressource "produit 123"
Requête :
GET /produits/123 HTTP/1.1
Réponse :
HTTP/1.1 200 OK
Content-Type: application/xml

<produit id="123">
  <link rel="self" href="http://demo.com/produits/123"/>
  <nom>iPhone</nom>
  <montant>199.99€</montant>
</produit>
  • PUT :
    • /produits
      • remplacer toutes les ressources "produit" par une autre liste de ressources "produit"
    • /produits/123
      • remplacer le contenu de la ressource "produit 123" par un autre contenu
      • créer cette ressource "produit 123" si elle n'existait pas
  • POST :
    • /produits
      • créer une nouvelle ressource "produit"
      • l'URI de cette nouvelle ressource est généralement retournée au client
    • /produits/123
      • non utilisé
  • DELETE :
    • /produits
      • supprime toutes les ressources "produit"
    • /produits/123
      • supprime la ressource "produit 123"

Services Web RESTful

JAX-RS : Java API for RESTful Web Services est inclue dans la norme Java EE 6 et 7.
Cette API permet de définir des Services Web en Java qui reposent sur l'architecture REST.
Les implémentations possibles de JAX-RS :
Voici un article de Octo avec une comparaison de ces implémentations :
Spring permet également de définir des Services Web RESTful.

Clients

Spring indique comment créer un client qui utilise des Services Web RESTful :

Ressources