REST - Hyper Media klienter med Ramone

57
Jørn Wildt, cBrain REST - Hyper media klienter med Ramone

Transcript of REST - Hyper Media klienter med Ramone

Page 1: REST - Hyper Media klienter med Ramone

Jørn Wildt, cBrain

REST - Hyper media

klienter med Ramone

Page 2: REST - Hyper Media klienter med Ramone

Mig?

Jørn Wildt (1970)

Softwareudvikler siden 1985

Open Source udvikler siden 1994 Unix Commander (studietid)

BuDDy (Phd.)

Zikula CMS, tidl. PostNuke (2004 – 2009)

Ramone (2011 - ????)

Ansat hos cBrain (2004 - ...)

Far til Erik (4½ år) og Line (½ år)

Andet – klatring, løb, havkajak, skiløb

Page 3: REST - Hyper Media klienter med Ramone

REST – Et løfte om …

Skalérbarhed

God performance

Fleksibilitet

Løst koblede servere og klienter

Page 4: REST - Hyper Media klienter med Ramone

Ramone – en REST/HTTP

klient

Nyt projekt – startet 2011

Open Source

https://github.com/JornWildt/Ramone

Mere om det senere …

Page 5: REST - Hyper Media klienter med Ramone

Fra WEB Browser til REST

API Tim Bernes-Lee 1990

World Wide Web (HTTP 0.9)

Roy T. Fielding mf. 1997

HTTP 1.1

Roy T. Fielding 2000 (PhD. Afhandling)

REST - REpresentational State Transfer

Fra SOAP til REST 20XX

RESTful Web Services

Page 6: REST - Hyper Media klienter med Ramone

Denne præsentation …

Fokus på at implementere

”Machine-to-machine” systemer med

Løst koblede,

Frie og uafhængige,

Selvstændige,

Klienter og servere,

Der kan forbedres løbende uden pjat!

Mindre snak om performance og

skalering

Page 7: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Dekobler ”data leverandører”

og ”data aftagere”

Frihed til uafhængig

udvikling af komponenter og

valg af platforme

Page 8: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Serveren holder ikke styr på

klienterne og deres tilstand.

Klienten sender selv alt

nødvendig information i hver

forespørgelse.

Skalérbarhed af server

Page 9: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Netværket mellem klient og

server kan indeholde

alverdens ekstra

komponenter.

Frihed til at forbedre

netværket uden at ændre

klient og server.

Page 10: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Indbygget support for

caching af resultater fra

netværket.

Bedre performance

Page 11: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Servere kan levere

eksekverbar kode til klienter.

Bedre performance

Fleksibilitet

Page 12: REST - Hyper Media klienter med Ramone

REST –En arkitektonisk stilart

for software

Client – Server

Stateless

Layered System

Cacheable

Code On Demand

Uniform Interface

Ensartet og standardiseret

adgang til alle data.

(mere om det lige om lidt)

Page 13: REST - Hyper Media klienter med Ramone

Uniform interface

Identification of

resources

Manipulation of

resources through

representations

Self-descriptive

messages

Hypermedia as the engine of application

state.

URI /URL

Distribueret og global

navngivning

(modsat tidligere tiders

”link servers”)

Page 14: REST - Hyper Media klienter med Ramone

Uniform interface

Identification of

resources

Manipulation of

resources through

representations

Self-descriptive

messages

Hypermedia as the engine of application

state.

Abstraktion af data

Frihed til at ændre bagved

liggende implementering

Global fælles forståelse af

data via media types

Page 15: REST - Hyper Media klienter med Ramone

Uniform interface

Identification of

resources

Manipulation of

resources through

representations

Self-descriptive

messages

Hypermedia as the engine of application

state.

Headers

(operation, host, content-

type, zip-encoding osv.)

Data kan forstås og

manipuleres i netværket

Fri for data gætværk

Page 16: REST - Hyper Media klienter med Ramone

Uniform interface

Identification of

resources

Manipulation of

resources through

representations

Self-descriptive

messages

Hypermedia as the engine of application

state.

Links og forms

Frihed til at forbedre API

uden koordinering med alle

klienter

Fleksibilitet

Page 17: REST - Hyper Media klienter med Ramone

Man ser et mønster …

Frihed til uafhængigt at ændre servere

og klienter

Fælles forståelse for data

Skalérbarhed

Performance

Vi kender det fra HTML/browser.

Kan vi få samme effekter for vores API’er?

Page 18: REST - Hyper Media klienter med Ramone

Hvad er der "normalt” styr på?

Performance

Skalérbarhed

Frihed til uafhængigt at ændre servere

og klienter

Identificerbare ressourcer

Hyper media

Fælles forståelse for data

Media types

Page 19: REST - Hyper Media klienter med Ramone

Identificerbar ressource

