Denna presentation är licensierat under en
Creative Commons Erkännande 3.0 Unported Licens. (Där inte annat anges)
Paul Signac - In the time of harmony: http://commons.wikimedia.org/
GET /products
GET /products/1
GET /products/hd-1432
Efterfråga en representation av en resurs
Read-only, safe, påverkar inte resursen
Idempotent - Flera anrop, samma tillstånd
Collection resource vs instance(singelton) resource
Servern svarar (exempel)
200 OK + data
301 Moved Permanently + location
404 Not Found
DELETE /products/12
Tar bort en resurs
Not safe, Idempotent
Servern svarar (exempel)
200 OK + meddelande och/eller info om den borttagna resursen
202 Accepted
204 No Content
404 Not Found
POST /products
POST-to-append (skapa) or Overload POST
Data skickas med, tala om för servern vilket format man skickar
Servern svarar (exempel)
201 Created + data
400 Bad Request + information
403 Forbidden
PRG är ej ett bra pattern när vi tänker stateless
PUT /products/1325
Uppdaterar en resurs, Om resursen inte finns skapas resursen?
un-safe, indempotent
200 OK - Samt representationen av tillståndet
204 No content
PATCH /products/1325
Partial update
Data skickas med som ska uppdateras
PATCH {attribue: "name", to: "John the great!"}
Ej idempotent...
200 OK
204 No content
...
# I controllern som genererar response # respond_with rederar ut json/xml # serializerar objektet @error (Error är en egen klass) # I rails finns massor med fördefinerade statuskoder respond_with @error, status: :not_foundThe status option
https://github.com/thajo/1dv450_demo
Image cc from: https://www.flickr.com/photos/n3wjack/3856456237/
Precis som all mjukvara kommer ditt API behöva uppdateras
Bakåtkompabilitet viktigt. Ge användarna en chans att ställa om. Vi måste kunna hantera versioner! Uppdatera sällan!
GET http:⁄⁄www.api.example.com/v1/products GET http:⁄⁄www.api.example.com/v2/products
# No fun hacking in browser Accept: application/vnd.coursepress-data+json;version=2.0 Accept: application/vnd.github.v3+json
http://stackoverflow.com/questions/389169/best-practices-for-api-versioning URL:er bör hållas kontakta så lnge som möjligt
⁄users⁄thajo:(firstname,lastname,email) ⁄users⁄thajo?fields=firstname,lastname,email
I http-protokollet finns Content-Range men...
⁄users?page=3&rrp=25 ⁄users?start=100&count=25 ⁄users?offset=100&limit=25
{ "prev": "http://localhost/api/v1/users/?offset=0&limit=25", "next": "http://localhost/api/v1/users/?offset=50&limit=25" }
Begränsa antalet anrop till ditt API.
Headers som börjar med X har använts som custom headers
Skickas med i respons från servern
429 Too Many Requests
Låt användaren av ditt API registrera sig för ett event.
Server-to-server
Foto cc by: http://www.flickr.com/photos/massimobarbieri/
Foto cc by: http://www.flickr.com/photos/111692634@N04/
Ett api är inte nåt snabbhackat till din mobilapplikation!
Foto cc by: http://www.flickr.com/photos/intelfreepress//
Authentication (Autentisering) - Fastställande av identitet
Authorization (Auktorisering) - Vilka resurser ska en identitet ha tillgång till
REST är stateless - ALL information i varje request
401 Unauthorized
Statuskoden för Autentiseringsfel (Authentication)
"Du är inte inloggad, din inloggning misslyckades. Var god försök igen!"
403 Forbidden (Authorization)
Statuskoden för Auktoriseringsfel
"Tyvärr! Jag vet kanske vem du är men du är inte tillåten att komma åt dessa resurser. Stör mig inte på denna adressen igen förens du har blivit autentiserad!"
Ibland skickas en 404 - Not found
# server HTTP Header 401 Unauthorized HTTP/1.1 WWW-Authenticate: Basic realm="my api"
# client HTTP header (base64-encodat username/password - ej krypterat) Authorization: Basic Kl52osuDS3DH6H12JDe543
MÅSTE ANVÄNDA HTTPS! Ej krypterat!
username/password i varje anrop
Enkelt! Stöd i de flesta tekniker!
Finns också "HTTP Digest authentication"
Har ett visst tidsspann
# beware of history, logging and proxies, unsafe- vs. safe methods GET https:⁄⁄api.example.com/resource/?token=aksaj9dksjfKJLKSh2
Slipper skicka lösenord i varje request. Kan sätta timeout på token...
There is a gem for that: https://github.com/jwt/ruby-jwt
Foto from Wikipedia
Har din tjänst "resource owners"?
Kommer många användare av ditt API bygga klienter där de vill komma åt data som hör till en "resource owners"?
Krångligt?