Przejdź do głównej zawartości

REST vs zwykłe API - projektowanie endpointow

Co przekazesz słuchaczom?

Po tej prezentacji słuchacze będą w stanie:

  • Zrozumiec różnicę miedzy REST a “zwykłym” API
  • Projektowac poprawne endpointy zgodnie z konwencjami REST
  • Dobierac odpowiednie metody HTTP do operacji CRUD
  • Używać właściwych kodow statusu HTTP
  • Unikac typowych błędów w projektowaniu API
  1. Wprowadzenie (2 min)

    • Co to jest API i dlaczego jest ważne
    • Różnica miedzy REST a innymi podejsciami
    • Krótka historia REST
  2. Zasoby i endpointy (3 min)

    • Pojecie zasobu w REST
    • Konwencje nazewnictwa endpointow
    • Przykłady dobrych i złych endpointow
  3. Metody HTTP i CRUD (3 min)

    • Mapowanie metod HTTP na operacje
    • Idempotencja i bezpieczeństwo metod
    • Kiedy używać której metody
  4. Odpowiedzi i kody statusu (2 min)

    • Format odpowiedzi JSON
    • Najważniejsze kody statusu
    • Obsługa błędów
  5. Podsumowanie (2 min)

    • Checklista dobrego API
    • Pytania i dyskusja

REST (Representational State Transfer) to styl architektoniczny dla systemow rozproszonych, oparty na:

  • Zasobach identyfikowanych przez URI
  • Reprezentacjach (zwykłe JSON lub XML)
  • Bezstanowości (każde zadanie jest niezależne)
  • Jednolitym interfejsie (standardowe metody HTTP)

Zasady projektowania endpointow

  1. Uzywaj rzeczownikow, nie czasownikow

    • Dobrze: /users, /products, /orders
    • Źle: /getUsers, /createProduct, /deleteOrder
  2. Uzywaj liczby mnogiej

    • Dobrze: /users, /posts, /comments
    • Źle: /user, /post, /comment
  3. Hierarchia zasobow

    • Dobrze: /users/123/posts (posty użytkownika 123)
    • Dobrze: /posts/456/comments (komentarze do posta 456)
  4. Uzywaj ID w sciezce, nie w query string

    • Dobrze: /users/123
    • Źle: /users?id=123
MetodaOperacja CRUDPrzykładOpis
GETReadGET /usersPobierz liste użytkowników
GETReadGET /users/123Pobierz użytkownika o ID 123
POSTCreatePOST /usersUtworz nowego użytkownika
PUTUpdate (całkowity)PUT /users/123Zaktualizuj całego użytkownika
PATCHUpdate (czesciowy)PATCH /users/123Zaktualizuj wybrane pola
DELETEDeleteDELETE /users/123Usun użytkownika
KodNazwaUżycie
200OKSukces ogolny (GET, PUT, PATCH)
201CreatedZasob utworzony (POST)
204No ContentSukces bez zawartosci (DELETE)
+----------+ HTTP +----------+
| Klient | <-------------------> | Serwer |
| (React, | GET /users | (API) |
| Mobile) | POST /users | |
| | PUT /users/123 | |
+----------+ DELETE /users/123 +----------+
|
v
+----------+
| JSON |
| Response |
+----------+
EndpointMetodaOpisOdpowiedz
/tasksGETLista żądań200 + JSON
/tasksPOSTNowe zadanie201 + JSON
/tasks/1GETSzczegóły zadania200 + JSON
/tasks/1PUTAktualizacja200 + JSON
/tasks/1DELETEUsuniecie204
ZLE (styl RPC): DOBRZE (styl REST):
POST /createUser POST /users
GET /getUserById?id=123 GET /users/123
POST /updateUser PUT /users/123
POST /deleteUser?id=123 DELETE /users/123
GET /getAllUserPosts?userId=123 GET /users/123/posts
// GET /users
// Status: 200 OK
{
"data": [
{
"id": 1,
"name": "Jan Kowalski",
"email": "jan@example.com"
},
{
"id": 2,
"name": "Anna Nowak",
"email": "anna@example.com"
}
],
"meta": {
"total": 2,
"page": 1,
"per_page": 10
}
}
// POST /users
// Body: { "name": "Piotr Wisniewski", "email": "piotr@example.com" }
// Status: 201 Created
{
"data": {
"id": 3,
"name": "Piotr Wisniewski",
"email": "piotr@example.com",
"created_at": "2024-01-15T10:30:00Z"
}
}
// GET /users/999
// Status: 404 Not Found
{
"error": {
"code": "NOT_FOUND",
"message": "Użytkownik o ID 999 nie istnieje",
"details": null
}
}
// POST /users
// Body: { "name": "", "email": "nieprawidłowy-email" }
// Status: 422 Unprocessable Entity
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Dane wejsciowe sa nieprawidłowe",
"details": {
"name": ["Pole name jest wymagane"],
"email": ["Nieprawidłowy format adresu email"]
}
}
}
// Filtrowanie
GET /products?category=electronics&price_min=100&price_max=500
// Sortowanie
GET /products?sort=price&order=asc
// Paginacja
GET /products?page=2&per_page=20
// Kombinacja
GET /products?category=electronics&sort=price&order=desc&page=1&per_page=10

Wymagania minimalne:

  • Wyjaśnienie czym jest zasob i endpoint
  • Pokazanie 3 przykładowych endpointow
  • Omowienie minimum 2 kodow statusu HTTP
  • Pokazanie formatu odpowiedzi JSON
Ocena: 3.0 (minimum)

Co sprawdzić przy projektowaniu API?

  1. Czy endpointy używają rzeczownikow w liczbie mnogiej?
  2. Czy metody HTTP odpowiadaja operacjom CRUD?
  3. Czy kody statusu sa używane poprawnie?
  4. Czy odpowiedzi błędów maja spojny format?
  5. Czy API jest wersjonowane?
  6. Czy istnieje dokumentacja (np. OpenAPI/Swagger)?
  7. Czy parametry query string sa logiczne?
  8. Czy odpowiedzi zawieraja metadane (paginacja)?

Pytanie 1

Kiedy użyć PUT, a kiedy PATCH? Jaka jest różnica?

Pytanie 2

Dlaczego warto używać wersjonowania API?

Pytanie 3

Jak zaprojektowac endpoint do wyszukiwania?

Pytanie 4

Czy REST jest zawsze najlepszym wyborem? Kiedy rozwazyc GraphQL?