Request (http://api.cdcph.dk/deltagere/1234):

GET /deltagere/1234 HTTP/1.1

Response

Content-Type: application/json

{ navn: ”John”, deltagerNr: 10, id: 1234 }

Page 20: REST - Hyper Media klienter med Ramone

Knap så identificerbar

ressourceRequest (http://api.cdcph.dk/deltagere):

POST /deltagere?action=read&id=1234

POST /deltagere?action=afmeld&id=1234

Skjult semantik (HTTP tunnelling)

Response

Content-Type: application/json

{ navn: ”John”, deltagerNr: 10, id: 1234 }

Page 21: REST - Hyper Media klienter med Ramone

Fra handling til ressource

Request 1 (http://api.cdcph.dk/deltagere)

POST /deltagere

{ action = ”tilmeld”, nummer = 1234, … }

Request 2 (http://api.cdcph.dk/deltagere/1234/tilmeldinger)

POST /deltagere/1234/tilmeldinger

{ … }

Page 22: REST - Hyper Media klienter med Ramone

Barometercheck!

Skift fra mange ukendte handlinger og meget få ressourcer

Til standard handlinger og mange (endnu ukendte) ressourcer

Giver

Fælles forståelse af data-tilgang og dermed

Bliver det

Standardiseret API for ALLE services, og

Færre linjer kode

Page 23: REST - Hyper Media klienter med Ramone

… REKLAME …https://github.com/JornWildt/Ramone

Page 24: REST - Hyper Media klienter med Ramone

Standard API / standard C# klient

?

Identificerbare ressourcer

Standard operationer (GET/POST/…)

Request rq = DeltagerUrl.Bind(Session);

Response<Deltager> rs = rq.Get<Deltager>();

Deltager d = rs.Body;

// Alternativt for JSON data

// dynamic deltager = rs.Body;

Page 25: REST - Hyper Media klienter med Ramone

RESTful URL’er? Nonsens!

http://example.com/examples/1234

http://example.com/examples?id=1234

http://example.com/examples.1234.json

http://example.com/jiourjlw-576-cd

Alle URL’er er skabt lige, og

Ingen URL’er er mere RESTful end andre.

Og strukturen er hamrende ligegyldig!

Page 26: REST - Hyper Media klienter med Ramone

Prædefinerede stier

Klassisk API dokumentation (Twitter)

GET /statuses/home_timeline

Returns the most recent statuses, including

retweets if they exist …

Herefter og i al evighed er denne

sammenhæng låst.

Page 27: REST - Hyper Media klienter med Ramone

Navngivne URL’er

RESTful dokumentation

GET {timeline-url}

Returns the most recent statuses, including

retweets if they exist …

Selve URL’en findes først på runtime.

=> Frihed til at ændre informations-struktur

Og hvordan gør vi så det? Lad os se et eksempel …

Page 28: REST - Hyper Media klienter med Ramone

Twitter 1 – Hvor er mine links?

{

text : ”Hello world”,

user :

{

id : 1234

name : ”John”

}

}

Page 29: REST - Hyper Media klienter med Ramone

Twitter 2 – Her kunne de være

{

text : ”Hello world”,

user :

{

link : ”http://api.twitter.com/...”,

name : ”John”

}

}

URL ”Navngivning” : ”user / link”.

Page 30: REST - Hyper Media klienter med Ramone

Hyper media: link relationer

HTML

<a rel=”deltager” href=”…”>Deltager 1</a>

ATOM

<link rel=”deltager” href=”…” title=”Deltager 1” />

=> Tydelig navngivning af URL

Page 31: REST - Hyper Media klienter med Ramone

Versionering: deltager v1

<deltager>

<navn>John</navn>

<link rel=”adresse”

href=”…”/>

</deltager>

Page 32: REST - Hyper Media klienter med Ramone

Versionering: deltager v2

<deltager>

<navn>John</navn>

<link rel=”adresse”

href=”…”/>

<link rel=”bedre-adresse”

href=”…”/>

</deltager>

Page 33: REST - Hyper Media klienter med Ramone

Service-index

<services>

<link rel=”kurser” href=”…”/>

<link rel=”tilmeldinger” href=”…”/>

<link rel=”deltagere” href=”…”/>

</services>

Page 34: REST - Hyper Media klienter med Ramone

Barometercheck!

Skift fra handlinger til ressourcer,

Fra statiske URL’er til navngivne URL’er, og

Anvendelse af hyper media

Giver Fælles forståelse af data-tilgang

Data som kan findes af alle

Friheden til at serveren kan

○ Ændre informations-struktur (endda servere), og

○ Tilføje nye ressourcer

Uden at opgradere klienter!

Page 35: REST - Hyper Media klienter med Ramone

… REKLAME …https://github.com/JornWildt/Ramone

Page 36: REST - Hyper Media klienter med Ramone

Hyper media klient

Navigering via hyper links

Request rq = DeltagerUrl.Bind(Session);

Response<Deltager> rs = rq.Get<Deltager>();

Deltager d = rs.Body;

Adresse a = d.Links.Select(”adresse”)

.Follow(Session)

.Get<Adresse>()

.Body;

Page 37: REST - Hyper Media klienter med Ramone

Prædefinerede opdateringer

Klassisk API dokumentation (Twitter)

POST statuses/update

Updates the authenticating user's status, also

known as tweeting … parameters are: …

Klient og server for evigt låst fast i denne

sammenhæng.

Page 38: REST - Hyper Media klienter med Ramone

Dynamiske operationer

Fleksibel dokumentation

{metode}

{url}

{format}

{parameter-1} … {parameter-N}

Updates the authenticating user's status, also known as tweeting …

Alle oplysninger findes på runtime

(men parametre er domain specifikke)

Page 39: REST - Hyper Media klienter med Ramone

Hyper media: formularer

Klienten kender kun formularens

Identifikation

Parametre

På runtime finder klienten

HTTP metode

URL

Data format

=> Frihed til at forbedre server operationer

Page 40: REST - Hyper Media klienter med Ramone

Formular v1: URL template

<form id=”deltager-søgning”

hreft=”/deltagere{?dnr}” />

Profilnavn = ”deltager-søgning”

Parametre:

dnr = deltagernummer

Page 41: REST - Hyper Media klienter med Ramone

Formular v2: POST + redirect

<form id=”deltager-søgning”

href=”/deltagere-search”

method=”POST”

type="app…/…urlencoded"/>

Profilnavn = ”deltager-søgning”

Parametre:

dnr = deltagernummer Uændret

Klientviden!

Page 42: REST - Hyper Media klienter med Ramone

Server-drevet applikations-

flow<deltager>

<navn>John</navn>

<!-- Findes kun hvis tilmeldt -->

<link rel=”afmeld-her” href=”…”/>

<!-- Findes kun hvis ej betalt -->

<link rel=”betal-her” href=”…”/>

<!-- Findes kun hvis man har adgang -->

<link rel=”persondata” href=”…”/>

</deltager>

Page 43: REST - Hyper Media klienter med Ramone

Barometercheck!

Skift fra handlinger til ressourcer, og

Anvendelse af Hyper media,

Formularer, og

Server-drevet applikations-flow

Giver Fælles forståelse af data-tilgang,

Data som kan findes af alle

Friheden til at serveren kan○ Ændre informations-struktur (endda servere),

○ Tilføje nye ressourcer, og

○ Styre applikations-flowet

Uden at opgradere klienter!

Page 44: REST - Hyper Media klienter med Ramone

… REKLAME …https://github.com/JornWildt/Ramone

Page 45: REST - Hyper Media klienter med Ramone

Hyper media klient

Formularer

IKeyValueForm f

= GetForm(”deltager-søgning”);

f.Value(”dnr”, 1234);

Search s = f.Bind(Session)

.Submit<Search>();

Page 46: REST - Hyper Media klienter med Ramone

Service kontrakt

En kontrakt som ejes af servicen

Klient Én

unik

Service

Kontrakt

Data

Page 47: REST - Hyper Media klienter med Ramone

Service beskrivelse

Beskriver URL’er og data

GET /statuses/home_timeline

Parametre: …

Returværdier: …

Er bundet til én implementering

Ingen hyper media

Alt er givet og hardkodet på forhånd

Er svær at genbruge

Page 48: REST - Hyper Media klienter med Ramone

Fælles standard

ServiceService

Media type

Fælles kontrakt som ikke ejes af server

”Self descriptive messages”

Klient

Mange

ensartede

services

Media type

Data

Page 49: REST - Hyper Media klienter med Ramone

Media type beskrivelse

Beskriver relationer og data

<link rel=”…” href=”…”/>

Forms parametre: …

Dataformat: …

Er ikke bundet til nogen implementering

Anvender hyper media

Alt bindes samme på runtime

Er klar til genbrug

Et registreret ID ”application/my-domain”

Page 50: REST - Hyper Media klienter med Ramone

Konklusion …

Page 51: REST - Hyper Media klienter med Ramone

Et paradigmeskift

Simpel data / smarte klienter

Smart data / simple klienter

Mindre klient/server kobling

Færre klient-opgraderinger

Fred, kærlighed og god karma

Page 52: REST - Hyper Media klienter med Ramone

Kendte ulemper

Grovkornede operationer

Bruger mere båndbredde (data + metadata)

Manglende værktøjer på klientsiden ...

Et misforstået koncept ...

Page 53: REST - Hyper Media klienter med Ramone

Det var (næsten) alt …

Page 54: REST - Hyper Media klienter med Ramone

Kontakt

Jørn Wildt

E-Mail: [email protected]

Twitter: @JornWildt

Blog: soabits.blogspot.com/

LinkedIn: dk.linkedin.com/in/jornwildt

Hjemmeside (gammel): www.elfisk.dk

cBrain: www.cbrain.dk

https://github.com/JornWildt/Ramone

Page 55: REST - Hyper Media klienter med Ramone

Ramone 1.0

Mange services => én klient

Uniform interface

Identifiable resources

Hyper media

○ Links (og templates)

○ Formularer

Media type codecs

○ XML, JSON, HTML, Multipart, UrlEncoded, ...

○ Domain specifikke

OAuth1 + Basic auth

Page 56: REST - Hyper Media klienter med Ramone

Læs mere …

Page 57: REST - Hyper Media klienter med Ramone

http://bit.ly/cd2012a1