Top Banner
Budowa RESTowego api w oparciu o HATEOAS v1.1 braincode@2014 [email protected]
64

Budowa RESTowego api w oparciu o HATEOAS

May 25, 2015

Download

Technology

Budowa RESTowego api w oparciu o HATEOAS
@braincodemobi2014
EN: https://blog.allegrogroup.com/it/braincode-mobi1-mobile-people-move-your-brains
PL: https://blog.allegrogroup.com/it/braincode-mobi1-mobilni-ruszcie-mozgi
http://info.put.poznan.pl/2013/12/16/2004
v1.1
Allegro.pl
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Budowa RESTowego api w oparciu o HATEOAS

!Budowa RESTowego api w oparciu o HATEOAS

v1.1 braincode@2014 [email protected]

Page 2: Budowa RESTowego api w oparciu o HATEOAS

{ Agenda, czyli o tym, co będzie !API (WEBAPI) REST HATEOAS Różnice w API Github, Facebook, Twitter i Linkedin Uwagi Pytania

Page 3: Budowa RESTowego api w oparciu o HATEOAS

API

application programming interface

Page 4: Budowa RESTowego api w oparciu o HATEOAS

API

punkt wejścia usługi

Page 5: Budowa RESTowego api w oparciu o HATEOAS

API

Po co nam API?

dostępność

skalowalność

zasięg

Page 6: Budowa RESTowego api w oparciu o HATEOAS

API

Dla KOGO?

biznes

deweloper

klient

Page 7: Budowa RESTowego api w oparciu o HATEOAS

API

A gdy nie ma API..

powstają nieskalowalne, drogie w utrzymaniu monolity

ograniczamy liczbę klientów (mobilni, tv, agd, ..)

Page 8: Budowa RESTowego api w oparciu o HATEOAS

API

Hackathon, czyli „sprzedajemy” nasze API (jako startup)

http://www.hackathon.io/https://www.hackerleague.org/hackathons

Page 9: Budowa RESTowego api w oparciu o HATEOAS

API

Bezpieczeństwo jest najważniejsze

cały ruch po HTTPS

użycie OAUTH 2.0

separacja danych od autoryzacji (w nagłówku)

nie wymyślajmy autoryzacji na nowo..

problem root (android) i jailbreak (iOS)

Page 10: Budowa RESTowego api w oparciu o HATEOAS

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)

Page 11: Budowa RESTowego api w oparciu o HATEOAS

OAuth 2.0

Autoryzacja

Page 12: Budowa RESTowego api w oparciu o HATEOAS

Autoryzacja

OAuth 2.0

Basic Authentication

Personal Access Tokenscurl -u „login:pass" https://api.github.com/repos/user/repo

curl https://api.github.com/user?access_token=cb4sssdsdsdsd

Page 13: Budowa RESTowego api w oparciu o HATEOAS

Autoryzacja

OAuth 2.0

appsecret_proof (dodatkowo zabezpiecza token)

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

https://developers.facebook.com/docs/graph-api/securing-requests/

Page 14: Budowa RESTowego api w oparciu o HATEOAS

Autoryzacja

OAuth 2.0

Application-only authentication (kontekst aplikacji)

https://dev.twitter.com/docs/auth/application-only-auth

Page 15: Budowa RESTowego api w oparciu o HATEOAS

REST jest wzorcem architektury

REST

representational state transfer

Page 16: Budowa RESTowego api w oparciu o HATEOAS

REST jest wzorcem architektury

REST

reprezentacja zasobów usługi

Page 17: Budowa RESTowego api w oparciu o HATEOAS

REST

zasoby

jednorodny interfejs

bez stanu

reprezentacja

Page 18: Budowa RESTowego api w oparciu o HATEOAS

REST, reprezentacja

JSON (ECMA-404)

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

Page 19: Budowa RESTowego api w oparciu o HATEOAS

REST, reprezentacja

XML

