{"id":126,"date":"2009-06-09T22:55:33","date_gmt":"2009-06-09T21:55:33","guid":{"rendered":"http:\/\/www.softwarearchitektur.de\/?p=126"},"modified":"2009-06-24T22:03:14","modified_gmt":"2009-06-24T21:03:14","slug":"rest-ein-architekturstil-und-kein-weiteres-protokoll","status":"publish","type":"post","link":"https:\/\/www.softwarearchitektur.de\/?p=126","title":{"rendered":"REST: ein Architekturstil und kein weiteres Protokoll"},"content":{"rendered":"<p>Ich war schon immer ein Freund davon, nicht alles selbst zu erfinden, sondern den Austausch mit anderen zu suchen und Best Practices anzunehmen. Um so mehr war ich erfreut, in der <a title=\"IT-Szene M\u00fcnchen\" href=\"http:\/\/www.it-szene.de\/\">IT-Szene M\u00fcnchen<\/a> eine Vortragsank\u00fcndigung der <a title=\"JBoss User Group M\u00fcnchen\" href=\"http:\/\/www.jbug-munich.org\/index.php\/home\" target=\"_blank\">JBoss User Group M\u00fcnchen<\/a> zum Thema &#8222;Java API for RestFul Web Services und RESTEasy&#8220; zu finden. REST wurde bei uns schon l\u00e4nger als m\u00f6gliche Schnittstelle f\u00fcr neue Clients diskutiert, ohne da\u00df ich eine Ahnung gehabt h\u00e4tte wie sich dieses &#8222;<em>Protokoll<\/em>&#8220; von den bisher verwendeten WebServices unterscheidet.<\/p>\n<p>Die wichtigste Erkenntnis vorneweg: REST ist kein weiteres Protokoll, um Clients anzubinden sondern ein eigener Architekturstil, der zu einem anderen Anwendungsentwurf f\u00fchrt. Die Referenten <a title=\"Stefan Tilkov\" href=\"http:\/\/www.innoq.com\/blog\/st\/\">Stefan Tilkov<\/a> und <a title=\"Serge Pagop\" href=\"http:\/\/www.innoq.com\/blog\/sp\/\">Serge Pagop<\/a> pr\u00e4sentierten zun\u00e4chst einmal die Konzepte von Rest, um dann anhand der Implementation von JBoss <a title=\"RESTeasy\" href=\"http:\/\/www.jboss.org\/resteasy\/\">RESTEasy<\/a> konkrete Implementierungsbeispiele zu geben. Der konzeptionelle \u00dcberblick war pr\u00e4gnant und unterhaltsam und hat mich \u00fcberzeugt, diesen Architekturstil mindestens prototypisch einzusetzen. Die Beispielsession h\u00e4tte meiner Meinung nach noch konkreter mit Edit-Compile-Run Zyklen durchgef\u00fchrt werden sollen.<\/p>\n<p>Bei einem WebService Modell werden die Objekte und ihre Zugriffsmethoden \u00fcber WSDL\/SOAP einem entfernten Klienten zur Verf\u00fcgung gestellt. Es existieren Tools, um auf Basis der WSDL-Beschreibung clientseitige Stubs zu generieren und dann in der pr\u00e4ferierten Programmiersprache auf die Ojekte im Server zuzugreifen. Es wird also das auf dem Server vorhandene Objektmodell mit den angebotenen spezifischen Operationen lokal im Client zugreifbar gemacht.<\/p>\n<p>Ganz anders bei REST. REST wurde von Roy Fielding in seiner Doktorarbeit definiert. REST kann man im wesentlichen durch die folgenden 5 Merkmale beschreiben:<\/p>\n<ol>\n<li>Jedes &#8222;Ding&#8220; bzw. jede Ressource hat eine ID<\/li>\n<li>Die Resourcen werden \u00fcber Links verkn\u00fcpft.<br \/>\nDer Server stellt dem Klienten die Verkn\u00fcpfungen zwischen verschiedenen Ressourcen als Links zur Verf\u00fcgung. Auch Status\u00fcberg\u00e4nge werden als Link repr\u00e4sentiert.<\/li>\n<li>Es gibt standardisierte Methoden f\u00fcr alle Ressourcen\n<ul>\n<li> Get<\/li>\n<li>Put<\/li>\n<li>Post<\/li>\n<li>Delete (und einige wenige andere)<\/li>\n<\/ul>\n<\/li>\n<li>Jede Ressource kann verschiedene Repr\u00e4sentationen haben<br \/>\nEs ist also m\u00f6glich f\u00fcr verschieden Arten von Klienten unterschiedliche Repr\u00e4sentationen nach au\u00dfen zu geben: beispielsweise eine PDF-Repr\u00e4sentation zum Drucken einer Rechnung und eine XML-Repr\u00e4sentation zum Weiterleten der Teileliste an den Empf\u00e4nger. Die ben\u00f6tigte Repr\u00e4sentation wird zwischen Sender und Empf\u00e4nger ausgehandelt. Selbst verschieden Versionen einer Ressource-Repr\u00e4sentation k\u00f6nnen \u00fcber diesen Mechanismus nach au\u00dfen gegeben werden.<\/li>\n<li>statuslose Kommunikation<br \/>\nEine Grundannahme ist, da\u00df der Server keine Information \u00fcber den Status des Klienten h\u00e4lt. Der Status eines Serverobjektes kann bzw. mu\u00df jederzeit wieder abgerufen werden k\u00f6nnen. Was der Klient jedoch damit macht, ob er eine URI bereits gelesen hat, ist Sache des Klienten und nicht des Servers. Es\u00a0 gibt somit einen Ressourcenstatus, der im Server gespeichert wird, und einen Klientenstatus, den der Klient selbst speicher mu\u00df. Durch dieses Design kann der Server wesentlich besser skalieren.<\/li>\n<\/ol>\n<p>Durch dieses einfache Modell,das in der HTTP Spezifikation festgelegt ist, k\u00f6nnen einheitliche und jedem bekannte Mechanismen f\u00fcr den Zugriff genutzt werden.Au\u00dferdem sind auch Fehlermeldungen mit einer festen Bedeutung vordefiniert und es ist m\u00f6glich, f\u00fcr HTTP vorgesehene Cache- und Load-Balancing Mechanismen auch f\u00fcr den Zugriff auf den eigenen Backend-Server einzusetzen. Nicht zuletzt erlaubt es REST, den KLienten in jeder beliebigen Programmiersprache zu erstellen, f\u00fcr die eine HTTP-Client Bibliothek zur Verf\u00fcgung steht.<\/p>\n<p>Die REST Schnittstellen werden \u00fcber Annotationen an bestehende Java Beans hinzugef\u00fcgt.Die Annotationen beschreiben im wesentlichen den Pfad (die URI) einer Ressource und wie die \u00f6ffentlichen Methoden mit auf Methoden der Objekte im Server und auf die Parameter dieser Methoden abbgebildet werden. Es bietet sich an, die Annotationen nicht in dem POJO selbst hinzuzuf\u00fcgen, sondern eine Ressourcenfassade einzuf\u00fchren.<\/p>\n<p>Stefan Tilkov pr\u00e4sentierte noch einen Ausflug zum Thema &#8222;<em>asynchronous response handling<\/em>&#8222;um aufzuzeigen, wie man in REST l\u00e4nger laufende Operationen oder Transaktionen modelliert. Auch hier hilft der HTTP Standard weiter: es gibt eine spezifische Antwort &#8222;202 accepted&#8220; die in einem solchen Fall zur\u00fcckgegeben werden sollte. Sie zeigt an, da\u00df die Bearbetung nicht abgeschlossen ist.Eine vom Klienten angegebene &#8222;Return URL&#8220; k\u00f6nnte vom Server aufgerufen werden, um sein Ergebnis zu posten.<\/p>\n<p>Die Entscheidung f\u00fcr REST \u00e4ndert definitiv die Architektur von Klient und Server, da nicht einfach das vorhandene Objektmodell \u00fcber ein weiteres Protokoll zur Verf\u00fcgung gestellt wird.Die wesentlichen Vorteile von REST sind, da\u00df der Server einfach \u00fcber einen Browser getestet werden kann und da\u00df es einfach aus dynamischen Sprachen wie Ruby, JavaScript oder Python\u00a0 genutzt werden kann.<\/p>\n<h3>Links<\/h3>\n<ol>\n<li>Fielding, Roy Thomas: <a title=\"Architectural Styles and the Design of Network-based Software Architectures\" href=\"http:\/\/www.ics.uci.edu\/~fielding\/pubs\/dissertation\/top.htm\">Architectural Styles and the Design of Network-based Software Architectures<\/a>. Doctoral dissertation, University of California, Irvine, 2000<\/li>\n<li>Tilkov, Stefan:<a title=\"A Brief Introduction to REST\" href=\"http:\/\/www.infoq.com\/articles\/rest-introduction\">A Brief Introduction to REST<\/a> . Online publication, Dec 10, 2007<\/li>\n<li><a title=\"RESTEasy @ JBoss\" href=\"http:\/\/www.jboss.org\/resteasy\/\" target=\"_blank\">RESTEasy<\/a>, Online publication<\/li>\n<li><a title=\"Jersey\" href=\"https:\/\/jersey.dev.java.net\/\" target=\"_blank\">Jersey<\/a>, Online publication<\/li>\n<li><a href=\"http:\/\/www.ibm.com\/developerworks\/webservices\/library\/ws-version\/\" target=\"_blank\">Best practices for Web services versioning<\/a>, Online publication<br \/>\nKyle Brown, Michael Ellis, IBM January 30, 2004<\/li>\n<li><a title=\"The REST Statelessness Constraint\" href=\"http:\/\/soundadvice.id.au\/blog\/\" target=\"_blank\">The REST Statelessness Constraint<\/a>, Online Publication, Sat, 2009-Jun-13<\/li>\n<\/ol>\n<div id=\"_mcePaste\" style=\"overflow: hidden; position: absolute; left: -10000px; top: 1199px; width: 1px; height: 1px;\">\n<h1>Best practices for Web services versioning<\/h1>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ich war schon immer ein Freund davon, nicht alles selbst zu erfinden, sondern den Austausch mit anderen zu suchen und Best Practices anzunehmen. Um so mehr war ich erfreut, in der IT-Szene M\u00fcnchen eine Vortragsank\u00fcndigung der JBoss User Group M\u00fcnchen zum Thema &#8222;Java API for RestFul Web Services und RESTEasy&#8220; zu finden. REST wurde bei [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0},"categories":[12],"tags":[327,328,326],"_links":{"self":[{"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/posts\/126"}],"collection":[{"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=126"}],"version-history":[{"count":29,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/posts\/126\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=\/wp\/v2\/posts\/126\/revisions\/165"}],"wp:attachment":[{"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.softwarearchitektur.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}