Bezstanowość (Stateless)
Każde zadanie klienta musi zawierac wszystkie informacje potrzebne do jego przetworzenia. Serwer nie przechowuje stanu sesji klienta.
REST (Representational State Transfer) to styl architektoniczny definiujacy zasady projektowania rozproszonych systemow, w szczegolnosci API webowych. Został zdefiniowany przez Roya Fieldinga w jego rozprawie doktorskiej w 2000 roku. REST nie jest protokołem ani standardem - to zbior ograniczeń architektonicznych, które gdy sa przestrzegane, prowadza do tworzenia skalowalnych i elastycznych systemow.
Współczesne aplikacje webowe intensywnie korzystaja z API RESTful do komunikacji miedzy frontendem a backendem, integracji z usługami zewnetrznymi oraz budowania mikrouslug.
Bezstanowość (Stateless)
Każde zadanie klienta musi zawierac wszystkie informacje potrzebne do jego przetworzenia. Serwer nie przechowuje stanu sesji klienta.
Jednolity interfejs (Uniform Interface)
Ustandaryzowany sposób komunikacji niezależny od typu klienta czy serwera.
Architektura klient-serwer
Wyrazne oddzielenie odpowiedzialności miedzy klientem (interfejs) a serwerem (dane i logika).
Cachowalnosc
Odpowiedzi musza być oznaczone jako cachowalne lub nie, co umozliwia optymalizacje.
W REST wszystko jest zasobem (resource). Zasob to dowolna informacja, która może być nazwana - użytkownik, produkt, zamowienie. Każdy zasob ma unikalny identyfikator URI (Uniform Resource Identifier).
| Zasob | URI | Opis |
|---|---|---|
| Kolekcja użytkowników | /api/users | Lista wszystkich użytkowników |
| Pojedynczy użytkownik | /api/users/123 | Użytkownik o ID 123 |
| Zamowienia użytkownika | /api/users/123/orders | Zamowienia konkretnego użytkownika |
REST wykorzystuje standardowe metody HTTP do wykonywania operacji CRUD na zasobach:
GET - Pobieranie zasobow
Pobiera reprezentacje zasobu. Jest bezpieczna (safe) i idempotentna - wielokrotne wywołanie daje ten sam wynik.
POST - Tworzenie zasobow
Tworzy nowy zasob w kolekcji. Nie jest idempotentna - każde wywołanie tworzy nowy zasob.
PUT - Aktualizacja zasobow
Zastepuje cały zasob nowa wersja. Jest idempotentna - wielokrotne wywołanie z tymi samymi danymi daje ten sam wynik.
PATCH - Czesciowa aktualizacja
Modyfikuje tylko wybrane pola zasobu. Przydatne gdy nie chcemy wysyłać całego obiektu.
DELETE - Usuwanie zasobow
Usuwa zasob. Jest idempotentna - usuniecie już usunietego zasobu nie zmienia stanu.
Idempotentnosc to kluczowa właściwość w REST. Operacja jest idempotentna, jeśli wielokrotne jej wykonanie daje ten sam rezultat co pojedyncze wykonanie.
| Metoda | Idempotentna | Bezpieczna |
|---|---|---|
| GET | Tak | Tak |
| POST | Nie | Nie |
| PUT | Tak | Nie |
| PATCH | Nie* | Nie |
| DELETE | Tak | Nie |
*PATCH może być idempotentna w zależności od implementacji.
GET /api/users - lista użytkownikówGET /api/users/123 - szczegóły użytkownika 123POST /api/users - utworzenie nowego użytkownikaPUT /api/users/123 - aktualizacja użytkownika 123DELETE /api/users/123 - usuniecie użytkownika 123// Pobranie listy użytkownikówfetch('/api/users') .then(response => response.json()) .then(data => console.log(data));
// Pobranie pojedynczego użytkownikafetch('/api/users/123') .then(response => { if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(user => console.log(user));fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: 'Jan Kowalski', email: 'jan@example.com' })}).then(response => response.json()).then(newUser => console.log('Utworzono:', newUser));{ "id": 123, "name": "Jan Kowalski", "email": "jan@example.com", "createdAt": "2024-01-15T10:30:00Z", "links": { "self": "/api/users/123", "orders": "/api/users/123/orders" }}// POST - tworzenie nowego zasobu (serwer przydziela ID)POST /api/users{ "name": "Anna Nowak" }// Odpowiedz: 201 Created, Location: /api/users/124
// PUT - zastapienie zasobu o znanym IDPUT /api/users/124{ "name": "Anna Nowak-Kowalska", "email": "anna@example.com" }// Odpowiedz: 200 OKREST jest odpowiedni gdy:
REST to sprawdzony styl architektoniczny dla API webowych, który gdy jest prawidłowo zaimplementowany, prowadzi do tworzenia skalowalnych, elastycznych i łatwo utrzymywalnych systemow. Kluczowe zasady to bezstanowość, jednolity interfejs oparty na zasobach i metodach HTTP oraz prawidłowe wykorzystanie kodow odpowiedzi.
Najważniejsze do zapamietania: