Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 57KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. <!doctype html>
  2. <html lang=fr>
  3. <head>
  4. <!-- Always define the charset before the title -->
  5. <meta charset=utf-8>
  6. <title>★ Pour ne plus être en REST, comprendre cette architecture — Biologeek — David Larlet</title>
  7. <!-- Define a viewport to mobile devices to use - telling the browser to assume that the page is as wide as the device (width=device-width) and setting the initial page zoom level to be 1 (initial-scale=1.0) -->
  8. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  9. <!-- Fake favicon, to avoid extra request to the server -->
  10. <link rel="icon" href="data:;base64,iVBORw0KGgo=">
  11. <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
  12. <link rel="manifest" href="/manifest.json">
  13. <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
  14. <noscript>
  15. <style type="text/css">
  16. /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
  17. body {
  18. font-family: 'EquityTextB', serif;
  19. }
  20. h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
  21. font-family: 'EquityCapsB', sans-serif;
  22. font-variant: normal;
  23. }
  24. </style>
  25. </noscript>
  26. <!-- Canonical URL for SEO purposes -->
  27. <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20070413-pour-ne-plus-etre-en-rest-comprendre-cette-architecture">
  28. </head>
  29. <body>
  30. <div>
  31. <header>
  32. <nav>
  33. <p>
  34. <small>
  35. Je suis <a href="/david/" title="Profil public">David Larlet</a>, <a href="/david/pro/" title="Activité professionnelle">artisan</a> du web qui vous <a href="/david/pro/accompagnement/" title="Activité d’accompagnement">accompagne</a><span class="more-infos"> dans l’acquisition de savoirs pour concevoir des <a href="/david/pro/produits-essentiels/" title="Qu’est-ce qu’un produit essentiel ?">produits essentiels</a></span>. <span class="more-more-infos">Discutons ensemble d’une <a href="/david/pro/devis/" title="En savoir plus">non-demande de devis</a>.</span> Je partage ici mes <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et <a href="/david/correspondances/2017/" title="Lettres hebdomadaires">correspondances</a>.
  36. </small>
  37. </p>
  38. </nav>
  39. </header>
  40. <section>
  41. <h1 property="schema:name">★ Pour ne plus être en REST, comprendre cette architecture</h1>
  42. <article typeof="schema:BlogPosting">
  43. <div property="schema:articleBody">
  44. <img src="/static/david/biologeek/images/logos/rest_softies.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
  45. <p>Depuis quelques mois, <del>j'apprends</del> j'essaye d'apprendre <abbr title="Representational state transfer">REST</abbr> et j'ai lu de nombreuses pages sans pour autant trouver d'explication simple, à la portée de tous. Du coup quand j'essaye d'expliquer les mécanismes et les avantages professionnellement, c'est pas toujours convaincant... et je voulais justement écrire un petit billet pour mettre tout ça au clair. Et puis je suis récemment tombé sur <a href="http://softiesonrails.com/tags/rest">une série d'explications par Softies on Rails</a> se basant sur des exemples concrets. En voici la traduction chronologique.</p>
  46. <h2>Comprendre les ressources</h2>
  47. <p>D'une certaine manière, apprendre REST fut très difficile pour moi. Je ne sais pas vraiment pourquoi. Peut-être car j'ai passé une bonne partie de ma vie à développer des applications client et non des applications web. Peut-être est-ce parce que (à lire rapidement) j'ai commencé à développer pour le web tout en apprenant Ruby tout en apprenant Rails et que j'ai ensuite été à RailsConf et tout le monde était excité par REST et j'approuvais pour ne pas passer pour un imbécile mais honnêtement je ne savais pas de quoi il retournait...</p>
  48. <p><strong>Si vous essayez de comprendre REST, cette série est faite pour vous.</strong></p>
  49. <blockquote><p>Les experts en <abbr title="HyperText Transfer Protocol">HTTP</abbr>, <abbr title="HyperText Markup Language">HTML</abbr> et REST pourraient chercher la petite bête avec ma terminologie simplifiée me permettant d'aller droit au but. Si c'est votre cas, je ne veux pas en entendre parler, car cette série ne vous est pas destinée de toute façon :-)</p></blockquote>
  50. <h3>Premier point</h3>
  51. <p>Commençons par le commencement. Comment fonctionne un navigateur&nbsp;? Avant d'essayer de développer des sites avec Rails, je pensais que ça marchait ainsi&nbsp;:</p>
  52. <ul>
  53. <li>je tape une url dans la barre d'adresse ou je clic sur un lien&nbsp;;</li>
  54. <li>le navigateur fait une «&nbsp;requête http » (quoi que cela puisse signifier) et obtient du code HTML en réponse&nbsp;;</li>
  55. <li>le navigateur interprète ce HTML pour afficher la page.</li>
  56. </ul>
  57. <p>Et c'est à peu près tout. Et je ne me suis jamais demandé comment les formulaires fonctionnaient. Je me disais juste que ça devait être une variante de la précédente description.</p>
  58. <p>En réalité, le protocole HTTP décrit les instructions détaillées de la façon dont un navigateur doit envoyer ses requêtes au serveur. HTTP est totalement différent du HTML, qui est le langage choisit pour représenter le contenu d'une page. HTTP permet au navigateur de récupérer divers types d'informations à partir du serveur, dont la simple récupération d'une page HTML ou la soumission d'un formulaire. En fait, HTTP permet d'effectuer huit types de requêtes différentes sur le serveur. Les deux requêtes les plus connues sont les suivantes&nbsp;:</p>
  59. <ul>
  60. <li><strong>une requête «&nbsp;GET »&nbsp;: récupère le contenu d'une ressource sur le web, la ressource est uniquement identifié par une <abbr title="Uniform Resource Locator">URL</abbr></strong>&nbsp;;</li>
  61. <li><strong>une requête «&nbsp;POST »&nbsp;: envoie des données à une URL afin de créer une nouvelle ressource</strong>.</li>
  62. </ul>
  63. <h3>Deuxième point</h3>
  64. <p>Remarquez comme j'ai glissé le mot «&nbsp;ressource » alors que vous ne l'attendiez pas. Ça a été mon premier mal de tête lorsque j'ai essayé de comprendre REST&nbsp;: <strong>penser au web comme un ensemble de ressources, pas de «&nbsp;pages web »</strong>. Qu'est-ce que je veux dire par là&nbsp;?</p>
  65. <p>Hier, je suis allé sur amazon.com et j'ai consulter quelques produit que je voudrais acheter. J'ai aussi lu quelques articles de Wikipedia. J'ai parcouru quelques news de TechCrunch et j'ai ensuite vérifier les scores de D1 pour constater à quel point Lyon est loin devant.</p>
  66. <p>Si vous voulez comprendre REST, vous devez arrêter de penser à tout ça en termes de pages web. Prenons l'exemple d'un article de Wikipedia. Ce n'est pas seulement une page web, c'est une ressource - dans notre exemple un biographie d'Archimède. J'utilise un navigateur web pour accéder à cette ressource, le navigateur récupère donc une représentation HTML de cette ressource, car afficher du HTML est la seule possibilité de représentation de ces ressources par un navigateur.</p>
  67. <p>Je sais que c'est étrange au début. L'article sur Archimède n'est pas une page web&nbsp;? Non. J'ai demandé la représentation HTML d'une ressource appartenant à Wikipedia, une ressource pouvant être identifiée par l'<abbr title="Universal Resource Identifier">URI</abbr> «&nbsp;//fr.wikipedia.org/wiki/Archimède ». Wikipedia aurait pu choisir de représenter cette ressource de beaucoup de façons - avec un <acronym>PDF</abbr>, ou peut-être une image .jpg. C'est même peut-être déjà possible. Mais Firefox utilise une requête GET qui spécifie que cette ressource doit être obtenue à partir du serveur sous forme de HTML, donc c'est ce que j'ai.</p>
  68. <p>Un autre exemple&nbsp;: ma réservation d'avion est une ressource détenue par Air France. Ils me permettent d'accéder à cette ressource de diverses manières&nbsp;: via une page HTML, mais ils peuvent aussi envoyer les informations de ma réservation sur mon téléphone portable. Ou ils peuvent me l'envoyer par mail en texte brut. Ou je peux les appeler avec un outil obsolète et ils vont me le dire de vive voix. <strong>Une même ressource, plusieurs représentations.</strong></p>
  69. <p>J'espère que c'est clair maintenant&nbsp;: ma réservation d'avion n'est pas qu'une page web. C'est une vraie ressource qui (heureusement pour moi) peut être affichée en HTML lorsque je le désire, et je peux utilise mon navigateur pour demander cette représentation et l'afficher sur mon écran.</p>
  70. <h3>Troisième point</h3>
  71. <p>Ok, maintenant que vous avez accepté le fait que <strong>le web est une gigantesque collection de ressources qui peuvent être servies de différentes manières</strong>, et qu'un affichage HTML est juste l'une d'entre elles, il y a maintenant un dernier concept que je souhaite aborder. Les ressources ne sont pas uniquement des simples articles biographiques, ou des réservations d'avions, ou des résultats sportifs. <strong>Certaines ressources sont des collections d'autres ressources.</strong> Une liste de vacances peut être une ressource. Une liste d'amis peut être une ressource. Une série de billets de blog peut être une ressource.</p>
  72. <p>Maintenant que vous avez compris ce que sont les ressources, nous allons maintenant nous intéresser à la façon dont HTTP permet la création, la récupération, la mise à jour et la suppression des ressources (<em><abbr title="Note du traducteur">NdT</abbr>&nbsp;: bon normalement c'est <strong>crud</strong> pour <strong>c</strong>reate, <strong>r</strong>etrieve, <strong>u</strong>pdate et <strong>d</strong>elete</em>).</p>
  73. <h2>Des millions d'API</h2>
  74. <h3>Analyse orientée objet et design</h3>
  75. <p>Si vous programmez en orienté objet depuis un certain temps, vous avez probablement appris à procéder de la façon suivante&nbsp;:</p>
  76. <ul>
  77. <li>écrire une description de votre problématique - ce que votre programme est censé faire.</li>
  78. <li>les noms sont vos classes.</li>
  79. <li>les verbes sont les méthodes de vos classes.</li>
  80. <li>permettre à vos noms d'appeler les méthodes d'autres noms pour qu'ils accomplissent des tâches.</li>
  81. </ul>
  82. <p>Ça semble bon. C'est ce que je fais en programmation depuis un moment déjà. Ce type de programmation par nom-verbe est souvent appelé style <a href="http://fr.wikipedia.org/wiki/Remote_procedure_call">RPC</a>. Je ne sais pas en quoi c'est proche de l'accès à distance mais je sais juste que le style RPC est la façon «&nbsp;classique » de développer des logiciels avec de l'orienté objet. C'est une très bonne manière pour développer des logiciels mais ce n'est pas la façon dont le web a été pensé. Pourquoi ça&nbsp;?</p>
  83. <p>Imaginez-vous en 1992 (ou juste avant que le web soit tel que vous le connaissez aujourd'hui). Et supposez 3 équipes différentes qui développent 3 logiciels&nbsp;: un pour acheter des livres, un pour acheter des billets d'avion et un autre qui permet d'obtenir des photographies aériennes de n'importe quelle distance de la Terre. Elles suivent toutes les 3 les techniques de modélisation orientée objet classiques dont nous avons parlé pour développer leurs applications. Et pensant qu'un tiers voudra probablement un jour s'interfacer avec leur logiciel, elles vont aussi implémenter leurs propres API.</p>
  84. <p>Maintenant supposons que ce soit votre boulot d'écrire un outil qui soit une interface de ces 3 applications.</p>
  85. <p>Ugh. Vous allez devoir apprendre 3 API différentes. Et je parie que vous voudriez des boutons qui correspondent directement aux méthodes que vous appelez pour chaque API. Ça semble logique, non&nbsp;? Je veux dire, comment feriez-vous autrement&nbsp;? Ok, on ne parle que de 3 API et vous connaissez de bon ouvrages qui ont des design patterns qui vont vous permettre de réduire cette complexité (et de rester aimable avec vos collègues par la même occasion).</p>
  86. <h3>Et pour un million d'API&nbsp;?</h3>
  87. <p>Revenons au navigateur. Lorsque vous l'installez sur votre ordinateur, il n'a aucune idée des sites que vous allez vouloir visiter. Par contre, il peut communiquer avec n'importe lequel de ces sites. Mais pas seulement, vous pouvez réaliser des actions sur ces sites&nbsp;: vous pouvez acheter de la musique, réserver des billets d'avion et avoir des vues satellites de votre maison.</p>
  88. <p>Est-ce magique&nbsp;? Réfléchissez un moment à l'impossibilité d'une telle approche si chaque site avait sa propre API. Pour acheter un livre sur Amazon, le navigateur aurait dû savoir appeler la méthode Amazon.Acheter(). Et il aurait dû appeler la méthode AirFrance.VérifierVols() lorsque j'ai cliqué sur le bouton «&nbsp;Vérifier les vols ». Vous ne pouvez tout simplement pas développer un outil qui permette d'appeler des millions d'API différentes.</p>
  89. <p><strong>C'est la raison pour laquelle le web n'a pas été designé avec une architecture RPC. Il a été designé avec une architecture REST.</strong></p>
  90. <h3>Une architecture orientée ressource</h3>
  91. <p>D'après Wikipedia, <a href="http://fr.wikipedia.org/wiki/REST">REST</a> signifie Representational State Transfer. Bon... peu importe. Cela signifie simplement qu'en lieu et place des noms avec des verbes arbitraires associés, chaque nom (que nous appellerons maintenant ressource) aura le même nombre fini de verbes. <strong>En d'autres termes, chaque ressource aura la même API</strong>. Les méthodes clés de cette API autorisent chaque client à&nbsp;:</p>
  92. <ul>
  93. <li>avoir une vue en lecture seule de la ressource&nbsp;;</li>
  94. <li>créer une nouvelle ressource&nbsp;;</li>
  95. <li>mettre à jour les attributs d'une ressource&nbsp;;</li>
  96. <li>supprimer une ressource.</li>
  97. </ul>
  98. <p>Attendez&nbsp;! Laquelle de ces méthode permet «&nbsp;d'acheter ce livre »&nbsp;? Laquelle permet de «&nbsp;chercher les vols entre Paris et Marseille mardi prochain »&nbsp;? Laquelle me permet de zoomer d'une ville à une rue sur une carte&nbsp;? Et laquelle permet à un utilisateur de se connecter à un site&nbsp;?</p>
  99. <h2>Architecture RESTful</h2>
  100. <h3>Nous sommes les dépôts</h3>
  101. <p><strong>À partir de maintenant, pensez à votre application comme étant rien d'autre qu'un dépôt à ressources.</strong> Qu'est-ce qu'un dépôt&nbsp;? <a href="https://larlet.fr/david/biologeek/archives/20060707-installer-un-depot-subversion-sous-ubuntu/">Subversion</a> est un bon exemple de dépôt de code source. MySQL est un dépôt de données relationnelles. Vous pensez à d'autres exemples&nbsp;?</p>
  102. <p>Pour le moment, j'ai juste besoin de prendre un exemple de dépôt que l'on puisse utiliser dans la suite de ce billet.</p>
  103. <h3>Le pire exemple au monde</h3>
  104. <p>Vous travaillez pour BiologeekAir, et vous devez développer leur infrastructure logicielle <em>from scratch</em>.</p>
  105. <ul>
  106. <li>Vous avez besoin d'un client riche, une interface permettant de saisir les informations de vol. Un vol est juste la définition d'un avion allant d'une ville à une autre à un moment donné.</li>
  107. <li>Vous voulez une interface web pour les employés de l'aéroport. Vous voulez que les passagers puissent vérifier le statut du vol à partir de leur téléphone portable.</li>
  108. <li>Et votre boss veut que vous créiez une belle API basée sur XML que les tiers pourront utiliser pour mettre à jour les gigantesques affichages de départs et d'arrivées de l'aéroport.</li>
  109. </ul>
  110. <p>Ça semble être un projet alléchant, non&nbsp;? Souvenez-vous de la première partie, nous avons décrit une architecture orientée objet traditionnelle et la façon dont il faut commencer en décrivant votre problème pour identifier les noms (qui deviendront vos objets) et les verbes (qui deviendront les méthodes). Imaginez juste le nombre de design patterns géniaux que vous allez pouvoir mettre en œuvre&nbsp;! Vous ne pouvez plus résister à l'envie de dessiner un énorme diagramme UML au tableau et d'enchaîner avec quelques diagrammes d'interactions&nbsp;! Oh, vous imaginez déjà les méthodes VolsPrévus.AnnulerVol() et Vol.Retard().</p>
  111. <p>Désolé David. <strong>Depuis que vous utilisez REST, une grande partie de votre design est déjà fait pour vous&nbsp;! En fait, la seule chose qu'il vous reste à faire est d'identifier vos ressources.</strong></p>
  112. <p>Laissez-moi le répéter, au cas où vous ne m'auriez pas entendu avec le raffut que font vos marqueurs effaçables, car c'est vraiment important.</p>
  113. <p><strong>Ne faites qu'identifier vos ressources.</strong></p>
  114. <p>Dans notre exemple, je peux rapidement identifier quelques noms clés&nbsp;: avions, aéroports et vols. Je vais probablement en trouver davantage ensuite mais c'est déjà un bon début.</p>
  115. <p>Comment les interfaces clients vont-elles accéder à chacune de ces ressources&nbsp;? Les URL ont été inventées pour ça. (Vous savez ce que signifie le L de <abbr title="Uniform Resource Locator">URL</abbr> n'est ce pas ?) Le «&nbsp;localisateur » de chaque ressource suit un pattern simple. Par exemple&nbsp;:</p>
  116. <ul>
  117. <li>/aeroports pour la liste des aéroports</li>
  118. <li>/avions pour la liste des avions</li>
  119. <li>/vols pour la liste des vols</li>
  120. </ul>
  121. <p>et&nbsp;:</p>
  122. <ul>
  123. <li>/aeroports/ory pour Paris Orly</li>
  124. <li>/avions/ZJ3543 pour l'avion identifié par le numéro de série ZJ3543</li>
  125. <li>/vols/451 pour le vol #451</li>
  126. </ul>
  127. <h3>Quatre méthodes</h3>
  128. <p>Ok, une fois vos ressources identifiées, REST définie les 4 méthodes (ou verbes en langage HTTP) que chacune de vos ressources peuvent implémenter&nbsp;:</p>
  129. <ul>
  130. <li><strong>GET&nbsp;: donnez moi une vue en lecture seule d'une instance d'une ressource depuis le dépôt.</strong></li>
  131. <li><strong>POST&nbsp;: j'ai une nouvelle instance d'une ressource que je veux ajouter au dépôt.</strong></li>
  132. <li><strong>PUT&nbsp;: je veux mettre à jour une ressource existante dans le dépôt.</strong></li>
  133. <li><strong>DELETE&nbsp;: je veux supprimer une instance d'une ressource du dépôt.</strong></li>
  134. </ul>
  135. <p>Ça vous semble familier&nbsp;? Avec Subversion, GET est similaire aux commandes «&nbsp;checkout » ou «&nbsp;update ». POST correspond à la commande «&nbsp;add » et DELETE à «&nbsp;delete ». Dans l'exemple avec MySQL, GET revient à faire un SELECT, POST un INSERT, PUT est semblable à UPDATE et DELETE, et bien, DELETE.</p>
  136. <p>Wow. Nous avons nos ressources et nous avons nos méthodes. On peut arrêter ici le design et commencer l'implémentation.</p>
  137. <h3>Appeler ces méthodes avec HTTP</h3>
  138. <p>Les applications web utilisent HTTP pour permettre au serveur et au client de communiquer ensemble. On peut maintenant préciser la première partie qui était restée assez floue. Que se passe-t-il vraiment lorsque vous tapez une adresse dans votre navigateur&nbsp;? Le navigateur met en forme un message HTTP pour appeler la méthode GET de la ressource identifiée par l'URL que vous lui avez fourni.</p>
  139. <p>Vous pouvez aussi appeler la méthode POST à partir de votre navigateur - mais seulement s'il y a un formulaire &lt;form&gt; sur la page. (Ok, pas exactement grâce à AJAX mais oublions pour le moment). Les formulaires peuvent envoyer des données à une URL particulière. Lorsque vous soumettez un formulaire, le navigateur appelle la méthode POST, passant l'URL ainsi que certaines données représentant la ressource qu'il doit ajouter ou modifier.</p>
  140. <p><strong>Vous ne pouvez pas appeler PUT ou DELETE avec votre navigateur avec du HTML habituel</strong>. Ce qui est bien malheureux. Bien que chaque serveur HTTP dans le monde sache gérer les appels aux méthodes PUT et DELETE, il n'y a pas de procédure standardisée pour faire ces appels avec du HTML. Vous devez inventer votre propre façon de faire pour signaler au serveur que vous essayer de faire des appels à PUT ou DELETE.</p>
  141. <p>En résumé&nbsp;: <strong>vous pouvez faire correspondre votre API REST avec les verbes HTTP mais il n'y a aucun tag HTML qui permette de faire des appels à PUT ou DELETE</strong>. Le client et le serveur doivent se mettre d'accord sur une convention à utiliser pour simuler les méthodes PUT et DELETE.</p>
  142. <h3>On y est presque</h3>
  143. <p>Maintenant que notre design est au point, nous l'implémenterons prochainement avec <del>Rails</del> Django ;-).</p>
  144. <h2>Réactions du traducteur</h2>
  145. <p>Bon vous l'aurez compris, les prochains billets ne seront pas des traductions d'exemples d'implémentation avec Ruby on Rails mais des articles originaux pour voir ce qu'il est possible de faire avec Django. Plusieurs projets ont vu le jour et vont tenter de s'unifier pour arriver à une solution cohérente et facilement intégrable. Bon accessoirement, j'aimerais bien mettre en place professionnellement une telle architecture donc ça m'intéresse beaucoup.</p>
  146. <p>En ce qui concerne <strong>REST, sa principale limitation vient de la non standardisation des méthodes PUT et DELETE dans les navigateurs</strong>. Je pense que c'est l'un des freins actuel à son adoption face à d'autres alternatives. Néanmoins, la possibilité de mettre en place du REST facilement côté serveur avec la dernière version de Ruby on Rails va, je l'espère, un peu démocratiser tout ça. Corrigez-moi si je me trompe mais RoR a choisi de placer une champ caché avec l'attribut <strong>method="PUT"</strong> (ou DELETE) pour gérer les différentes possibilités. Espérons que de telles pratiques deviennent la norme de façon à ce que <strong>REST devienne réellement la référence en terme d'interopérabilité entre les différents services web</strong>.</p>
  147. <h2>Ressources</h2>
  148. <h3>En français</h3>
  149. <ul>
  150. <li><a href="http://www.la-grange.net/2005/05/rest/">Apprendre REST - un style d'architecture du Web</a></li>
  151. <li><a href="http://www.clever-age.com/veille/clever-link/soap-vs.-rest-choisir-la-bonne-architecture-web-services.html">soap vs. rest&nbsp;: choisir la bonne architecture web services</a></li>
  152. <li><a href="http://opikanoba.org/tr/fielding/rest/">Traduction du chapitre de la Thèse de Roy T. Fielding relatif à REST</a></li>
  153. </ul>
  154. <h3>En anglais</h3>
  155. <ul>
  156. <li><a href="http://tomayko.com/articles/2004/12/12/rest-to-my-wife">How I Explained REST to My Wife</a> (et <a href="http://www.pompage.net/pompe/comment-j-ai-explique-rest-a-ma-femme/">maintenant traduit en français</a>&nbsp;! Merci Karl).</li>
  157. <li><a href="http://duncan-cragg.org/blog/tag/dialogue/">The REST Dialogues</a>&nbsp;: c'est un catégorie de son blog, il faut donc commencer par le dernier, c'est long mais ça en vaut la peine, surtout qu'il y a une <a href="http://addsimplicity.typepad.com/adding_simplicity_an_engi/2006/11/the_rest_dialog.html">vraie réponse d'un architecte eBay</a> qui a joué le jeu (il a répondu à d'autres aussi, généralement le lien est en commentaire).</li>
  158. </ul>
  159. <p>Je n'en mets pas plus car vous allez très vite être submergé de liens, c'est juste pour vous mettre en appétit, j'espère que vous êtes maintenant convaincu que <strong>REST est plus qu'une alternative à SOAP</strong>&nbsp;!</p>
  160. <p><strong>[edit]</strong>&nbsp;: un nouveau billet intitulé <a href="https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/">L'architecture orientée ressource pour faire des services web RESTful</a> précise de nombreux points sur l'architecture REST non couverts dans ce billet.</p>
  161. </div>
  162. </article>
  163. <footer>
  164. <h6 property="schema:datePublished">— 13/04/2007</h6>
  165. </footer>
  166. </section>
  167. <section>
  168. <div>
  169. <h3>Articles peut-être en rapport</h3>
  170. <ul>
  171. <li><a href="/david/biologeek/archives/20101130-de-lopendata-au-linkeddata-exemple-de-nosdonneesfr/" title="Accès à ★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr">★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr</a></li>
  172. <li><a href="/david/biologeek/archives/20090526-django-roa-pour-une-architecture-orientee-ressources/" title="Accès à ★ Django-ROA, pour une architecture orientée ressources">★ Django-ROA, pour une architecture orientée ressources</a></li>
  173. <li><a href="/david/biologeek/archives/20081117-le-web-semantique-ou-limportance-des-donnees-liees/" title="Accès à ★ Le Web Sémantique ou l&#39;importance des données liées">★ Le Web Sémantique ou l&#39;importance des données liées</a></li>
  174. </ul>
  175. </div>
  176. </section>
  177. <section>
  178. <div id="comments">
  179. <h3>Commentaires</h3>
  180. <div class="comment" typeof="schema:UserComments">
  181. <p class="comment-meta">
  182. <span class="comment-author" property="schema:creator">Country</span> le <span class="comment-date" property="schema:commentTime">13/04/2007</span> :
  183. </p>
  184. <div class="comment-content" property="schema:commentText">
  185. <p>Merci beaucoup pour cet article (et les liens associés).<br />
  186. <br />
  187. Ça m'a permis de découvrir cette architecture (j'en avais souvent entendu parlé mais je n'avais jamais approfondi la question). Vivement la suite de l'article :)</p>
  188. </div>
  189. </div>
  190. <div class="comment" typeof="schema:UserComments">
  191. <p class="comment-meta">
  192. <span class="comment-author" property="schema:creator">Thesa</span> le <span class="comment-date" property="schema:commentTime">13/04/2007</span> :
  193. </p>
  194. <div class="comment-content" property="schema:commentText">
  195. <p>Wahou !<br />
  196. <br />
  197. Super article, merci beaucoup pour la traduction !</p>
  198. </div>
  199. </div>
  200. <div class="comment" typeof="schema:UserComments">
  201. <p class="comment-meta">
  202. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">13/04/2007</span> :
  203. </p>
  204. <div class="comment-content" property="schema:commentText">
  205. <p>@Country et Thesa : merci.<br />
  206. <br />
  207. @Geoffrey : j'ai malencontreusement effacé ton commentaire en supprimant les spams, je suis vraiment vraiment désolé :/<br />
  208. <br />
  209. C'est dommage il était intéressant, de mémoire tu mettais en avant le fait qu'il serait mieux que les navigateurs implémentent ces méthodes pour ne pas avoir à faire des hacks de l'utilisation de POST et je suis bien d'accord avec toi !<br />
  210. <br />
  211. Le problème c'est l'inertie des navigateurs, il n'y a qu'à voir l'éternel débat entre xhtml2 et html5... du coup les petites bidouilles prennent parfois le dessus car les développeurs web sont plus réactifs ;-).</p>
  212. </div>
  213. </div>
  214. <div class="comment" typeof="schema:UserComments">
  215. <p class="comment-meta">
  216. <span class="comment-author" property="schema:creator">biou</span> le <span class="comment-date" property="schema:commentTime">14/04/2007</span> :
  217. </p>
  218. <div class="comment-content" property="schema:commentText">
  219. <p>si je peux me permettre, dans le paragraphe &quot;quatre méthodes&quot; je crois qu'il y a une inversion dans les descriptions de PUT et de POST.<br />
  220. <a href="http://tools.ietf.org/html/rfc2616#section-9.5" title="http://tools.ietf.org/html/rfc2616#section-9.5" rel="nofollow">tools.ietf.org/html/rfc26...</a></p>
  221. </div>
  222. </div>
  223. <div class="comment" typeof="schema:UserComments">
  224. <p class="comment-meta">
  225. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">14/04/2007</span> :
  226. </p>
  227. <div class="comment-content" property="schema:commentText">
  228. <p>@biou : je ne crois pas (cf. <a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#M.C3.A9thodes" title="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#M.C3.A9thodes" rel="nofollow">fr.wikipedia.org/wiki/Hyp...</a> )</p>
  229. </div>
  230. </div>
  231. <div class="comment" typeof="schema:UserComments">
  232. <p class="comment-meta">
  233. <span class="comment-author" property="schema:creator">gdo</span> le <span class="comment-date" property="schema:commentTime">15/04/2007</span> :
  234. </p>
  235. <div class="comment-content" property="schema:commentText">
  236. <p>Super article bravo<br />
  237. Maintenant il ne me reste (sans jeu de mot) plus qu'a reprendre mes programme ROR<br />
  238. <br />
  239. cordialement</p>
  240. </div>
  241. </div>
  242. <div class="comment" typeof="schema:UserComments">
  243. <p class="comment-meta">
  244. <span class="comment-author" property="schema:creator">karl</span> le <span class="comment-date" property="schema:commentTime">23/04/2007</span> :
  245. </p>
  246. <div class="comment-content" property="schema:commentText">
  247. <p>URIs, Addressability, and the use of HTTP GET and POST<br />
  248. <a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html" title="http://www.w3.org/2001/tag/doc/whenToUseGet.html" rel="nofollow">www.w3.org/2001/tag/doc/w...</a><br />
  249. <br />
  250. Notamment la checklist<br />
  251. 1.3 Quick Checklist for Choosing HTTP GET or POST</p>
  252. </div>
  253. </div>
  254. <div class="comment" typeof="schema:UserComments">
  255. <p class="comment-meta">
  256. <span class="comment-author" property="schema:creator">karl</span> le <span class="comment-date" property="schema:commentTime">23/04/2007</span> :
  257. </p>
  258. <div class="comment-content" property="schema:commentText">
  259. <p>Un autre article tres interessant sur le sujet<br />
  260. <br />
  261. <a href="http://bitworking.org/news/125/REST-and-WS" title="http://bitworking.org/news/125/REST-and-WS" rel="nofollow">bitworking.org/news/125/R...</a></p>
  262. </div>
  263. </div>
  264. <div class="comment" typeof="schema:UserComments">
  265. <p class="comment-meta">
  266. <span class="comment-author" property="schema:creator">Jérémie Grodziski</span> le <span class="comment-date" property="schema:commentTime">28/04/2007</span> :
  267. </p>
  268. <div class="comment-content" property="schema:commentText">
  269. <p>Bonjour David,<br />
  270. <br />
  271. Bravo pour cette traduction.<br />
  272. Je me permet de citer un lien vers un de mes posts il y a 6 mois sur ce sujet avec mon point de vue d'architecte du logiciel concernant la scalabilité / échelonnabilité de ce type d'architecture.<br />
  273. En anglais : <a href="http://www.grodziski.com/blog/jcontent/en/Architecture/2006/11/01/REST-a-scalable-architecture.html" title="http://www.grodziski.com/blog/jcontent/en/Architecture/2006/11/01/REST-a-scalable-architecture.html" rel="nofollow">www.grodziski.com/blog/jc...</a><br />
  274. Et en français :-) : <a href="http://www.grodziski.com/blog/jcontent/fr/Architecture/2006/11/01/REST-une-architecture-echelonnable.html" title="http://www.grodziski.com/blog/jcontent/fr/Architecture/2006/11/01/REST-une-architecture-echelonnable.html" rel="nofollow">www.grodziski.com/blog/jc...</a><br />
  275. <br />
  276. Jérémie.</p>
  277. </div>
  278. </div>
  279. <div class="comment" typeof="schema:UserComments">
  280. <p class="comment-meta">
  281. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">28/04/2007</span> :
  282. </p>
  283. <div class="comment-content" property="schema:commentText">
  284. <p>Merci pour ces liens Jérémie qui complètent parfaitement ce billet.</p>
  285. </div>
  286. </div>
  287. <div class="comment" typeof="schema:UserComments">
  288. <p class="comment-meta">
  289. <span class="comment-author" property="schema:creator">ThinkDRY Corp</span> le <span class="comment-date" property="schema:commentTime">14/05/2007</span> :
  290. </p>
  291. <div class="comment-content" property="schema:commentText">
  292. <p>super Ti Geek, marrant de retomber sur ton site en faisant de la veille sur REST...tenté par une virée en Inde pour implementer du REST on Rails? <br />
  293. </p>
  294. </div>
  295. </div>
  296. <div class="comment" typeof="schema:UserComments">
  297. <p class="comment-meta">
  298. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">15/05/2007</span> :
  299. </p>
  300. <div class="comment-content" property="schema:commentText">
  301. <p>Mmmh pas encore prêt à faire le grand saut mais qui sait, peut-être plus tard ? :-)</p>
  302. </div>
  303. </div>
  304. <div class="comment" typeof="schema:UserComments">
  305. <p class="comment-meta">
  306. <span class="comment-author" property="schema:creator">Bader</span> le <span class="comment-date" property="schema:commentTime">25/06/2007</span> :
  307. </p>
  308. <div class="comment-content" property="schema:commentText">
  309. <p>Tu peux peut-être rajouter ma courte présentation vidéo <a href="http://chamia.info/bader/archives/137" title="http://chamia.info/bader/archives/137" rel="nofollow">chamia.info/bader/archive...</a><br />
  310. ainsi que le PDF qui va avec :<br />
  311. <a href="http://journees.afpy.org/presentations/preston-ladjemi.pdf" title="http://journees.afpy.org/presentations/preston-ladjemi.pdf" rel="nofollow">journees.afpy.org/present...</a></p>
  312. </div>
  313. </div>
  314. <div class="comment" typeof="schema:UserComments">
  315. <p class="comment-meta">
  316. <span class="comment-author" property="schema:creator">Graouille</span> le <span class="comment-date" property="schema:commentTime">23/08/2007</span> :
  317. </p>
  318. <div class="comment-content" property="schema:commentText">
  319. <p>Très bonne approche pour comprendre REST. C'est très clair. Merci.</p>
  320. </div>
  321. </div>
  322. <div class="comment" typeof="schema:UserComments">
  323. <p class="comment-meta">
  324. <span class="comment-author" property="schema:creator">Fred</span> le <span class="comment-date" property="schema:commentTime">26/12/2007</span> :
  325. </p>
  326. <div class="comment-content" property="schema:commentText">
  327. <p>Bonjour<br />
  328. <br />
  329. J'ai traduit le chapitre 5 de la thèse de Roy. Fielding. Cela peut compléter la liste des ressources.<br />
  330. <a href="http://opikanoba.org/tr/fielding/rest/" title="http://opikanoba.org/tr/fielding/rest/" rel="nofollow">opikanoba.org/tr/fielding...</a><br />
  331. <br />
  332. Fred</p>
  333. </div>
  334. </div>
  335. <div class="comment" typeof="schema:UserComments">
  336. <p class="comment-meta">
  337. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">28/12/2007</span> :
  338. </p>
  339. <div class="comment-content" property="schema:commentText">
  340. <p>Oh merci Fred ! J'ai ajouté le lien en ressource.</p>
  341. </div>
  342. </div>
  343. <div class="comment" typeof="schema:UserComments">
  344. <p class="comment-meta">
  345. <span class="comment-author" property="schema:creator">Bernard Notarianni</span> le <span class="comment-date" property="schema:commentTime">06/01/2008</span> :
  346. </p>
  347. <div class="comment-content" property="schema:commentText">
  348. <p>Excellent article, autant dans la forme que le fond. <br />
  349. <br />
  350. Merci :-)</p>
  351. </div>
  352. </div>
  353. <div class="comment" typeof="schema:UserComments">
  354. <p class="comment-meta">
  355. <span class="comment-author" property="schema:creator">Nicolas Martignole</span> le <span class="comment-date" property="schema:commentTime">01/02/2008</span> :
  356. </p>
  357. <div class="comment-content" property="schema:commentText">
  358. <p>Article très clair et intéressant.<br />
  359. Merci pour ta traduction<br />
  360. <br />
  361. Nicolas</p>
  362. </div>
  363. </div>
  364. <div class="comment" typeof="schema:UserComments">
  365. <p class="comment-meta">
  366. <span class="comment-author" property="schema:creator">Azema</span> le <span class="comment-date" property="schema:commentTime">25/03/2008</span> :
  367. </p>
  368. <div class="comment-content" property="schema:commentText">
  369. <p>Merci beaucoup pour ce billet,<br />
  370. <br />
  371. Cela m'a permit de mieux apercevoir Rest, même si c'est encore un peu flou dans ma tête.<br />
  372. <br />
  373. Je vais tenter de travailler un peu plus dessus, pour m'éclaircir les neurones.<br />
  374. <br />
  375. Merci encore et bon courage pour la suite avec Django.<br />
  376. <br />
  377. Azema.</p>
  378. </div>
  379. </div>
  380. <div class="comment" typeof="schema:UserComments">
  381. <p class="comment-meta">
  382. <span class="comment-author" property="schema:creator">bea</span> le <span class="comment-date" property="schema:commentTime">06/04/2008</span> :
  383. </p>
  384. <div class="comment-content" property="schema:commentText">
  385. <p>Je vais commencer à écrire une API REST en java, cet article m'a beaucoup aidé pour comprendre comment structurer mon projet.<br />
  386. <br />
  387. J'ai une question &quot;pratique&quot;, comment faire côté serveur pour avoir autant d'URL? <br />
  388. Je pensais utiliser des servlets mais comment faire avec une URL du type /XXX/&lt;user_id&gt;/getYYY ?<br />
  389. Il faut analyser l'URL?<br />
  390. <br />
  391. Merci pour vos réponses.</p>
  392. </div>
  393. </div>
  394. <div class="comment" typeof="schema:UserComments">
  395. <p class="comment-meta">
  396. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">06/04/2008</span> :
  397. </p>
  398. <div class="comment-content" property="schema:commentText">
  399. <p>@bea : oui c'est exactement ça, en fonction des arguments dans l'url, il faut servir une réponse appropriée. Pour java, je sais qu'il existe pas mal de solutions qu'il serait intéressant d'analyser avant de se lancer dans l'écriture d'une nouvelle solution à mon avis. Bon courage :-)</p>
  400. </div>
  401. </div>
  402. <div class="comment" typeof="schema:UserComments">
  403. <p class="comment-meta">
  404. <span class="comment-author" property="schema:creator">bea (RE)</span> le <span class="comment-date" property="schema:commentTime">06/04/2008</span> :
  405. </p>
  406. <div class="comment-content" property="schema:commentText">
  407. <p>Tu parles d'arguments dans l'url.<br />
  408. Je voudrais savoir pourquoi avoir des URLs du type /XXX/&lt;user_id&gt;/getYYY plutôt que d'avoir une URL et un paramètre user_id.<br />
  409. <br />
  410. C'est plus simple de récuépérer les paramètres envoyés en get ou post plutôt que d'analyser l'URL.<br />
  411. <br />
  412. J'ai lu que c'était mieux de ne pas passer par des paramètres, pourquoi??<br />
  413. <br />
  414. merci<br />
  415. </p>
  416. </div>
  417. </div>
  418. <div class="comment" typeof="schema:UserComments">
  419. <p class="comment-meta">
  420. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">07/04/2008</span> :
  421. </p>
  422. <div class="comment-content" property="schema:commentText">
  423. <p>J'en ai pas mal parlé là : <a href="https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/" title="https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/" rel="nofollow">www.biologeek.com/journal...</a><br />
  424. <br />
  425. Le but c'est d'avoir une URL unique pour la ressource : /foo/id/. Normalement ton backend doit pouvoir traiter une url et en extraire les arguments (en tout cas les bons frameworks le font).<br />
  426. <br />
  427. Je n'avais pas vu le getYYY ton exemple, tu comptes mettre quoi dans YYY ? Normalement tu ne dois pas mettre de verbes dans tes urls, les actions doivent être dictées par les verbes HTTP (GET, POST, PUT et DELETE).<br />
  428. <br />
  429. Pour les paramètres, ils ont été déconseillés à la base car ils posaient problème dans le cas du référencement (tout ce qui est après le ? n'était pas considéré par Google). Aujourd'hui, ils restent utile dans le cas de filtres mais ils sont moins employés. Il faut considérer les urls comme les ids de la gigantesque base de données qu'est le web.</p>
  430. </div>
  431. </div>
  432. <div class="comment" typeof="schema:UserComments">
  433. <p class="comment-meta">
  434. <span class="comment-author" property="schema:creator">Alex</span> le <span class="comment-date" property="schema:commentTime">08/04/2008</span> :
  435. </p>
  436. <div class="comment-content" property="schema:commentText">
  437. <p>Bonjour,<br />
  438. <br />
  439. Pour avoir mis en place une architecture REST au sein d'une grande banque, voici quelques inconvénients et difficultés rencontrés :<br />
  440. <br />
  441. - Proxy http : les proxys applicatifs sont souvent limitatifs quant aux verbes http autorisés. DELETE et PUT notamment sont souvent bloqués et il faut passer outre en sacrifiant l'esprit REST (ie utiliser POST et GET de façon détournés)<br />
  442. - Librairies clientes : autant les outils du coté serveur sont matures et nombreux (en java : Restlet, Jersey et la JSR 311) autant les librairies du côté client (web notamment) ne sont pas toujours compatibles (exemple client flex : <a href="http://www.fngtps.com/2007/06/flex-can-t-do-rest" title="http://www.fngtps.com/2007/06/flex-can-t-do-rest" rel="nofollow">www.fngtps.com/2007/06/fl...</a>)<br />
  443. - Difficultés de mapper des services avec des ressources : l'architecture REST est parfaite pour une serveur de ressources (ie. getUser, postUser etc.) mais pour modéliser une application rendant des services métiers complexes (calculs, règle de gestion etc.) cela devient un vrai casse tête pour créer et mapper les ressources de façon intelligente sans sacrifier la modélisation applicative &quot;standard&quot; du côté serveur<br />
  444. <br />
  445. Alex.</p>
  446. </div>
  447. </div>
  448. <div class="comment" typeof="schema:UserComments">
  449. <p class="comment-meta">
  450. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">08/04/2008</span> :
  451. </p>
  452. <div class="comment-content" property="schema:commentText">
  453. <p>Merci pour ce retour très intéressant Alex !<br />
  454. <br />
  455. Pour répondre à la problématique de mapping des ressources, je suis aussi confronté à ce problème et c'est pas toujours évident...<br />
  456. <br />
  457. Je trouve l'article de Joe Gregorio très intéressant à ce sujet :<br />
  458. <a href="http://bitworking.org/news/201/RESTify-DayTrader" title="http://bitworking.org/news/201/RESTify-DayTrader" rel="nofollow">bitworking.org/news/201/R...</a><br />
  459. <br />
  460. Ça nécessite une certaine gymnastique du cerveau au début mais qui peut s'avérer utile, à force de retourner un peu l'application dans tous les sens pour identifier les ressources, ça ouvre parfois de nouvelles perspectives intéressantes.</p>
  461. </div>
  462. </div>
  463. <div class="comment" typeof="schema:UserComments">
  464. <p class="comment-meta">
  465. <span class="comment-author" property="schema:creator">jc</span> le <span class="comment-date" property="schema:commentTime">09/04/2008</span> :
  466. </p>
  467. <div class="comment-content" property="schema:commentText">
  468. <p>le genre d'article a lire un soir ou la copine n'est pas dans le coin (pour éviter les conversation ressemblant à des monologue &quot;Hey j'ai encore lu un truc trop bien...tu m'écoute?&quot; mais plutot se dire intérieurement avec une certaine satisfaction &quot;Woa c trop cool encore un article qui vas m'en apprendre plus qu'a l'ecole&quot;)<br />
  469. <br />
  470. bref. nouveaux sur django, je m'en vais direct avaler l'article sur django/REST.<br />
  471. <br />
  472. Encore un petit mot pour dire merci sur la qualité de ce blog et sa volonté didactique éfficace (premier commentaire oblige ;) )</p>
  473. </div>
  474. </div>
  475. <div class="comment" typeof="schema:UserComments">
  476. <p class="comment-meta">
  477. <span class="comment-author" property="schema:creator">mamo</span> le <span class="comment-date" property="schema:commentTime">18/04/2008</span> :
  478. </p>
  479. <div class="comment-content" property="schema:commentText">
  480. <p>Merci, Super article sympa sur REST... </p>
  481. </div>
  482. </div>
  483. <div class="comment" typeof="schema:UserComments">
  484. <p class="comment-meta">
  485. <span class="comment-author" property="schema:creator">Mathieu</span> le <span class="comment-date" property="schema:commentTime">19/12/2008</span> :
  486. </p>
  487. <div class="comment-content" property="schema:commentText">
  488. <p>Bonsoir,</p>
  489. <p>L&#39;article est très bien fait, mais je me sent un peu obligé de réagir sur un point. A propos de POST et PUT, si l&#39;on en croit ce document <a href="http://tools.ietf.org/html/rfc2616#page-54">http://tools.ietf.org/html/rfc2616#page-54</a> , ce serai plutot:</p>
  490. <p>PUT: créer ou modifier la ressource a tel uri, par exemple:<br />PUT /user/mathieu<br />avec dans le body: <br />&lt;user&gt;<br /> &lt;prenom&gt;mathieu&lt;/prenom&gt;<br /> &lt;nom&gt;.....&lt;/nom&gt;<br /> ....<br />&lt;/user&gt;</p>
  491. <p>alors que POST ne signifie pas nécéssairement qu&#39;une ressource sera créer. dans l&#39;application sur laquelle je travaille, on essai d&#39;utiliser POST, seulement quand on ne peux pas utiliser PUT, en général, lorsque l&#39;on ne connais pas à l&#39;avance l&#39;uri qui permettra d&#39;identifier la ressource (par exemple si l&#39;identifiant est un id auto incrémenté de base de donnée)</p>
  492. <p>Cordialement, Mathieu.</p>
  493. </div>
  494. </div>
  495. <div class="comment" typeof="schema:UserComments">
  496. <p class="comment-meta">
  497. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">22/12/2008</span> :
  498. </p>
  499. <div class="comment-content" property="schema:commentText">
  500. <p>@Mathieu : je suis tout à fait d&#39;accord, et c&#39;est ce que je précise dans un billet suivant (qui lui n&#39;est pas une traduction) :<br /><a href="https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/">https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/</a></p>
  501. <p>Cela dit, il est assez rare de connaître à partir du client les contraintes appliquées sur le serveur, comme tu le précises.</p>
  502. </div>
  503. </div>
  504. <div class="comment" typeof="schema:UserComments">
  505. <p class="comment-meta">
  506. <span class="comment-author" property="schema:creator">Michel Baily</span> le <span class="comment-date" property="schema:commentTime">05/02/2009</span> :
  507. </p>
  508. <div class="comment-content" property="schema:commentText">
  509. <p>Bonjour,</p>
  510. <p>Merci pour cette explication claire.<br />Je suis également dans une situation &quot;J&#39;apprends Ruby + RoR + Le Web dévelopmment+ Ajax + ...&quot;<br />Donc beaucoup de questions se posent à moi.<br />Notamment par rapport aux listes de ressources comme dans l&#39;exemple<br />/aeroports pour la liste des aéroports<br />/aeroports/orly pour orly</p>
  511. <p>Comment implémente-t-on la notion de filtre ?<br />Imaginons que je souhaite une liste des aéroports de France. Mon Url serait<br />/aeroports/france<br />Comment mon code va-t-il pouvoir identifier que france est une (sous)liste alors que orly est une resource ?<br />( Je voudrais évidement éviter de devoir demander<br />/aeroports/france/orly )</p>
  512. <p>Désolé si la question peut paraitre triviale à certains ;-)</p>
  513. <p>Michel</p>
  514. <p></p>
  515. </div>
  516. </div>
  517. <div class="comment" typeof="schema:UserComments">
  518. <p class="comment-meta">
  519. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">06/02/2009</span> :
  520. </p>
  521. <div class="comment-content" property="schema:commentText">
  522. <p>Salut Michel,</p>
  523. <p>Je dirais que tout dépend si le filtre est assimilable à une collection lui-même.</p>
  524. <p>Par exemple, si on veut juste pouvoir filtrer les aéroports en France, on peut passer les arguments en GET :<br />/aeroports/?country=France<br />Cette page listera les ressources (dont un lien vers Orly) qui correspondent à des aéroports filtrés pour le pays France.</p>
  525. <p>Maintenant c&#39;est souvent au cas par cas, selon l&#39;importance de la sous-collection en général. Par exemple ici on pourrait avoir /aeroports/france/orly ou /aeroports/orly Quelle URL fait le plus de sens pour cette ressource ? Je serais tenté de dire /aeroports/orly car on a bien collection/ressource mais ça dépend vraiment du projet, parfois il est plus intéressant d&#39;avoir la notion de filtrage par lieu directement dans l&#39;URL. Il n&#39;y a pas de réponse dans l&#39;absolu :-)</p>
  526. </div>
  527. </div>
  528. <div class="comment" typeof="schema:UserComments">
  529. <p class="comment-meta">
  530. <span class="comment-author" property="schema:creator">Vincent Boniakos</span> le <span class="comment-date" property="schema:commentTime">24/02/2009</span> :
  531. </p>
  532. <div class="comment-content" property="schema:commentText">
  533. <p>Salut Michel,<br />J&#39;utilise le framework konstrukt en PHP pour créer mon architecture REST. Leur approche est intéressante car ils utilisent la notion de controller. Je te laisse regarder la définition du pattern MVC.<br />Le principe est le suivant :<br />1. Chaque URI possède son controller.<br />Lorsque tu tapes <a href="http://www.monsite.com/aeroports">www.monsite.com/aeroports</a> un controller nommé &quot;aeroport_list_controller&quot; va s&#39;occuper de ta requête : par exemple afficher la liste des aéroports. De même si tapes <a href="http://www.monsite.com/aeroports/orly">www.monsite.com/aeroports/orly</a> un controller que l&#39;on va appelé &quot;aeroport_show_controller&quot; s&#39;occupera de ta requête, et affichera la liste des avions à orly.</p>
  534. </div>
  535. </div>
  536. <div class="comment" typeof="schema:UserComments">
  537. <p class="comment-meta">
  538. <span class="comment-author" property="schema:creator">Vincent Boniakos</span> le <span class="comment-date" property="schema:commentTime">24/02/2009</span> :
  539. </p>
  540. <div class="comment-content" property="schema:commentText">
  541. <p>(Suite)<br />2.Chaque controller possède deux comportement.<br />Le premier est décrit en 1., le second est de rediriger vers le controller correspondant à ta requête.<br />Un exemple : je saisie l&#39;url <a href="http://www.monsite.com/aeroports/orly/vols/451">www.monsite.com/aeroports/orly/vols/451</a>. Le premier controller en jeu est &quot;aeroport_list_controller&quot;, qui me redirige vers &quot;aeroport_show_controller&quot;. &quot;aeroport_show_controller&quot; me redirige vers &quot;vols_list_controller&quot;.<br />&quot;vols_list_controller&quot; me redirige ensuite vers &quot;vols_show_controller&quot; qui affichera le vol 451 au départ d&#39;orly !<br />3.Chaque controller connait le contexte dans lequel il est appelé, par imbriquation. Ainsi lorsque je saisis aeroports/orly/vols/451, &quot;vols_show_controller&quot; sait que je souhaite afficher le vol 451 au départ d&#39;orly.<br />Enfin c&#39;est à toi d&#39;implémenter les méthodes GET, POST, PUT et DELETE dans chaque controller.</p>
  542. </div>
  543. </div>
  544. <div class="comment" typeof="schema:UserComments">
  545. <p class="comment-meta">
  546. <span class="comment-author" property="schema:creator">guigui</span> le <span class="comment-date" property="schema:commentTime">14/06/2009</span> :
  547. </p>
  548. <div class="comment-content" property="schema:commentText">
  549. <p>Bonjour, <br />cet article est très intéressant, il m&#39;a permis de mieux comprendre REST. <br />Pour un TP j&#39;ai pu le mettre pratique avec SYMFONY. Cependant, existe-t-il un moyen de tester, en envoyant des headers HTTP avec les différentes commandes (GET, POST, DELETE, ...) ?</p>
  550. </div>
  551. </div>
  552. <div class="comment" typeof="schema:UserComments">
  553. <p class="comment-meta">
  554. <span class="comment-author" property="schema:creator">LTC</span> le <span class="comment-date" property="schema:commentTime">21/08/2009</span> :
  555. </p>
  556. <div class="comment-content" property="schema:commentText">
  557. <p>Merci pour l&#39;article... Je dois développer sous une architecture REST et ça me semble moins flou.</p>
  558. </div>
  559. </div>
  560. <div class="comment" typeof="schema:UserComments">
  561. <p class="comment-meta">
  562. <span class="comment-author" property="schema:creator">Dominique Rabeuf</span> le <span class="comment-date" property="schema:commentTime">11/10/2009</span> :
  563. </p>
  564. <div class="comment-content" property="schema:commentText">
  565. <p>Et maintenant comment faire avec xmpp ? Il n&#39;y a pas les méthodes de http ? C&#39;est pas grave, parce que peut importe la manière de désigner, ce qui compte c&#39;est la ressource et ce qu&#39;on peut faire avec ! faire(ressource) ~ f(x) on prend x et on cherche les f qui vont avec, et voilà. Le Web est mort, vive Jabber</p>
  566. </div>
  567. </div>
  568. <div class="comment" typeof="schema:UserComments">
  569. <p class="comment-meta">
  570. <span class="comment-author" property="schema:creator">Ronald</span> le <span class="comment-date" property="schema:commentTime">19/11/2009</span> :
  571. </p>
  572. <div class="comment-content" property="schema:commentText">
  573. <p>Superbe article au total, Merci</p>
  574. </div>
  575. </div>
  576. <div class="comment" typeof="schema:UserComments">
  577. <p class="comment-meta">
  578. <span class="comment-author" property="schema:creator">Bilal</span> le <span class="comment-date" property="schema:commentTime">30/03/2010</span> :
  579. </p>
  580. <div class="comment-content" property="schema:commentText">
  581. <p>Merci pour cette introduction pratique à REST</p>
  582. </div>
  583. </div>
  584. <div class="comment" typeof="schema:UserComments">
  585. <p class="comment-meta">
  586. <span class="comment-author" property="schema:creator">mélanie</span> le <span class="comment-date" property="schema:commentTime">22/05/2010</span> :
  587. </p>
  588. <div class="comment-content" property="schema:commentText">
  589. <p>C&#39;est sympa l&#39;approche pour la compréhension de post et de rest.</p>
  590. <p>Comme quoi on peu apprendre en s&#39;amusant ;-)</p>
  591. </div>
  592. </div>
  593. <div class="comment" typeof="schema:UserComments">
  594. <p class="comment-meta">
  595. <span class="comment-author" property="schema:creator">Jérémy</span> le <span class="comment-date" property="schema:commentTime">08/09/2010</span> :
  596. </p>
  597. <div class="comment-content" property="schema:commentText">
  598. <p>Excellent, je m&#39;interressais justement à REST et je redécouvre internet ici. Merci beaucoup pour cette explication ds plus plaisante. ça donne envie de s&#39;y mettre.</p>
  599. </div>
  600. </div>
  601. <div class="comment" typeof="schema:UserComments">
  602. <p class="comment-meta">
  603. <span class="comment-author" property="schema:creator">Jeremy - Stratège Web</span> le <span class="comment-date" property="schema:commentTime">05/07/2011</span> :
  604. </p>
  605. <div class="comment-content" property="schema:commentText">
  606. <p>C&#39;est un peu dur à saisir mais je crois que ça fait lentement son chemin dans ma tête.</p>
  607. <p>Est-ce que tu penses qu&#39;une adoption unifiée du REST à travers le Web bénéficierait l&#39;arrivée du Web 3.0?</p>
  608. <p>Bien à toi,<br />Jérémy</p>
  609. </div>
  610. </div>
  611. <div class="comment" typeof="schema:UserComments">
  612. <p class="comment-meta">
  613. <span class="comment-author" property="schema:creator">Philippe</span> le <span class="comment-date" property="schema:commentTime">17/08/2011</span> :
  614. </p>
  615. <div class="comment-content" property="schema:commentText">
  616. <p>Merci pour ces infos, REST m&#39;interressait, mais je crois sincèrement que mon cerveau décroche ou que techniquement, j&#39;ai encore des progès à faire ...</p>
  617. </div>
  618. </div>
  619. <div class="comment" typeof="schema:UserComments">
  620. <p class="comment-meta">
  621. <span class="comment-author" property="schema:creator">Abuzz</span> le <span class="comment-date" property="schema:commentTime">05/10/2011</span> :
  622. </p>
  623. <div class="comment-content" property="schema:commentText">
  624. <p>Merci pour ces infos détaillées mais je trouyve çà trop compliqué .... ou alors c&#39;est moi qui ne suis plus :-(</p>
  625. </div>
  626. </div>
  627. <div class="comment" typeof="schema:UserComments">
  628. <p class="comment-meta">
  629. <span class="comment-author" property="schema:creator">Gerard</span> le <span class="comment-date" property="schema:commentTime">09/11/2011</span> :
  630. </p>
  631. <div class="comment-content" property="schema:commentText">
  632. <p>Article très intéressant, mais celle reste quand même complexe à comprendre pas si évident que ça.</p>
  633. </div>
  634. </div>
  635. <div class="comment" typeof="schema:UserComments">
  636. <p class="comment-meta">
  637. <span class="comment-author" property="schema:creator">kaouther</span> le <span class="comment-date" property="schema:commentTime">26/12/2011</span> :
  638. </p>
  639. <div class="comment-content" property="schema:commentText">
  640. <p>merci pour l&#39;article,<br />je suis entrain de chercher comment généraliser REST aux applications desktop (desktop disribué)en implémentant le modèle MVC <br />pouvez vous m&#39;aider?</p>
  641. </div>
  642. </div>
  643. <div class="comment" typeof="schema:UserComments">
  644. <p class="comment-meta">
  645. <span class="comment-author" property="schema:creator">Vincent François</span> le <span class="comment-date" property="schema:commentTime">09/01/2012</span> :
  646. </p>
  647. <div class="comment-content" property="schema:commentText">
  648. <p>Simple, efficace, merci !</p>
  649. </div>
  650. </div>
  651. </div>
  652. </section>
  653. <footer>
  654. <nav>
  655. <p>
  656. <small>
  657. Je réponds quasiment toujours aux <a href="m&#x61;ilto:d&#x61;vid%40l&#x61;rlet&#46;fr" title="Envoyer un email">emails</a> (<a href="/david/signature/" title="Ma signature actuelle avec possibilité de chiffrement">signés</a>) et vous pouvez me rencontrer à Montréal. <span class="more-infos">N’hésitez pas à <a href="/david/log/" title="Être tenu informé des mises à jour">vous abonner</a> pour être tenu informé des publications récentes.</span>
  658. </small>
  659. </p>
  660. </nav>
  661. </footer>
  662. </div>
  663. <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
  664. <script data-no-instant>InstantClick.init()</script>
  665. </body>
  666. </html>