REST teori og praksis; REST in theory and practice

738 views

Published on

A presentation about REST and how it can be applied to a few common problems.

Held at javaBin sørlandet jan. 11th 2012

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
738
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • Hvor mange tror dette?\nDet stemmer ikke. REST er ikke det samme som HTTP, men det er vanlig å bruke HTTP for å oppnå en RESTful arktitektur. Jeg kommer til å bruke HTTP som hovedbestanddel i denne presentasjonen.\n
  • Hvor mange tror dette?\nDet stemmer ikke. REST er ikke det samme som HTTP, men det er vanlig å bruke HTTP for å oppnå en RESTful arktitektur. Jeg kommer til å bruke HTTP som hovedbestanddel i denne presentasjonen.\n
  • \n
  • Først litt historikk: Dr. Roy Fielding var en av de som var med å utvikle HTTP, og i denne prosessen skrev han også doktoravhandlingen sin om arkitektoniske stiler. \n
  • Denne ble utgitt i 2000. Han beskriver arkitektoniske stiler som et sett med begrensninger for å oppnå visse kvaliteter eller egenskaper i en konkret arkitektur. REST er eksempelet i dette doktoravhandlingen. For en doktoravhandling er den forbausende lettlest, og jeg anbefaler alle å gjøre dette. Linken til denne vil stå på slutten av teoridelen. Det er med andre ord mulig å kunne bruke denne doktoravhandlingen til mye mer enn bare for REST som eksempelform. Det er mye fornuftig skrevet her.\n
  • Den viktigste designoperasjonen i en restful arkitektur er design av dataformater, eller hypermedia formater. Jeg kommer tilbake til dette litt senere. Et av målene til REST er å frikoble data mer fra serveren / klienten, og heller la alle ting bli oppdaget ved hjelp av hypertekst.\n
  • Denne begrensningen er relativt selvforklarende. REST er Request/response basert. Hovedforskjellen i forhold til en RPC basert akritektur, er at serveren har mye mer makt i forholdet her. Dette gjelder blant annet statelessness i kommunikasjon, noe som vi skal komme tilbake til senere. Klientene har et mye større ansvar i å holde på kontekst i forhold til det de er ute etter på serveren. Klienten må vite hvorfor den gjør de valgene som trengs. Kontekst er utrolig viktig.\n
  • Det unforme interfacet er bygget opp i flere deler, jeg vil gå igjennom de hver for seg.\n
  • Roy Fielding satt også i komiteen som definerte URI\nURI er et superset av URL og URN Eksempler følger på neste slide.\n\nRessurser er alle ting som kan modelleres. Feks en Bil, en aktikkel, en annonse, en event osv. Det er viktig å tenke på ressurser som substantiv, men der er unntak der også... en ressurs kan ha flere urier.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • En representasjon er alt som blir servert i bodyen til en melding.\n
  • HTML. Rendert. <click> Eller amazon kunne vel sett slik ut? ehm, kanskje ikke helt, men dere ser poenget.\n
  • HTML. Rendert. <click> Eller amazon kunne vel sett slik ut? ehm, kanskje ikke helt, men dere ser poenget.\n
  • Dette er et Atom feed som dere sikkert ser.\n
  • Dette er et format som heter collection+json, jeg kommer tilbake til dette senere.\n
  • Dette betyr at meldingen inneholder alle ting som skal gjøre den forståelig for en klient. \n\nSelf-descriptive betyr metadata + data. Man skal kunne inspisere headerene og forstå hvordan kroppen på meldingen skal prosesseres basert på headeren + status kode i HTTP. Content-Type headeren betyr hva innholdet er. \nAkkurat dette er en litt vanskelig bit av REST. Det har med noe som man kaller ‘visiblitity’ eller synlighet. Om man bruker et standardformat, kan man lettere utnytte nettverksinfrastruktur som forstår disse formatene. Feks om man bruker HTML kan google webaccelerator gjøre dns oppslag på forhånd osv.\n\nMark Nottingham sier det ganske bra: “I want to follow my nose when consuming an API”. Dette betyr at dokumentasjonen må være lett tilgjengelig, gjerne linket til i meldingen.\n\nDersom man serverer noe som er for generisk, feks application/json eller application/xml er ikke meldingen lenger self-descriptive, og systemet kan ikke gjøre noe med meldingen uten out-of-band informasjon. Dette øker koblingen mellom klient og tjener, og er en av de tingene som REST prøver å unngå. Koblingen blir bibliotekstyrt i forhold til nettverksstyrt, dette er uheldig\n
  • Hver request skal inneholde alt som skal til for å kunne tilfredstille serveren. Dette betyr at serveren ikke skal ha noen form for “midlertidig” informasjon om hvilke klienter som er koblet til.\nAuthentication og slikt er et eget kapittel, som jeg skal prøve å få behandlet i den praktiske biten.\n
  • Dette er en av de viktigste og mest misforståtte bitene av REST, og det krever nesten et eget foredrag. Hovedsaklig betyr det at man bruker hypertekst les; linker, skjemaer mm., for å kunne gjøre valg som man fikk i den forrige responsen fra serveren. Et “skjermbilde” på en klient kan være bygd opp av MANGE ressurser. Hvordan klienten velger å vise frem ting er out-of-scope for serveren sin del. Serveren sin interaksjon slutter når den har levert fra seg responsen.\n
  • Dette er en av de viktigste og mest misforståtte bitene av REST, og det krever nesten et eget foredrag. Hovedsaklig betyr det at man bruker hypertekst les; linker, skjemaer mm., for å kunne gjøre valg som man fikk i den forrige responsen fra serveren. Et “skjermbilde” på en klient kan være bygd opp av MANGE ressurser. Hvordan klienten velger å vise frem ting er out-of-scope for serveren sin del. Serveren sin interaksjon slutter når den har levert fra seg responsen.\n
  • Dette er en av de viktigste og mest misforståtte bitene av REST, og det krever nesten et eget foredrag. Hovedsaklig betyr det at man bruker hypertekst les; linker, skjemaer mm., for å kunne gjøre valg som man fikk i den forrige responsen fra serveren. Et “skjermbilde” på en klient kan være bygd opp av MANGE ressurser. Hvordan klienten velger å vise frem ting er out-of-scope for serveren sin del. Serveren sin interaksjon slutter når den har levert fra seg responsen.\n
  • Dette er en av de viktigste og mest misforståtte bitene av REST, og det krever nesten et eget foredrag. Hovedsaklig betyr det at man bruker hypertekst les; linker, skjemaer mm., for å kunne gjøre valg som man fikk i den forrige responsen fra serveren. Et “skjermbilde” på en klient kan være bygd opp av MANGE ressurser. Hvordan klienten velger å vise frem ting er out-of-scope for serveren sin del. Serveren sin interaksjon slutter når den har levert fra seg responsen.\n
  • Dette er en av de viktigste og mest misforståtte bitene av REST, og det krever nesten et eget foredrag. Hovedsaklig betyr det at man bruker hypertekst les; linker, skjemaer mm., for å kunne gjøre valg som man fikk i den forrige responsen fra serveren. Et “skjermbilde” på en klient kan være bygd opp av MANGE ressurser. Hvordan klienten velger å vise frem ting er out-of-scope for serveren sin del. Serveren sin interaksjon slutter når den har levert fra seg responsen.\n
  • Dette betyr at arkitekturen skal være slik at man kan sette noe man kaller en “intermediary” på forskjellige deler i nettverket, slik at man feks kan redusere latens, feks med caching (kommer tilbake til det), DNS pre-lookup, Bildeskalering osv.\n
  • Dette er annen viktig bit av REST. Hver klient som bruker REST bør ha en form for klientcaching. Dette for å unngå å måtte gå til serveren med hver eneste request. Serveren skal sende metadata som forteller hver komponent i nettverket om hvor lenge de kan cache den gjeldende responsen.\n
  • Dette er typisk javascript. Dette er for å kunne servere generiske hypermedia formater, som kan igjen få ny funksjonalitet.\nMan kan i teorien også gi andre scriptspråk basert på hvilken klienttype man er; feks python script til python klienter, eller scalascript til Scala klienter. Dette er dog ikke mulig i dagens HTTP, da det mangler content negotiation på “embedded ressurser”. Det er, dog, en interessant tanke.\n
  • \n
  • \n
  • \n
  • \n
  • Dette er noen faktorer utviklet av Mike Amundsen, som har skrevet boken som jeg loddet ut i sta.\n
  • \n
  • \n
  • Det er også mulig å bruke REST med andre protokoller, men dette er den mest vanlige kombinasjonen. Hypermedia MÅ man ha for å kunne kalle det REST.\n
  • \n
  • \n
  • Vi skal lage et system som er et register over Events, sesjoner, og kontakter. En Event har en dato, og navn. En session har et abstract + noe metadata. En kontakt er en person av et slag. En sesjon kan ha flere speakers, som er en “embedded” kontakt. Dersom det er noen javaBin folk her, så vet de kanskje hvilket system det er :)\n
  • Dette er et forsøk på å vise sammenhengen mellom entitetene.\n
  • Disse ressursene og navnene er viktige for en utvikler som skal implementere serveren. En klient skal aldri vite hvordan disse urlene skal konstrueres, med mindre man har blitt fortalt det av serveren (URL Templating). Der er flere også, som kan kalles skjulte ressurser, men vi kommer tilbake til de etterhvert.\n
  • Her finnes det veldig mange muligheter; Noen er mer restfulle enn andre. Jeg vil gå igjennom et utvalg her.\n
  • Denne er jo ganske straight forward. Man skriver javaobjektene direkte til outputstream. Noen som kan fortelle meg hva som ikke er bra med dette? SerialVersionUUID +++ Det gjør det veldig vanskelig å vedlikeholde server og klient på forskjellige stadier, det gir kobling, noe som REST prøver å unngå. Hvilke av H-Factorene finnes i serialiserte javaobjekter? Ingen. I den første versjonen av EMS som vi lagde gjorde vi nettopp dette; Dette førte til at vi måtte fikse klientene hver gang vi la til et nytt felt i domenemodellen. Dette skalerer åpenbart ikke når man får flere klienter, og sannsynligvis har man ikke kontroll på de heller.\n
  • Vi kan feks bruke JAXB eller XStream og serialisere domenemodellen vår direkte? Hva gir dette oss? Hvordan er det med veldikeholdbarhet? Mange inkluderer <atom:link> i xml outputen, dette gjør det litt bedre, men dersom dette fortsatt blir servert som application/xml så kan jeg ikke ta noen beslutninger på dette.\n
  • \n
  • En direkteserialisering til JSON er også mulig; Hvilke HFaktorer innehoder JSON? Ingen. Hvordan kan vi da oppdage de operasjonene som er mulig å gjøre? vi kan ikke det uten sterk kjennskap til hvordan serveren serialiserer objektene. Dette er greit når man har full kontroll mellom server/klient, ikke så greit når man skalerer over det.\n
  • \n
  • Dette er en farbar vei. Nå kan vi bestemme nøyaktig hvordan dataformatet skal lages. Dette har jeg gjort flere ganger, og kan godt være en løsning når man ikke finner noe som passer til det man skal gjøre. Lager man et eget format kan det hjelpe konsumenter, om man registrerer det med IANA (The internet assigned numbers authority).\n
  • \n
  • \n
  • Dette er en ny mediatype laget av Mike Amundsen, som også jeg har hjulpet til med å lage. Den ligner litt på Atom i forhold til det meste er modellert i kontekst av collections + items. Denne har flere av HFaktorene, som blant annet er Templated queries, Embedded links, outgoing links og idempotent updates.\n
  • \n
  • Dette er en ganske vanlig måte å kunne utrykke hypermedia. Her finnes flere av HFaktorene, noe som man kan se utfra siden til Mike. Atom er bygget for å være extensible, så man kan gjøre mye med formatet dersom det ikke passer helt.\n
  • \n
  • Man kan også bruke HTML for også å utrykke data. Se gjerne referansene på slutten av presentasjonen for å finne noen eksempler på dette.\n
  • Hvordan gjør jeg ting med det jeg får tilbake? Hvordan vet jeg hvor jeg skal POSTe en ny sesjon? hvordan oppdaterer jeg?\n\nI Hovedsak håper jeg at jeg har vist hvordan dette gjøres ved at man ser på Hfaktorene for det gitte formatet man har.\n\nMan må også dokumentere hvordan man gjør operasjoner, feks hvilke relasjonstyper som er tilgjengelige og hva disse betyr. Helst bør man bruke de som allerede er registrert, link vil være i referansene. Eller om mediaformatet har et eget register, bør man bruke det.\n
  • Bruker man AtomPub så har man mulighet til å gjøre det man gjøre en HTTP POST til den ressursen som er designert collection ressursen.\n\nI collection+json kan man bruke template som følger med en collection ressurs til å lage en ny.\n\nI HTML fyller man inn et skjema.\n
  • Fører til en HTTP PUT de fleste tilfeller\n\nI Atom: PUT av ressursen som er markert som “edit”.\n\nI Collection+json: Transformer “data” til en template og PUT den tilbake\n\nI HTML: Enten code-on-demand for PUT støtte, eller et annet skjema med HTTP POST\n\nStatuskoder er typisk: 204 No Content eller 200 OK med full body og en Content-Location med samme href. Dette gjør man for at cacher skal oppføre seg korrekt.\n
  • Dette er en interessant greie:\n * Man kan gjøre dete ved HTTP PUT til en sub-resource av den tingen man oppdaterer. Dette er et problem for caching, pga en vet ikke hvilke ressurser som skal invalideres. Kan løses ved kort cache-tid + validering eller ved at man bruker cache-channels.\n\n* Man kan bruke HTTP Patch.\nMan kan detektere at en ressurs støtter partial updates ved at man ser på “Accept-Patch:” conneg headeren. Dersom denne finnes, så kan systemet gjøre partial updates. Jeg vet desverre ikke om noen mediatyper som i dag støtter partial-updates.\n
  • HTTP DELETE støtte finnes ikke i alle formater\n\nI Atom vil det være det samme som for PUT. HTTP DELETE for ressursen som er markert som “edit”.\n\nI Collection+json, HTTP DELETE til “href” i en Item\n\nI HTML: her må man bruke HTTP POST i en form, eller HTTP DELETE via code-on-demand\n\nStatuskoder er viktige. Man kan få tilbake 204 No Content på første, eller 404 om den ikke finnes. Man kan også få 410 GONE om man allerede har slettet.\n
  • Søk er en interessant greie, der finnes noen kandidater her også:\n\n - Opensearch + Atom|RSS2.0\n - HTML get forms + HTML resultat\n - Collection+JSON Querys\n
  • Når en sesjon er godkjent av programkomiteen skal denne publiseres.\nDette kan man gjøre ved enten:\n * Partial update på published.\n * Lagre sesjonen på nytt med “published” flagget satt.\n * en egen publiseringstjeneste:\n ** en eller flere URLer som skal publiseres.\n *** POST en text/url-list med alle som skal publiseres\n *** denne tjenesten må oppdages. feks via en link med rel=”publish”\n ** HTML form med et enkelt tekstarea hvor man fyller inn en linje pr url.\n\n
  • Så var det denne. Her finnes det ganske mange forskjellige løsninger. De fleste er ganske greie å ha med å gjøre.\n
  • Dette er iogforseg greit nok. Problemet er her at man sender passordet over tråden noe som aldri er bra.\n
  • Dette er mye sikrere enn HTTP basic.\n
  • Her har man forskjellige protokoller:\nDe største er:\n * OAuth\n * OpenID\n
  • En veldig spennende spec som utvikles av W3C for øyeblikket.\nBasert på PKI og RDF; Les FOAF (friend of a friend)\n
  • En interessant spec fra Mozilla labs.\n
  • En ganske interessant greie som Google har laget. Krever Google konto + SSL\n
  • Dette er det veldig mange som gjør. Det er desverre de skjelden bygger på WWW-Authenticate med venner. Prøv å unngå dette.\n
  • Et sitat hentet fra http-auth mailinglisten. Jeg har en mistanke om at det er en spøk ;)\n
  • Går typisk under “roll-your-own”. Det er dog efforts fra IETF for å fikse opp i dette. Det går kanskje an å lære noe fra \n
  • \n
  • \n
  • REST teori og praksis; REST in theory and practice

    1. 1. REST teori og praksis Erlend Hamnaberg javaBin styreleder @hamnis 1
    2. 2. HTTP == REST 2
    3. 3. HTTP != REST 2
    4. 4. Powered by RESThttp://www.flickr.com/photos/dullhunk/3930915541 3
    5. 5. History 4
    6. 6. Architectural Styles and the Design of Network-based Software Architectures 5
    7. 7. Elevates Data to a first- class architectural element 6
    8. 8. Client / Server 7
    9. 9. Uniform Interface 8
    10. 10. Identifying resources using URIs 9
    11. 11. 10
    12. 12. ftp://example.com/tmp/bar file:///tmp/barhttp://example.com/baz urn:id:123 10
    13. 13. Resource 11
    14. 14. Resource 11
    15. 15. Resourcehttp://www.flickr.com/photos/dalee/908535267/ 11
    16. 16. Resourcehttp://www.flickr.com/photos/dalee/908535267/ 11
    17. 17. Resourcehttp://www.flickr.com/photos/dalee/908535267/ http://www.flickr.com/photos/foolstopzanet/151936713/ 11
    18. 18. Resourcehttp://www.flickr.com/photos/dalee/908535267/ http://www.flickr.com/photos/foolstopzanet/151936713/ 11
    19. 19. manipulation ofresources through representations 12
    20. 20. Representation 13
    21. 21. Representation 13
    22. 22. Representation 13
    23. 23. Representation<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"> <title>Example Feed</title> <subtitle>A subtitle.</subtitle> <link href="http://example.org/feed/" rel="self" /> <link href="http://example.org/" /> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <updated>2003-12-13T18:30:02Z</updated> <author> <name>John Doe</name> <email>johndoe@example.com</email> </author> <entry> <title>Atom-Powered Robots Run Amok</title> <link href="http://example.org/2003/12/13/atom03" /> <link rel="alternate" type="text/html" href="http://example.org/2003/12/13/atom03.html"/> <link rel="edit" href="http://example.org/2003/12/13/atom03/edit"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary> </entry></feed> 14
    24. 24. Representation{ "collection" : { "version" : "1.0", "href" : "http://example.org/friends/", "links" : [ {"rel" : "feed", "href" : "http://example.org/friends/rss"}, {"rel" : "queries", "href" : "http://example.org/friends/?queries"}, {"rel" : "template", "href" : "http://example.org/friends/?template"} ], "items" : [ { "href" : "http://example.org/friends/jdoe", "data" : [ {"name" : "full-name", "value" : "J. Doe", "prompt" : "Full Name"}, {"name" : "email", "value" : "jdoe@example.org", "prompt" : "Email"} ], "links" : [ {"rel" : "blog", "href" : "http://examples.org/blogs/jdoe", "prompt" : "Blog"}, {"rel" : "avatar", "href" : "http://examples.org/images/jdoe", "prompt" : "Avatar", "render" : "image"} ] } ] }} 15
    25. 25. self-descriptive messages 16
    26. 26. Stateless protocol 17
    27. 27. 18
    28. 28. HATEOAS 18
    29. 29. Hypertext as theengine of appliation state 18
    30. 30. The hypertext constraint 18
    31. 31. Layered System 19
    32. 32. Caching 20
    33. 33. Code on demand Optional 21
    34. 34. “The World Wide Web [...](the Web) is a system ofinterlinked hypertext documents accessed via the Internet. With a web browser, one can view web pages that may contain text, images, videos, and other multimedia and navigate between them via hyperlinks. http://en.wikipedia.org/wiki/World_Wide_Web 22
    35. 35. text, images, videos, and othermultimedia and navigate between them via hyperlinks my emphasis 23
    36. 36. Hypermedia 23
    37. 37. Hypermedia factors 24
    38. 38. 25
    39. 39. 26
    40. 40. REST == HTTP + Hypermedia 27
    41. 41. Referenceshttp://www.ics.uci.edu/~fielding/pubs/dissertation/top.htmhttp://amundsen.com/hypermedia/hfactor/ 28
    42. 42. Casehttp://github.com/javabin/ems-redux 30
    43. 43. Event 1 * * 1Attachment Session 1 1 * speaker 1 * 1 1 Contact 1 31
    44. 44. Translated to resources• /events• /events/{id}• /events/{id}/sessions• /events/{eid}/sessions/{sid}• /binary/{id}• /contact/{id} 32
    45. 45. Serialization 33
    46. 46. Serialized Java objects 34
    47. 47. POX ( Plain Old XML) 35
    48. 48. <session> <title>REST in theory and practice</title> <body>....</body> ...</session 36
    49. 49. JSON 37
    50. 50. "session" : { "title" : "REST in theory and practice", "body" : "..." ...} 38
    51. 51. YAM™ 39
    52. 52. YAM™Yet Another Mediatype 39
    53. 53. <session href="/session/2"> <title>REST in theory and practice</title> <body>....</body> ... <link href="/publish" type="text/uri-list" rel="publish"/> <link href="/session/2" type="application/vnd.jb.session"rel="edit"/></session 40
    54. 54. "session" : { "href" : "/session/2" "title" : "REST in theory and practice", "body" : "..." ... "_meta" : { "_links" : [ {"href" : "/session/2", "type" : "application/vnd.jb.session", "rel": "edit"} ] }} 41
    55. 55. collection+json 42
    56. 56. "collection" { "version" : "1.0", "href" : "/session/2", "items" : { "href" : "/session/2" "data" : [ {"name" : "title", "value" : "REST in theory and practice"}, {"name" : "body", "value" : "..."} ] }, "template" : { "data" : [ {"name" : "title", "value" : "REST in theory and practice"}, {"name" : "body", "value" : "..."} ] }} 43
    57. 57. Atom 44
    58. 58. <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xml:base=”http://api.java.no/> <title>REST in theory and practice</title> <link href="session/2" /> <link rel="alternate" type="text/html" href="session/2.html"/> <link rel="edit" href="session/2"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary> <author> <name>John Doe</name> <email>johndoe@example.com</email> </author> </entry> 45
    59. 59. HTML 46
    60. 60. Operations 47
    61. 61. Creating a new session 48
    62. 62. Updating a session 49
    63. 63. Partial updates? 50
    64. 64. Deleting a session 51
    65. 65. Searching 52
    66. 66. Publish a session 53
    67. 67. Authentication 54
    68. 68. SSL + Basic 55
    69. 69. SSL + Digest 56
    70. 70. Three legged auth. 57
    71. 71. WebID 58
    72. 72. BrowserID 59
    73. 73. Google ClientLogin 60
    74. 74. Roll-your-own™ 61
    75. 75. “[...]Any method that hands over the password (or apassword-equivalent like a password in hashed form) ascurrent browsers do should be banned outright, andanyone who implements hand-over-the-password shouldkilled and eaten to prevent them from passing on thegenes[...]“ -- Peter Gutmann 62
    76. 76. API-nøkler 63
    77. 77. References• http://tools.ietf.org/html/rfc4287• http://www.amundsen.com/media-types/collection/• http://www.ics.uci.edu/~fielding/pubs/dissertation/ top.htm• http://amundsen.com/hypermedia/hfactor/• http://tools.ietf.org/html/rfc5023• http://www.w3.org/wiki/WebID• 64
    78. 78. References• RESTful webservices cookbook (Subbu et al.)• REST in Practice (Webber et al.)• Building hypermedia APIs with HTML 5 and Node JS (Amundsen) 65

    ×