{<response> <id>7</id> <category> <id>4</id> <name>Lions</name> </category> </response>

Page 20: Budowa RESTowego api w oparciu o HATEOAS

REST, reprezentacja

Poproszę te dane jako..

/posts/1?format=json

/posts/1.xml

Accept: application/json

Accept: application/vnd.github.beta+json

Page 21: Budowa RESTowego api w oparciu o HATEOAS

REST, reprezentacja

Ale dlaczego to tyle waży?

klient: Accept-Encoding: gzip, deflate

serwer: Content-Encoding: gzip

Page 22: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Czym jest zasób?

/posts

/posts, /news - rzeczownik w liczbie mnogiej

/posts/:id

zasób powinien mieć maksymalnie 2 bazowe adresy url

konkretne nazwy dla zasobów (unikajmy abstrakcji)

Page 23: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Przykłady/events

/repos/:owner/:repo/events

/notifications

/feeds

/statuses

Page 24: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Akcje na zasobachGET - 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)

Page 25: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Niestandardowe akcje na zasobachNie 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

Page 26: Budowa RESTowego api w oparciu o HATEOAS

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

Page 27: Budowa RESTowego api w oparciu o HATEOAS

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

Page 28: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Potrzebuję ten zasób w wersji..Należy bezwzględnie wymagać określenia wersji

nagłówek: Accept: application/vnd.github.beta+json

parametr w url: /v1/posts

parametr w query string: /posts?v=1.0

wersja jako kolejne liczby całkowite

Page 29: Budowa RESTowego api w oparciu o HATEOAS

REST, zasoby

Partial response, czyli potrzebuję tylko..

Definicja podzbioru pól w odpowiedzi z API

parametr fields=field1,field2

:(field1,field2,field3...)

Page 30: Budowa RESTowego api w oparciu o HATEOAS

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

Page 31: Budowa RESTowego api w oparciu o HATEOAS

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

Page 32: Budowa RESTowego api w oparciu o HATEOAS

REST, obsługa błędów

Czy status 200 dla błędów może się przydać ?

suppress_response_codes=truekiedyś zwracało status 200 dla błędów

Tak, aplikacje flash

Page 33: Budowa RESTowego api w oparciu o HATEOAS

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

Page 34: Budowa RESTowego api w oparciu o HATEOAS

400 Bad Request

REST, obsługa błędów

401 Unauthorized (np. problem z autoryzacją OAuth)

403 Forbidden (uprawnienia lub przekroczony limit)

404 Not Found

406 Not Acceptable

Page 35: Budowa RESTowego api w oparciu o HATEOAS

410 Gone (podana wersja api nie jest wspierana)

REST, obsługa błędów

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)

Page 36: Budowa RESTowego api w oparciu o HATEOAS

400 Bad Request

REST, obsługa błędów

401 Unauthorized (np. problem z autoryzacją OAuth)

403 Forbidden (uprawnienia lub przekroczony limit)

404 Not Found

405 Method Not Allowed (GET zamiast POST,..)

Page 37: Budowa RESTowego api w oparciu o HATEOAS

400 Bad Request

REST, obsługa błędów

404 Not Found

Page 38: Budowa RESTowego api w oparciu o HATEOAS

400 Bad Request

REST, obsługa błędów

404 Not Found

422 Unprocessable Entity (problem z weryfikacją)

Page 39: Budowa RESTowego api w oparciu o HATEOAS

X-Rate-Limit-Limit (limit dla danego zapytania)

REST, limity

X-Rate-Limit-Remaining (dostępna pula, 15 min okno)

X-Rate-Limit-Reset (czas odnowienia limitu)

Page 40: Budowa RESTowego api w oparciu o HATEOAS

X-RateLimit-Limit (limit dla danego zapytania)

X-RateLimit-Remaining (dostępna pula)

X-RateLimit-Reset (czas odnowienia limitu)

GET /rate_limit

REST, limity

Page 41: Budowa RESTowego api w oparciu o HATEOAS

https://www.linkedin.com/secure/developer?showthrottles=&app_id=appId&app_name=appName

REST, limity

status 403 z informacją o „throttle limit”

Page 42: Budowa RESTowego api w oparciu o HATEOAS

Error, Code: 17, User request limit reached

REST, limity

Error, Code: 4, Application request limit reached

Page 43: Budowa RESTowego api w oparciu o HATEOAS

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

Page 44: Budowa RESTowego api w oparciu o HATEOAS

HATEOAS

Przykład (reponse body)

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

curl https://api.github.com

