nicht HTTP-basierte Authentication • Aufzurufende Operation ("getdetail") steckt im Request Body • Nichts ist out of the Box cachebar • Alles geht durch einen Endpoint (z.B. /api/talks für Talks)
auf Resources aus • Die Operation ist implizit und nicht Teil der URL • Ein Hypermedia Format repräsentiert die Daten • Link relations dienen zur Navigation durch einen Service UNIFORM INTERFACE
• http://www.acme.com/products/1234/photos/?sort=latest • http://www.acme.com/products/1234/photos/5678 Liste von Produkten Filtern über Query Einzelnes Produkt Fotos dazu
idempotent) • POST (unsafe, nicht idempotent) • PUT & DELETE (unsafe, idempotent) • HTTP Status Codes als Signal für Ergebnis einer Operation • z.B. HTTP/1.1 409 Conflict
http://api.twitter.com/1/statuses/destroy/12345.json • GET http://api.twitter.com/1/statuses/retweets/12345.json • PUT http://api.twitter.com/1/statuses/retweet/12345.json Erlaubt keinen Accept Header Wieso ein PUT? Wieso verschiedene? Zum Auth’d User! “DELETE destroy”, oda was krass?
neuen Tweet zu erzeugen • http://twitter.com/username/statuses/12345 • DELETE löscht (PUT könnte man für Änderungen nutzen) • http://twitter.com/username/statuses/12345/retweets/ • POST erzeugt einen neuen Retweet
Representations sind konzeptuell davon lösgelöst! • Manipulation mittels Representations (die ja vollständig sind) • Self-Descriptive Messages (mit allen nötigen Informationen) • Hypermedia As The Engine Of Application State ("HATEOAS") ohne HATEOAS ist es kein REST
Links, um Operationen/Locations zu entdecken • Per Link Relations werden die möglichen Optionen gefunden • Clients müssen URLs nicht vorher kennen und generieren • Der Workflow einer Anwendung wird flexibel • Der Hypermedia-Typ kann bei Bedarf versioniert werden • Änderungen am Server führen nicht mehr zu kaputten Clients
Content-‐Type: application/vnd.come.acme.shop+xml; charset=utf-‐8 Allow: GET, PUT, DELETE <?xml version="1.0" encoding="utf-‐8"?> <product xmlns="urn:com.acme.prods" xmlns:atom="http://www.w3.org/2005/Atom"> <id>1234</id> <name>Red Stapler</name> <price currency="EUR">3.14</price> <atom:link rel="payment" type="application/vnd.com.acme.shop+xml" href="http://acme.com/products/1234/payment"/> </product> Link-Elemente sind von Atom recyclen Bedeutung definiert in der IANA Link Relations Liste EIN EIGENER MEDIA TYPE Hilfestellung für Clients
Type • Sollte ein spezieller sein, und dieser sollte auch in einem “type” Attribut auf jedem Element vermerkt werden • Sollte XML-Namespaces für das Wurzelelement vergeben, für jeden Typen einen anderen (z.B. “urn:com.lovefilm.api.item”, “urn:com.lovefilm.api.searchresult” und so weiter) • Damit kann Client-Code leicht den Dokumenttyp erkennen
“avatar” sind nicht in der IANA registry (http://www.iana.org/assignments/link-relations) gelistet • Risiko von Kollisionen oder Mehrdeutigkeiten; statt dessen sind Identifier wie “http://rels.huddle.net/thumb” besser • Alle Elemente in einem riesen XML-Schema und Namespace • Clients können Dokumenttyp nicht am Root-Tag erkennen • Ein großes Schema ist meist schwieriger zu erweitern
oder Funktionen brechen nicht BC • Leicht zu lernen: man kann den Service “ersurfen” • Leicht zu skalieren: wächst gut mit der Anzahl Clients, Server und Funktionen • Leicht umzusetzen: einfach auf HTTP aufsetzen, fertig! • Authentication & TLS • Caching & Load Balancing • Conditional Requests • Content Negotiation
detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at short-term design, and usually awful at long-term design." Roy Fielding
over time, which is only measurable on the scale of years. Most developers simply don't care what happens to their product years after it is deployed, or at least they expect to be around to rewrite it when such change occurs." Roy Fielding
Wife http://tomayko.com/writings/rest-to-my-wife • Jim Webber, Savas Parastatidis & Ian Robinson How to GET a Cup of Coffee http://www.infoq.com/articles/webber-rest-workflow • Roy Thomas Fielding Architectural Styles and the Design of Network-based Software Architectures http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
Practice ISBN: 978-0596805821 • Subbu Allamaraju RESTful Web Services Cookbook ISBN: 978-0596801687 • Leonard Richardson, Sam Ruby RESTful Web Services ISBN: 978-0596529260