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
9. 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..
10. 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)
22. 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)
24. 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)
25. 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
26. 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
28. 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
29. REST, zasoby
Partial response, czyli potrzebuję tylko..
Definicja podzbioru pól w odpowiedzi z API
parametr fields=field1,field2
:(field1,field2,field3...)
30. 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
31. 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
32. 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
33. 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
34. 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
35. 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)
36. 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,..)
43. 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
51. 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
52. 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
57. 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
58. 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
59. Uwagi
Nie pozwalaj na znikające pola w odpowiedzi
Przyjmowanie rozbudowanych danych wejściowych
w metodzie GET
60. 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"}