SlideShare a Scribd company logo
!

Budowa poprawnego i intuicyjnego API na bazie
REST i HATEOAS

v1.0 devfest@2013

mateusz.stepniak@allegro.pl
{

Agenda, czyli o tym, co będzie
!
API
REST
HATEOAS
Różne podejście w API Github, Facebook, Twitter i Linkedin
Uwagi
API

application

programming

interface
API

punkt

wejścia

usługi
API

PO co nam API?
dostępność
skalowalność
zasięg
API

Dla KOGO?
biznes
deweloper
klient
API

A gdy nie ma API..
powstają nieskalowalne, drogie w utrzymaniu monolity

ograniczamy liczbę klientów (rynek mobilny, tv, ..)
API

Hackathon, czyli „sprzedajemy”
nasze API (jako startup)
http://www.hackathon.io/
https://www.hackerleague.org/hackathons
API

Bezpieczeństwo jest najważniejsze
cały ruch po HTTPS
używaj OAUTH 2.0
separuj dane wejściowe od autoryzacji (w nagłówku)
nie wymyślaj autoryzacji na nowo..
OAuth 2.0 vs 1.0

wsparcie dla autoryzacji poza przeglądarką
nie wymaga szyfrowania kluczy tylko połączenia https
czas życia tokena mógł być wieczny
pojęcie odnawiania tokena (bez akcji użytkownika)
Autoryzacja

OAuth 2.0
Autoryzacja

OAuth 2.0
Basic Authentication
Personal Access Tokens
Autoryzacja

OAuth 2.0
appsecret_proof (dodatkowo zabezpiecza token)
szczegółowa konfiguracja ustawień aplikacji
tokeny z krótkim i długim czasem życia
Autoryzacja

OAuth 2.0
Application-only authentication (kontekst aplikacji)
REST jest wzorcem architektury
REST

representational

state

transfer
REST jest wzorcem architektury
REST

reprezentacja

zasobów

usługi
REST
reprezentacja
zasoby
jednorodny interfejs
bez stanu
REST, reprezentacja

JSON (ECMA-404)

{

{
"id": "7",
"category": {
"id": "4",
"name": "Lions"
}
}
REST, reprezentacja

XML

{

<response>
<id>7</id>
<category>
<id>4</id>
<name>Lions</name>
</category>
</response>
REST, reprezentacja

Poproszę te dane jako..
/posts/1?format=json
/posts/1.xml
Accept: application/json
REST, reprezentacja

Ale dlaczego to tyle waży?
klient:

Accept-Encoding: gzip, deflate

serwer: Content-Encoding: gzip
REST, zasoby

Czym jest zasób?
/posts, /news - rzeczownik w liczbie mnogiej
zasób powinien mieć maksymalnie 2 bazowe adresy url

/posts
/posts/:id
konkretne nazwy dla zasobów (unikaj abstrakcji)
REST, zasoby

Akcje na zasobach
GET - pobierz, szukaj (http status 200 OK)
POST - utwórz (http status 201 CREATED z location)
PUT - aktualizuj (http status 200 OK)
PATCH - częściowa aktualizacja (http status 200 OK)
DELETE - usuń (http status 204 NO CONTENT)
REST, zasoby

Niestandardowe akcje na zasobach
Nie mieszaj akcji na zasobach w adresie do zasobu
POST /posts/:id/rate ?? Czy ocena jest akcją?
POST /rates?post=:id ?? Czy ocena jest zasobem?
.. chyba, że ma to sens
REST, zasoby

A jeśli zasoby są zależne od siebie?
Pokaż mi posty użytkownika o id..
GET /users/:id/posts
oraz takie, które dodał wczoraj
GET /users/:id/posts?createdTime=08.11.2013
REST, zasoby

Znajdź niepoprawne adresy zasobów
/post/show/:id
/posts/show/:id (początkowo w Ruby)
/users/1/posts/rated/5
/users/1/pay/100.00/to/2
REST, zasoby

Potrzebuję ten zasób w wersji..
Należy bezwzględnie wymagać określenia wersji
wersja jako kolejne liczby całkowite
nagłówek: Accept: application/vnd.github.beta+json
parametr w url: /v1/posts
parametr w query string: /posts?v=1.0
REST, zasoby

Partial response, czyli potrzebuję tylko..
Definicja podzbioru pól w odpowiedzi z API

parametr fields=field1,field2

:(field1,field2,field3...)
REST, cache

Często pytam o to samo..
Przechowujemy tylko odpowiedź z metod GET

varnish po stronie serwera
przez nagłówki expires, cache-control, etag po stronie
klienta
REST, obsługa błędów

Jakie informacje powinno zwrócić API ?
opis błędu dla dewelopera aplikacji
opis błędu dla użytkownika aplikacji
wewnętrzny kod błędu API

informacja o statusie http
REST, obsługa błędów

Czy status 200 dla błędów może się przydać ?
Tak, aplikacje flash i javascript
suppress_response_codes=true
zwracało status 200 dla błędów
REST, obsługa błędów

Statusy http błędów wywołania API
4xx - błędy po stronie klienta API
5xx - błędy po stronie serwera API
REST, obsługa błędów

400 Bad Request
401 Unauthorized (np. problem z autoryzacją OAuth)
403 Forbidden (uprawnienia lub przekroczony limit)
404 Not Found
406 Not Acceptable
REST, obsługa błędów

410 Gone (podana wersja api nie jest wspierana)
420 Method Failure (limit wywołań dla wyszukiwania)
429 Too Many Requests (j.w)
502 Bad Gateway (przerwa techniczna lub awaria)
503 Service Unavailable (usługa jest przeciążona)
504 Gateway timeout (problemy z obsługą żądania)
REST, obsługa błędów

400 Bad Request
401 Unauthorized (np. problem z autoryzacją OAuth)
403 Forbidden (uprawnienia lub przekroczony limit)
404 Not Found
405 Method Not Allowed (GET zamiast POST,..)
REST, obsługa błędów

400 Bad Request
REST, obsługa błędów

400 Bad Request
422 Unprocessable Entity (problem z weryfikacją)
REST, limity

X-Rate-Limit-Limit (limit dla danego zapytania)
X-Rate-Limit-Remaining (dostępna pula, 15 min okno)
X-Rate-Limit-Reset (czas odnowienia limitu)
REST, limity

X-RateLimit-Limit (limit dla danego zapytania)
X-RateLimit-Remaining (dostępna pula)
X-RateLimit-Reset (czas odnowienia limitu)
GET /rate_limit
REST, limity

https://www.linkedin.com/secure/developer?
showthrottles=&app_id=appId&app_name=appName
status 403 z informacją o „throttle limit”
REST, limity

Error, Code: 17, User request limit reached
Error, Code: 4, Application request limit reached
HATEOAS

HYPERMEDIA AS THE ENGINE OF
APPLICATION STATE
relacje między zasobami w postaci odnośników
lista dostępnych metod API
nagłówki content-type i accept
HATEOAS

Tekst

http://blog.perfectapi.com/2012/opinionated-rpc-apis-vs-restful-apis/
Dokumentacja

Jeśli API jest intuicyjne to po co
dokumentacja ?
http://swagger.wordnik.com/
Dokumentacja

Jak dobrze że mogę przetestować API
https://dev.twitter.com/console
https://developers.facebook.com/tools/explorer
Access-Control-Allow

Dostęp do API z innej „domeny”
Access-Control-Allow-Origin: * (github pozwala ustawić domenę)
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Access-Control-Allow-Headers: Content-Type, Authorization, access_token
SDK

Jak mogę Ci pomóc w integracji?
Pozwala ukryć błędy projektowe API
Dostarcza obiekty zapytań i odpowiedzi
Dostarcza interfejs API
Wsparcie dla obsługi błędów
SDK

https://developer.linkedin.com/documents/libraries-and-tools

oficjalne SDK tylko dla javascript
wsparcie w różnych framework’ach (community)
SDK

http://developer.github.com/v3/libraries
oficjalne SDK (octokit) dla c#, ruby i obj-c
SDK

oficjalne SDK dla iOS, Android, web (javascript, php)
olbrzymie wsparcie w projektach community
SDK

https://dev.twitter.com/docs/twitter-libraries
oficjalne SDK hbc dla java (nie jest klientem REST)
olbrzymie wsparcie w projektach community
Uwagi

Proste rzeczy w przedstawiaj w prosty sposób

Światowy standard formatowanie daty i czasu

Unikaj magicznych wartości (price = -1)

Pola id zwracaj jako typu znakowego (string)
Uwagi

Definiowanie akcji na zasobach (czasowniki)

Przyjęta notacja dla nazwa parametrów (cammel case)

Znikające pola w odpowiedzi

Stronicowanie wyników (limit i offset zamiast page)
Uwagi

Unikaj domyślnych wartości dla parametrów
Przyjmowanie rozbudowanych danych wejściowych
w metodzie GET
Zagadka
Czy można wysłać metodą GET dane w body?
{

Ciekawy temat, chcę więcej!
!
http://blog.steveklabnik.com/posts/2011-08-07-some-peopleunderstand-rest-and-http
http://blog.steveklabnik.com/posts/2011-07-03-nobodyunderstands-rest-or-http
http://www.informit.com/articles/article.aspx?p=1566460
http://blog.perfectapi.com/2012/opinionated-rpc-apis-vsrestful-apis/
!
http://info.apigee.com/Portals/62317/docs/web%20api.pdf
Pytania ?
Dziękuję za uwagę

More Related Content

PPTX
Środowisko testowe pod REST-a
PDF
Cykl życia zapytania HTTP (pod maską)
PDF
Laravelowe paczki do uwierzytelniania
PDF
Automatyzacja utrzymania jakości w środowisku PHP
PDF
REST API - teoria i praktyka - WordUp Warszawa
PDF
REST API - teoria i praktyka - WordUp Trójmiasto
PDF
University day 2
PDF
university day 1
Środowisko testowe pod REST-a
Cykl życia zapytania HTTP (pod maską)
Laravelowe paczki do uwierzytelniania
Automatyzacja utrzymania jakości w środowisku PHP
REST API - teoria i praktyka - WordUp Warszawa
REST API - teoria i praktyka - WordUp Trójmiasto
University day 2
university day 1

Similar to Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013 (20)

PDF
Budowa RESTowego api w oparciu o HATEOAS
PDF
JSON, REST API
PPTX
Co nowego w VS 2013 dla programistów ASP.NET?
PPTX
Android i REST
PDF
Paleta możliwości web developera
PDF
Wprowadzenie do WP-API
PDF
Functional widgets in Rails
PPTX
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
PDF
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
PDF
Design Modern API - The Right Way
PPTX
Testowanie na 101 sposobów
PPTX
Z czym do api
PDF
4Developers 2015: Dlaczego 99% firm, które tworzą API RESTowe kłamie? - Barte...
PDF
Dlaczego 99% firm, które tworzą API RESTowe kłamie?
PDF
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
PDF
Wstęp do projektowania usług internetowych: część 1 - rest
PPTX
Single Page Applications przy wykorzystaniu REST
PDF
WP-API - teoria i praktyka - WordUp Łódź #4
PDF
Ruby, Ruby on Rails 2010
PDF
Lionframe - Rapid RESTful API development
Budowa RESTowego api w oparciu o HATEOAS
JSON, REST API
Co nowego w VS 2013 dla programistów ASP.NET?
Android i REST
Paleta możliwości web developera
Wprowadzenie do WP-API
Functional widgets in Rails
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
Design Modern API - The Right Way
Testowanie na 101 sposobów
Z czym do api
4Developers 2015: Dlaczego 99% firm, które tworzą API RESTowe kłamie? - Barte...
Dlaczego 99% firm, które tworzą API RESTowe kłamie?
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Wstęp do projektowania usług internetowych: część 1 - rest
Single Page Applications przy wykorzystaniu REST
WP-API - teoria i praktyka - WordUp Łódź #4
Ruby, Ruby on Rails 2010
Lionframe - Rapid RESTful API development
Ad

Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013