SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
!

Budowa RESTowego api w oparciu o HATEOAS

v1.1 braincode@2014

mateusz.stepniak@allegro.pl
{

Agenda, czyli o tym, co będzie
!
API (WEBAPI)
REST
HATEOAS
Różnice w API Github, Facebook, Twitter i Linkedin
Uwagi
Pytania
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 (mobilni, tv, agd, ..)
API

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

Bezpieczeństwo jest najważniejsze
problem root (android) i jailbreak (iOS)
cały ruch po HTTPS
użycie OAUTH 2.0
separacja danych od autoryzacji (w nagłówku)
nie wymyślajmy 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
curl -u „login:pass" https://api.github.com/repos/user/repo

Personal Access Tokens
curl https://api.github.com/user?access_token=cb4sssdsdsdsd
Autoryzacja

OAuth 2.0
appsecret_proof (dodatkowo zabezpiecza token)
https://developers.facebook.com/docs/graph-api/securing-requests/

tokeny z krótkim i długim czasem życia
Autoryzacja

OAuth 2.0
Application-only authentication (kontekst aplikacji)
https://dev.twitter.com/docs/auth/application-only-auth
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
Accept: application/vnd.github.beta+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 (unikajmy abstrakcji)
REST, zasoby

Przykłady
/events
/repos/:owner/:repo/events
/feeds
/statuses

/notifications
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
Pokaż mi posty użytkownika, które dodał wczoraj
GET /users/:id/posts?createdTime=16.01.2014
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..
Cache’ujemy tylko odpowiedzi 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
suppress_response_codes=true
kiedyś 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
404 Not Found
REST, obsługa błędów

400 Bad Request
404 Not Found
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

Przykład (reponse body)

{

curl https://api.github.com

{
"current_user_url": „https://api.github.com/user",
"emails_url": „https://api.github.com/user/emails",
"events_url": „https://api.github.com/events",
"feeds_url": „https://api.github.com/feeds",
"issues_url": "https://api.github.com/issues"
}
HATEOAS

Przykład (nagłówki)

{

curl https://api.github.com/users?access_token=token

Link: <https://api.github.com/users?
access_token=token&since=135>; rel="next", <https://
api.github.com/users{?since}>; rel="first"
HATEOAS

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

Potrzebna nam jeszcze
dokumentacja ?
http://swagger.wordnik.com/
Dokumentacja

Jak dobrze, że mogę przetestować API
https://dev.twitter.com/console
https://developers.facebook.com/tools/explorer
Dokumentacja

49
Dokumentacja

50
Dokumentacja

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ę wam 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, go i obj-c
SDK

oficjalne SDK dla iOS, Android, javascript, php, unity
olbrzymie wsparcie w projektach community
SDK

https://dev.twitter.com/docs/twitter-libraries
oficjalne SDK hbc dla java (streaming api, not REST)
olbrzymie wsparcie w projektach community
Uwagi

Pola id zwracaj jako typu znakowego
"id": 187462027801919500,

"id_str": "187462027801919489"

Światowy standard formatowanie daty (ISO-8601)
http://apiux.com/2013/03/20/5-laws-api-dates-and-times

Unikajmy magicznych wartości
price = -1

Proste rzeczy w przedstawiaj w prosty sposób
Uwagi

Definiowanie akcji na zasobach
czasowniki dla akcji lub nowy zasób (rzeczownik)

Przyjęta notacja dla nazwa parametrów
camelCase

Stronicowanie wyników
limit i offset zamiast page

Unikaj domyślnych wartości dla parametrów
Uwagi

Nie pozwalaj na znikające pola w odpowiedzi
Przyjmowanie rozbudowanych danych wejściowych
w metodzie GET
Zagadka
Czy można wysłać metodą GET dane w body?
curl -X GET --data '{"id": "2223"}' http://echo.200please.com -H "Content-type: application/json"

GET / HTTP/1.0
Host: echo.200please.com
Connection: close
Content-Length: 14
User-Agent: curl/7.34.0
Accept: */*
Content-type: application/json

!

{"id": "2223"}
{

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
!
http://apiux.com/2013/03/20/5-laws-api-dates-and-times
Warsztaty

https://github.com/Zenedith/swagger-jersey2-gradle-demo-app

gradle
swagger
jersey2
jetty
Pytania ?
Dziękuję za uwagę

Contenu connexe

Similaire à Budowa RESTowego api w oparciu o HATEOAS

Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Mateusz Stępniak
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 
Paleta możliwości web developera
Paleta możliwości web developeraPaleta możliwości web developera
Paleta możliwości web developeraTomasz Borowski
 
Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Bartlomiej Zass
 
Wprowadzenie do WP-API
Wprowadzenie do WP-APIWprowadzenie do WP-API
Wprowadzenie do WP-APITomasz Dziuda
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in RailsSebastian Sito
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Natalia Stanko
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...Tomasz Kopacz
 
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl PROIDEA
 
WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4Tomasz Dziuda
 
Serwer internetowy w systemie Linux
Serwer internetowy w systemie LinuxSerwer internetowy w systemie Linux
Serwer internetowy w systemie Linuxbm9ib2r5
 
Lionframe - Rapid RESTful API development
Lionframe - Rapid RESTful API developmentLionframe - Rapid RESTful API development
Lionframe - Rapid RESTful API developmentMichał Marcinkowski
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykładynasza-klasa
 
WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2Tomasz Dziuda
 
Single Page Applications przy wykorzystaniu REST
Single Page Applications przy wykorzystaniu RESTSingle Page Applications przy wykorzystaniu REST
Single Page Applications przy wykorzystaniu REST3camp
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaTomasz Dziuda
 
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]Droptica
 

Similaire à Budowa RESTowego api w oparciu o HATEOAS (20)

Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Paleta możliwości web developera
Paleta możliwości web developeraPaleta możliwości web developera
Paleta możliwości web developera
 
Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?Co nowego w VS 2013 dla programistów ASP.NET?
Co nowego w VS 2013 dla programistów ASP.NET?
 
Wprowadzenie do WP-API
Wprowadzenie do WP-APIWprowadzenie do WP-API
Wprowadzenie do WP-API
 
Functional widgets in Rails
Functional widgets in RailsFunctional widgets in Rails
Functional widgets in Rails
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010
 
Design Modern API - The Right Way
Design Modern API - The Right WayDesign Modern API - The Right Way
Design Modern API - The Right Way
 
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...Mts 2013   tomasz kopacz - windows 8, office 365, workflow manager, windows a...
Mts 2013 tomasz kopacz - windows 8, office 365, workflow manager, windows a...
 
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
PLNOG 5: Janusz Dziemidowicz - OpenSocial w nk.pl
 
WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4
 
Serwer internetowy w systemie Linux
Serwer internetowy w systemie LinuxSerwer internetowy w systemie Linux
Serwer internetowy w systemie Linux
 
Testowanie na 101 sposobów
Testowanie na 101 sposobówTestowanie na 101 sposobów
Testowanie na 101 sposobów
 
Lionframe - Rapid RESTful API development
Lionframe - Rapid RESTful API developmentLionframe - Rapid RESTful API development
Lionframe - Rapid RESTful API development
 
NK API - Przykłady
NK API - PrzykładyNK API - Przykłady
NK API - Przykłady
 
WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2
 
Single Page Applications przy wykorzystaniu REST
Single Page Applications przy wykorzystaniu RESTSingle Page Applications przy wykorzystaniu REST
Single Page Applications przy wykorzystaniu REST
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia Prawdziwa
 
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
Rest API w Drupalu - działanie i definicja własnych endpointów [PL]
 

Budowa RESTowego api w oparciu o HATEOAS