Page 45: Budowa RESTowego api w oparciu o HATEOAS

HATEOAS

Przykład (nagłówki)

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

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

Page 46: Budowa RESTowego api w oparciu o HATEOAS

HATEOAS

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

Page 47: Budowa RESTowego api w oparciu o HATEOAS

Dokumentacja

Potrzebna nam jeszcze dokumentacja ?

http://swagger.wordnik.com/

Page 48: Budowa RESTowego api w oparciu o HATEOAS

Dokumentacja

Jak dobrze, że mogę przetestować API

https://dev.twitter.com/console

https://developers.facebook.com/tools/explorer

Page 49: Budowa RESTowego api w oparciu o HATEOAS

Dokumentacja

�49

Page 50: Budowa RESTowego api w oparciu o HATEOAS

Dokumentacja

�50

Page 51: Budowa RESTowego api w oparciu o HATEOAS

Dostęp do API z innej „domeny”

Access-Control-Allow-Methods: GET, POST, DELETE, PUT

Access-Control-Allow-Origin: * (github pozwala ustawić domenę)

Access-Control-Allow-Headers: Content-Type, Authorization, access_token

Dokumentacja

Page 52: Budowa RESTowego api w oparciu o HATEOAS

SDK

Dostarcza obiekty zapytań i odpowiedzi

Pozwala ukryć błędy projektowe API

Dostarcza interfejs API

Wsparcie dla obsługi błędów

Jak mogę wam pomóc w integracji?

Page 53: Budowa RESTowego api w oparciu o HATEOAS

SDK

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

oficjalne SDK tylko dla javascript

wsparcie w różnych framework’ach (community)

Page 54: Budowa RESTowego api w oparciu o HATEOAS

SDK

http://developer.github.com/v3/libraries

oficjalne SDK (octokit) dla c#, ruby, go i obj-c

Page 55: Budowa RESTowego api w oparciu o HATEOAS

SDK

oficjalne SDK dla iOS, Android, javascript, php, unity

olbrzymie wsparcie w projektach community

Page 56: Budowa RESTowego api w oparciu o HATEOAS

SDK

https://dev.twitter.com/docs/twitter-libraries

oficjalne SDK hbc dla java (streaming api, not REST)

olbrzymie wsparcie w projektach community

Page 57: Budowa RESTowego api w oparciu o HATEOAS

Uwagi

Światowy standard formatowanie daty (ISO-8601)

Unikajmy magicznych wartości

Proste rzeczy w przedstawiaj w prosty sposób

Pola id zwracaj jako typu znakowego

http://apiux.com/2013/03/20/5-laws-api-dates-and-times

price = -1

"id": 187462027801919500,"id_str": "187462027801919489"

Page 58: Budowa RESTowego api w oparciu o HATEOAS

Przyjęta notacja dla nazwa parametrów

Stronicowanie wyników

Definiowanie akcji na zasobach

Uwagi

Unikaj domyślnych wartości dla parametrów

limit i offset zamiast page

czasowniki dla akcji lub nowy zasób (rzeczownik)

camelCase

Page 59: Budowa RESTowego api w oparciu o HATEOAS

Przyjmowanie rozbudowanych danych wejściowych w metodzie GET

Uwagi

Nie pozwalaj na znikające pola w odpowiedzi

Page 60: Budowa RESTowego api w oparciu o HATEOAS

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

Page 61: Budowa RESTowego api w oparciu o HATEOAS

{Ciekawy temat, chcę więcej! !!http://blog.steveklabnik.com/posts/2011-08-07-some-people-understand-rest-and-http http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http http://www.informit.com/articles/article.aspx?p=1566460 http://blog.perfectapi.com/2012/opinionated-rpc-apis-vs-restful-apis/ !http://info.apigee.com/Portals/62317/docs/web%20api.pdf !http://apiux.com/2013/03/20/5-laws-api-dates-and-times

Page 62: Budowa RESTowego api w oparciu o HATEOAS

Warsztaty

swagger

gradle

jersey2

jetty

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

Page 63: Budowa RESTowego api w oparciu o HATEOAS

Pytania ?

Page 64: Budowa RESTowego api w oparciu o HATEOAS

Dziękuję za uwagę