IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

REST Discussion :

Question d'architecture / HATEOS


Sujet :

REST

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut Question d'architecture / HATEOS
    Bonjour,

    Une petite interrogation sur la mise en place d'une architecture REST.
    Partons d'un exemple: Une ressource COMMANDE qui peut être annulée.
    Voici une représentation possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <order id="">
    	<canceled>false</canceled>
    </order>
    Pour annuler cette commande, on pourrait faire un PUT sur la ressource en modifiant l'élément "<canceled>" pour le passer à "true".

    Or, le client DOIT avoir connaissance cette astuce pour pouvoir annuler la commande.
    Ce qui n'est pas recommandé dans une archi REST qui veut que le client puisse s'orienter seul dans ses actions possible: Le fameux HATEOS.

    Alors on trouve quelques exemples qui préconisent ce genre de fonctionnement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <order id="">
    	<link rel="cancel" href="/order/18/cancel" />
    </order>
    Un lien permettant d'annuler la commande est donc retourné au client.
    Génial.


    Sauf que cette URI "/commande/18/cancel" amène quelques remarques:
    * Quelle ressource concerne-t-elle ?
    * "cancel", c'est une action ça ?! On retourne vers un design RPC...

    Alors comment résoudre ce problème ?
    * Créer une ressource /canceledOrder et faire un POST dessus pour créer une commande annulée ?
    Du coup la représentation pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <order id="">
    	<link rel="cancel" href="/canceledOrder" method="POST" />
    </order>
    Et celle-ci, quand la commande est effectivement annulée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <order id="">
    	<canceled>
    		<value>true</value>
    		<link href="/canceledOrder/18"/>
    	</canceled>
    </order>

    Qu'en pensez-vous ? Comment avez-vous résolu ce genre de problèmatique ?

    Merci !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Pour annuler cette commande, on pourrait faire un PUT sur la ressource en modifiant l'élément "<canceled>" pour le passer à "true".

    Or, le client DOIT avoir connaissance cette astuce pour pouvoir annuler la commande.
    Si vous indiquez l'URI sur laquelle appliquer le POST qui... ce n'est plus "une astuce" mais la documentation de l'API (rest) proposée.

    Sauf que cette URI "/commande/18/cancel" amène quelques remarques:
    * Quelle ressource concerne-t-elle ?
    * "cancel", c'est une action ça ?! On retourne vers un design RPC...
    L'intérêt de cette "forme" (par rapport à la précédente) est que l'URI retournée est "opaque". Seul le serveur devra savoir quoi faire lorsqu'il recevra un POST sur cette "ressource". De plus, on pourra changer son format sans avoir à modifier l'API (côté client)

    Dans les deux cas, il est possible d'annuler commande X... Fonctionnellement c'est équivalent. Ce qui change c'est la documentation de l'API (et sa réalisation) avec plus ou moins de latitude pour "changer" quelques éléments de réalisation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Merci pour votre réponse.

    Si je comprends bien votre réponse, tant qu'un lien (rel="cancel") est présent, peut importe sur quel URI il pointe (href) ?

    Ce qui me dérange, c'est cette URI justement: "order/12/cancel". Elle doit permettre d'identifier une ressource. Alors que dans ce cas, elle sert uniquement à effectuer une action sur une ressource.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par DeathMaker Voir le message
    Ce qui me dérange, c'est cette URI justement: "order/12/cancel"
    Elle doit permettre d'identifier une ressource. Alors que dans ce cas, elle sert uniquement à effectuer une action sur une ressource.
    Vous essayez de généraliser les attributs d'une couche "basse". Ca va bien pour représenter des ressources read only voire des actions type CRUD.

    Lorsque dans un document on trouve des <link rel=...>, nous sommes - pour faire simple - dans le domaine des "documents hypermedia".
    Nous ne sommes plus dans la représentation d'une ressource simple mais dans une application qui organise des transitions d'état de ressources ayant des liens entre elles.

    Les "<link rel=...>" ont été introduit par Atom le protocole de publication, et sont généralisés par HTML5. REST dans ce cadre reste la "brique de base" de la construction mais le changement d'échelle le relègue au niveau de "détail".

    Je ne suis pas certain d'être assez clair.
    Désolé
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Question sur Architecture d'un jeu vidéo 3D
    Par Polygon dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 28/10/2007, 12h43
  2. [C# 2.0] Question d'architecture - code dynamique
    Par StormimOn dans le forum Framework .NET
    Réponses: 11
    Dernier message: 06/03/2007, 11h19
  3. [Création d'un moteur] Petite question d'architecture technologique
    Par ludovic85 dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 07/02/2007, 18h00
  4. [Architecture] Question d'architecture
    Par bourbaki2003 dans le forum Général Java
    Réponses: 3
    Dernier message: 11/07/2006, 10h38
  5. [JPanel] [GUI] question d'architecture
    Par _KB_ dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/06/2006, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo