Praktyczny przewodnik po projektowaniu REST API. Konwencje URL, metody HTTP, błędy, wersjonowanie, paginacja i kilka ważnych niuansów, które zwykle pomija się w prostych tutorialach.
REST (Representational State Transfer) to styl architektoniczny, który mocno wpłynął na web, a w praktyce większość API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami., z którymi pracujesz jako frontend developer, to raczej HTTP API inspirowane REST niż "czysty REST" z podręcznika.
Ale REST to nie tylko "używaj HTTP". To zbiór konwencji i zasad, które sprawiają, że API jest intuicyjne, przewidywalne i łatwe w użyciu.
Krótka odpowiedź: URL to rzeczowniki (zasoby), nie czasowniki, więc GET pobiera, POST tworzy, PUT zastępuje, PATCH aktualizuje częściowo, DELETE usuwa. Idąc dalej: 200 to sukces, 201 to utworzono, 401 to brak autentykacji, 403 to brak uprawnień, 404 to brak zasobu. Bądź konsekwentny w całym API, ponieważ ostatecznie konwencje są ważniejsze niż przyjęcie puryzmu REST-owego.
W tym artykule poznasz zasady projektowania REST API to styl projektowania interfejsów oparty na zasobach, metodach HTTP i bezstanowej komunikacji. — zarówno jako konsument (frontend), jak i twórca (backend), jeśli potrzebujesz odświeżyć podstawy, zacznij od HTTP od podstaw.
Zasady REST
1. Client-Server
Klient (frontend) i serwer (backend) są oddzielone, a komunikują się przez HTTP.
2. Stateless
Każdy request powinien zawierać wszystko, co potrzebne do jego obsługi, ponieważ w realnych aplikacjach spotkasz też sesje i cookies, więc wiele API jest po prostu "REST-like", a nie całkiem idealnie stateless.
3. Cacheable
Odpowiedzi mogą być cachowane (nagłówki Cache-Control, ETag).
4. Uniform Interface
Jednolity interfejs — standardowe metody HTTP, format URL, kody statusu.
5. Layered System
Klient nie wie, czy komunikuje się z serwerem końcowym, czy pośrednikiem (load balancer, cache).
Struktura URL
Zasoby (Resources)
URL reprezentuje zasoby (rzeczowniki), a nie akcje, tak więc:
Code
✅ Dobrze (rzeczowniki):
GET /users
GET /users/123
GET /users/123/posts
❌ Źle (czasowniki):
GET /getUsers
GET /getUserById/123
POST /createUser
Kolekcje vs pojedyncze zasoby
Code
/users → kolekcja wszystkich użytkowników
/users/123 → pojedynczy użytkownik o ID 123
/users/123/posts → posty użytkownika 123
Zagnieżdżone zasoby
Code
GET /users/123/posts → posty użytkownika
GET /users/123/posts/456 → konkretny post użytkownika
GET /posts/456/comments → komentarze do posta
GET /users?status=activeGET /users?role=admin&status=activeGET /products?category=electronics&minPrice=100&maxPrice=500GET /posts?author=123&createdAfter=2025-01-01
GET /api/usersAccept: application/vnd.myapp.v2+json# lub dedykowany nagłówek:API-Version: 2
W query parameter
Code
GET /api/users?version=2
Rekomendacja: Wersjonowanie w URL jest najprostsze i najbardziej widoczne, ale nie każde API musi zaczynać od /v1, dlatego czasami wystarczy po prostu dobra kompatybilność wstecz i przemyślane polityki zmian.
Autoryzacja
Bearer Token (JWT)
Code
GET /api/usersAuthorization: Bearer eyJhbGciOiJIUzI1NiIs...
W praktyce jest to rzadko w pełni implementowane, ale warto chociaż poznać koncept.
Przykład: API do bloga
Endpoints
Code
# Posty
GET /api/v1/posts # lista postów
GET /api/v1/posts/:id # pojedynczy post
POST /api/v1/posts # utwórz post
PUT /api/v1/posts/:id # aktualizuj post
DELETE /api/v1/posts/:id # usuń post
# Komentarze
GET /api/v1/posts/:id/comments # komentarze do posta
POST /api/v1/posts/:id/comments # dodaj komentarz
DELETE /api/v1/posts/:id/comments/:cid # usuń komentarz
# Użytkownicy
GET /api/v1/users/:id # profil użytkownika
GET /api/v1/users/:id/posts # posty użytkownika
Przykładowe żądania
Code
# Lista postów z filtrowaniem i paginacjąGET /api/v1/posts?status=published&sort=-createdAt&page=1&perPage=10# Utwórz postPOST /api/v1/postsAuthorization: Bearer <token>Content-Type: application/json{ "title": "Mój nowy post", "content": "Treść posta...", "tags": ["javascript", "react"]}# Odpowiedź201 Created{ "id": 456, "title": "Mój nowy post", "slug": "moj-nowy-post", "content": "Treść posta...", "author": { "id": 123, "name": "Jan" }, "tags": ["javascript", "react"], "createdAt": "2025-01-15T10:30:00Z"}
FAQ
Czym jest REST API i jak działa?
REST (Representational State Transfer) to styl architektoniczny dla API opartych na HTTP. Klient wysyła request do serwera wskazując zasób (URL) i operację (metoda HTTP), serwer zwraca reprezentację zasobu (najczęściej JSON). REST nie jest protokołem — to zbiór konwencji: zasoby jako rzeczowniki w URL, standaryzowane metody HTTP, odpowiednie kody statusu. Większość API w praktyce to "REST-like" HTTP API, nie idealnie zgodne z akademicką definicją.
Jaka jest różnica między PUT a PATCH?
PUT zamienia cały zasób — wysyłasz pełną reprezentację zasobu, serwer go zastępuje. Brakujące pola mogą być wyzerowane lub usunięte. PATCH aktualizuje tylko przekazane pola — wysyłasz tylko to, co chcesz zmienić, reszta pozostaje bez zmian. W praktyce: PATCH jest wygodniejszy do cząstkowych aktualizacji (zmiana emaila, statusu), PUT przy zastąpieniu całego obiektu.
Jaka jest różnica między 401 a 403?
401 Unauthorized — brak autentykacji: użytkownik nie jest zalogowany, token jest nieważny lub wygasł. Nazwa jest myląca — w praktyce chodzi o autentykację, nie autoryzację. 403 Forbidden — brak uprawnień: użytkownik jest zaautentykowany, ale nie ma prawa do tej operacji (np. zwykły user próbuje usunąć cudzego posta). Prosta reguła: 401 = "zaloguj się", 403 = "nie wolno Ci".
REST vs GraphQL — co wybrać?
REST jest prostszy w implementacji, lepiej cachuje (GET do CDN, czyli Content Delivery Network, przyspiesza dostarczanie zasobów z serwerów bliższych użytkownikowi.), jest bardziej przewidywalny i ma szerokie wsparcie narzędzi. GraphQL daje klientowi kontrolę nad kształtem danych (mniej over/under-fetchingu), lepiej sprawdza się przy złożonych, połączonych danych i wielu frontendach o różnych potrzebach. Dla większości aplikacji REST jest wystarczający i prostszy w utrzymaniu. GraphQL warto rozważyć przy publicznym API z wieloma konsumentami lub dużej złożoności grafu danych.
Jak wersjonować REST API?
Najpopularniejsza i najbardziej widoczna metoda to wersjonowanie w URL: /api/v1/users, /api/v2/users. Alternatywy to wersjonowanie przez nagłówek Accept: application/vnd.app.v2+json lub query parameter ?version=2. Praktyczna zasada: zacznij od /v1 już przy pierwszym publicznym release'ie — dodanie wersjonowania do istniejącego, bezwersyjnego API jest samo w sobie breaking change dla wszystkich jego konsumentów.
Co to jest idempotencja i dlaczego ważna w API?
Idempotentna operacja to taka, którą można wywołać wielokrotnie z tym samym skutkiem, czyli GET, PUT, DELETE są idempotentne, a ich kilkukrotne wywołanie nie zmienia efektu. POST nie jest idempotentny, ponieważ każde wywołanie tworzy nowy zasób. Praktyczne zastosowanie jest takie, że przy timeoutach i retriable requestach idempotency key (unikalny identyfikator requestu w nagłówku) pozwala serwerowi rozpoznać duplikat i nie wykonać operacji drugi raz, co jest kluczowe przy płatnościach.
Jak obsługiwać błędy w REST API?
Dobry format błędu zawiera: kod HTTP (4xx dla błędów klienta, 5xx dla serwera), maszynoczytelny kod błędu (np. VALIDATION_ERROR, NOT_FOUND), komunikat dla developera i opcjonalnie szczegóły (lista błędów walidacji z polami). Unikaj zwracania 200 OK z błędem w body, ponieważ to utrudnia obsługę i cache. Bądź przy tym konsekwentny w formacie błędów przez całe API, bo jak pokazuje doświadczenie, to częsty problem.
Jeśli chcesz uporządkować backendowe fundamenty aplikacji i uniknąć typowych błędów architektonicznych już na starcie, skontaktuj się ze mną. Pomagam przekładać wiedzę techniczną na rozwiązania, które da się sensownie utrzymać i rozwijać.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.
Google Search Console + Next.js — indeksacja, błędy, performance i co z nimi robić
Jak korzystać z Google Search Console dla strony Next.js? Weryfikacja, sitemap, indeksacja, Core Web Vitals, crawl budget i najczęstsze problemy — praktyczny poradnik.