Erlend HamnabergBigOne 13. april 2011Hypermedia
DisclaimerJeg antar at deltakerene har kjennskap til REST.Jeg kommer ikke til å forklare REST her.
Hvem er jeg?Konsulent Java / Tech1Laget Escenic sin REST-webserviceDespot for HTTPCache4j, en browsercache i JavaAktiv på #rest på irc.freenode.netNestleder i javaBin
AgendaHATEOASDefinisjon av HypermediaHypermediafaktorerTips og triks
«Hypertext As The Engine Of Application State»HATEOAS eller ‘The hypertext constraint’
RessurstilstandHva som er på serveren nå
ApplikasjonstilstandHvilket «skjermbilde» klienten er på nå.Et «skjermbilde» kan være oppbygd av mange ressurserHvilke oppgaver klienten kan gjøre basert på resultatet fra den foregående forespørslen.Hver interaksjon med serveren kan man si er en del av en tilstandsmaskin
Tilstandsmaskin – ordreVelgGodkjennBetalSendØnskelisteFritt fra REST in Practice - RESTBucks
Definisjon av hypermedia“The use of text, data, graphics, audio and video as elements of an extended hypertext system in which all elements are linked so that the user can move between them at will”(min utheving)
Hva betyr dette?To elementtyper:HypertekstData (herunder: tekst, data, grafikk, audio og video)
Hypertekst?I sin enkleste form en link (URI).
SpesifikasjonSpesifikasjonen til hypermediaformatet er abstrakt. Sammenhengen mellom et instansdokument + link-relasjoner er hva som utgjør applikasjoner.
Registrerte hypermedia typerHTMLATOMVOICE/XMLuri-listSMILturtleCSSSVG
Hva med JSON og XML?ikke hypermedia formatIkke RESTfullt, pga punktet overÅ gi application/json eller application/xml over HTTP er som å si: «Her har du en ting, men jeg kan ikke si hvordan den ser ut, eller hvordan du kan interaktere med den»
HypermediafaktorerLinkstøtte:Utgående linkerInline linkerMaler for søkestrengerIkke-idempotente oppdateringerIdempotente oppdateringer
Utgående linkerEksempel:HTML: <a href="http://example.com"...>...<a/>Atom: <link href="http://example.com" .../>Uri-list: består kun av utgående linker
Inline linkerHTML: <img src="http//img.example.com/123.jpg" .../>Atom: <content src="http//example.com/text.html"/>
Maler for søkestrengerHTML:Atom: Finnes ikke i standarden, kan lages som påbygg. (opensearch)
Ikke-idempotente oppdateringerHTML:Atom: Ikke i standarden, men i atompub
Idempotente oppdateringerHTML: må bruke Code-On-Demand (javascript)Atom: Ikke i standarden, men i atompub.
HypermediafaktorerKontrolldatastøtteKontrolldata for leseforespørslerKontrolldata for oppdateringsforespørslerKontrolldata for grensesnittsmetoderKontrolldata for linker
Kontrolldata for leseforespørslerHTML: Kan gjøres ved Code-On-Demand(JS)Atom: Finnes ikke.Xsl:include: <xsl:include href="http://www.example.org/newsfeed" accept="application/rss" />
Kontrolldata for oppdateringsforespørslerHTML:Atom: Atompub
Kontrolldata for grensesnittsmetoderHTML: method attributtet i <form>Atom: finnes ikke
Kontrolldata for linkerHTML:Atom:
HTMLStort sett det eneste man trengerKontekst til elementene gis via en profile attributt i <head>
Egne hypermedia formatDet er mulig.Gjør et godt forsøk på å utrykke deg i et eksisterende format.Lag et generelt format for domenet, om du ikke kan bruke et eksisterendeTenk på hypermediafaktorerene når du designerLa formatet du designer være protokolluavhenigig
Egne hypermedia formatTenk på utvidbarhet: feks XML namespacesLink-relasjoner bør være definert som URIerDet er fullt mulig å lage et JSON-basert hypermedia format.Men; man får veldig fort applikasjons lock-in.XML er enklere, pga namespacer som muliggjør gjenbruk av eksisterende formater.
Viktige ting å tenke påLa den private objektgrafen på server/klient forbli privatTenk heller foretningsregler/protokoller i stedet for serialisering. Hva kan man la være å eksponere?Versjonering? Du trenger det ikke med et godt designet hypermediaformatALDRI send application/xml eller application/json med mindre dette er et endepunkt.
Anbefalt lesestoffAtompub: http://tools.ietf.org/html/rfc5023H-Factors: http://amundsen.com/hypermedia/hfactor/Fielding’s REST: http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htmRegistrerte MIME-typer: http://www.iana.org/assignments/media-types/Registrerte Link-relasjoner:http://www.iana.org/assignments/link-relations/REST in Practice (bok)RESTful Web Services Cookbook (bok)
Andre ressurserhttp://amundsen.com/media-types/maze/format/ - forsøk på å designe et nytt hypermedia-format (ngarthl er meg)
Til sluttHypermedia workshop med Mike Amundsen: http://java.no/event/180Implementing RESTFul webapps med Mike Amundsen: http://java.no/event/177
Takk for meg

Hypermedia

Editor's Notes

  • #24 Støtte for å endre Accept-* headersDiskusjon:@type har blitt diskutert til det ugjenkjennelige på rest-discuss mailinglistenÅ bare bruke verdien av @type i «Accept» header kan føre til starvation problematikk osv.
  • #25 Support for modifying control data for update requests (e. g. Content-* headers).
  • #26 Support for indiciating the interface method for requests (e.g. HTTP GET,POST,PUT,DELETE methods).