Webbramverk, 1DV450
Linnéuniversitetet, vt 2016



RESTful Webb-API part 2

RESTful

Paul Signac - In the time of harmony: http://commons.wikimedia.org/

GET

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

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

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

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

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
...

Response och statuskoder

# 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_found
			
The status option

Visa koden!

https://github.com/thajo/1dv450_demo

Image cc from: https://www.flickr.com/photos/n3wjack/3856456237/

Versioning

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

Partial response (filtrering) & Pagination

⁄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"
}

API-keys

Rate limit

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

"Web hooks"

Låt användaren av ditt API registrera sig för ett event.
Server-to-server

IF This Then That - http://ifttt.com/channels

Dokumentation

Säkerhet

Foto cc by: http://www.flickr.com/photos/111692634@N04/

Ett api är inte nåt snabbhackat till din mobilapplikation!

HTTPS - HTTP over SSL/TSL

Foto cc by: http://www.flickr.com/photos/intelfreepress//

Säkerhet

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

Felkoder från servern

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

Säkerhetsstrategier för RESTful webb-API

HTTP Basic authentication

# 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!

http://railscasts.com/episodes/352-securing-an-api

Finns också "HTTP Digest authentication"

Username/password vs. Token-based

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...

JSON Web Token (jwt)

http://jwt.io/

There is a gem for that: https://github.com/jwt/ruby-jwt

Foto from Wikipedia

Varför OAuth?

Ska jag implementera en OAuth service?

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?