REST API — co to jest i jak zacząć? Przewodnik z przykładami w curl i Pythonie
REST API — co to jest, jak działa i jak zacząć z niego korzystać? Metody HTTP, kody odpowiedzi, JSON, pierwsze zapytania w curl i własne API w Pythonie.

W skrócie
- REST API to interfejs, w którym aplikacje wymieniają dane przez HTTP: zasoby mają adresy URL, a operacje wykonuje się metodami GET, POST, PUT, PATCH i DELETE.
- REST to styl architektury (Roy Fielding, 2000), a nie protokół ani standard — „RESTowość” API to kwestia przestrzegania jego zasad.
- Najważniejsze zasady: bezstanowość, jednolity interfejs, zasoby identyfikowane adresem, możliwość cache’owania odpowiedzi.
- Odpowiedź serwera to kod statusu (np. 200, 201, 404) plus treść, dziś prawie zawsze w JSON.
- Na start wystarczy curl lub Postman i publiczne testowe API, a własne API postawisz w kilkanaście minut np. w FastAPI.
Spis treści
REST API to interfejs, przez który aplikacje komunikują się ze sobą za pomocą protokołu HTTP: każdy zasób (np. użytkownik, zamówienie) ma swój adres URL, a operacje na nim wykonujesz standardowymi metodami GET, POST, PUT, PATCH i DELETE. Serwer odpowiada kodem statusu i danymi — dziś niemal zawsze w formacie JSON.
Z REST API korzystasz codziennie, nawet o tym nie wiedząc: aplikacja pogodowa pobiera prognozę, sklep internetowy sprawdza status płatności, a aplikacja mobilna banku pokazuje saldo. Poniżej wyjaśniam, jak to działa, i pokazuję, jak samodzielnie wysłać pierwsze zapytania oraz postawić własne, małe API.
REST API — co to jest i skąd się wzięło
REST (Representational State Transfer) to styl architektury systemów rozproszonych opisany przez Roya Fieldinga w jego rozprawie doktorskiej z 2000 roku. Fielding był jednym z autorów specyfikacji HTTP, więc REST od początku był „skrojony” pod sieć WWW.
API (Application Programming Interface) to po prostu umowa: jakie zapytania możesz wysłać i jakie odpowiedzi dostaniesz. REST API to więc API webowe zbudowane według zasad REST.
Ważne rozróżnienie: REST nie jest protokołem ani standardem jak SOAP. Nie ma oficjalnej specyfikacji „REST API”, którą można zwalidować. Dlatego w praktyce spotkasz API w pełni zgodne z zasadami Fieldinga, ale też takie, które nazywają się RESTowe, a są po prostu „JSON przez HTTP”.
Sześć zasad architektury REST
Fielding zdefiniował zestaw ograniczeń (constraints). API, które je spełnia, jest RESTful.
- Klient–serwer — interfejs użytkownika jest oddzielony od przechowywania danych. Aplikacja mobilna i strona WWW mogą korzystać z tego samego API.
- Bezstanowość — każde zapytanie zawiera wszystko, czego serwer potrzebuje do jego obsłużenia (np. token uwierzytelniający). Serwer nie pamięta „sesji” klienta między zapytaniami, dzięki czemu łatwo dołożyć kolejne serwery za load balancerem.
- Cache’owalność — odpowiedź musi określać, czy można ją przechowywać w pamięci podręcznej (nagłówki
Cache-Control,ETag). To odciąża serwer. - Jednolity interfejs — zasoby identyfikowane są adresami URI, operuje się na nich za pomocą reprezentacji (np. JSON), a komunikaty są samoopisowe (metoda, nagłówki, kod statusu).
- System warstwowy — między klientem a serwerem mogą stać proxy, CDN czy bramka API, a klient nie musi o nich wiedzieć.
- Kod na żądanie (opcjonalnie) — serwer może przesłać klientowi kod do wykonania, np. skrypt JavaScript.

Część jednolitego interfejsu stanowi też HATEOAS — odpowiedź zawiera linki do powiązanych akcji i zasobów. W praktyce mało które publiczne API wdraża to w pełni, ale warto znać to pojęcie, bo pojawia się na rozmowach rekrutacyjnych.
Zasoby i adresy URL: jak wygląda endpoint
W REST myślisz rzeczownikami, nie czasownikami. Zasobem jest „użytkownik”, a nie „pobierzUżytkownika”. Typowa struktura adresów:
GET /api/v1/users → lista użytkowników
GET /api/v1/users/42 → użytkownik o id 42
POST /api/v1/users → utworzenie użytkownika
PATCH /api/v1/users/42 → zmiana wybranych pól
DELETE /api/v1/users/42 → usunięcie
GET /api/v1/users/42/orders → zamówienia użytkownika 42
GET /api/v1/orders?status=paid&page=2&limit=20 → filtrowanie i stronicowanie
Dobre praktyki, które ułatwią życie Tobie i użytkownikom API:
- nazwy zasobów w liczbie mnogiej i małymi literami (
/users,/orders), - filtrowanie, sortowanie i stronicowanie w parametrach zapytania, a nie w ścieżce,
- wersja API w ścieżce (
/v1/) lub nagłówku — pozwala zmieniać API bez psucia starych klientów, - zagnieżdżanie najwyżej na jeden poziom (
/users/42/orders, ale już nie/users/42/orders/7/items/3/...).
Metody HTTP w REST API
Metoda mówi serwerowi, co chcesz zrobić z zasobem. Dwie cechy są tu istotne: metoda bezpieczna nie zmienia stanu serwera, a idempotentna daje ten sam efekt bez względu na to, ile razy ją powtórzysz.
| Metoda | Do czego służy | Bezpieczna | Idempotentna |
|---|---|---|---|
| GET | pobranie zasobu lub listy | tak | tak |
| POST | utworzenie zasobu, wykonanie akcji | nie | nie |
| PUT | zastąpienie całego zasobu | nie | tak |
| PATCH | częściowa zmiana zasobu | nie | nie (zwykle) |
| DELETE | usunięcie zasobu | nie | tak |
| HEAD / OPTIONS | nagłówki bez treści / dozwolone metody (m.in. CORS) | tak | tak |
Idempotentność ma praktyczne znaczenie: jeśli połączenie zerwie się w trakcie PUT, klient może bezpiecznie ponowić zapytanie. Powtórzony POST może natomiast utworzyć duplikat — np. drugie zamówienie. Dlatego API płatności często wymagają nagłówka typu Idempotency-Key.

Kody odpowiedzi HTTP, które musisz znać
Kod statusu to pierwsza rzecz, którą sprawdza klient. Najczęściej spotykane:
| Kod | Znaczenie | Kiedy go zwracać |
|---|---|---|
| 200 OK | sukces | GET, PUT, PATCH z treścią odpowiedzi |
| 201 Created | utworzono zasób | po POST, z nagłówkiem Location |
| 204 No Content | sukces bez treści | np. po DELETE |
| 400 Bad Request | błędne zapytanie | niepoprawny JSON, brak wymaganych pól |
| 401 Unauthorized | brak uwierzytelnienia | brak lub nieważny token |
| 403 Forbidden | brak uprawnień | zalogowany, ale bez dostępu |
| 404 Not Found | zasób nie istnieje | błędne id |
| 409 Conflict | konflikt stanu | np. e-mail już zajęty |
| 422 Unprocessable Content | dane nie przeszły walidacji | poprawny JSON, złe wartości |
| 429 Too Many Requests | przekroczony limit | rate limiting |
| 500 Internal Server Error | błąd serwera | nieobsłużony wyjątek |
Treść błędu warto zwracać w przewidywalnym formacie. Standardem jest „Problem Details” z RFC 9457 (application/problem+json) z polami type, title, status i detail.
Jak zacząć: pierwsze zapytania do REST API w curl
Najszybciej zrozumiesz REST, wysyłając prawdziwe zapytania. Dobrym poligonem jest publiczne testowe API JSONPlaceholder, które udaje serwis z postami i użytkownikami. Narzędzie curl jest wbudowane w Linuxa, macOS i Windows 10/11.
- Pobierz jeden zasób (GET):
curl -i https://jsonplaceholder.typicode.com/posts/1
Przełącznik -i pokazuje nagłówki odpowiedzi — zobaczysz HTTP/2 200 i content-type: application/json.
- Pobierz listę z filtrem w parametrze zapytania:
curl "https://jsonplaceholder.typicode.com/posts?userId=1"
- Utwórz zasób (POST z danymi JSON):
curl -i -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "Mój pierwszy post", "body": "Treść", "userId": 1}'
Serwer odpowie kodem 201 Created i zwróci obiekt z nadanym id. To API tylko symuluje zapis, więc dane nie zostaną trwale dodane.
- Sprawdź błąd — zapytaj o nieistniejący zasób:
curl -i https://jsonplaceholder.typicode.com/posts/99999
Dostaniesz 404 Not Found. Tak samo będzie się zachowywać każde dobrze zaprojektowane API.
Wskazówka: W PowerShellu
curlbywa aliasemInvoke-WebRequest(w Windows PowerShell 5.1). Wpiszcurl.exe, żeby mieć pewność, że uruchamiasz prawdziwy curl, albo użyjInvoke-RestMethod, który od razu zamienia JSON na obiekty.
Jeśli wolisz interfejs graficzny, te same zapytania wyślesz w Postmanie, Insomni, Bruno albo rozszerzeniu REST Client w VS Code. W przeglądarce samo wejście na adres to zapytanie GET, a zakładka „Sieć” w narzędziach deweloperskich (F12) pokazuje, z jakich API korzysta dana strona.
Uwierzytelnianie w REST API
Ponieważ REST jest bezstanowy, każde zapytanie musi samo udowodnić, kto je wysyła. Najpopularniejsze metody:
- Klucz API — stały ciąg w nagłówku (np.
X-API-Key) lub parametrze. Prosty, typowy dla publicznych usług, np. Google Maps API. - Bearer token — nagłówek
Authorization: Bearer <token>, często w formacie JWT, wydawany po zalogowaniu. - OAuth 2.0 — gdy aplikacja działa w imieniu użytkownika innego serwisu („Zaloguj przez Google”).
curl https://api.example.com/v1/me \
-H "Authorization: Bearer TWOJ_TOKEN"
Uwaga: Nigdy nie umieszczaj kluczy API ani tokenów w kodzie frontendu, publicznym repozytorium czy w adresie URL. Trzymaj je w zmiennych środowiskowych, a w przeglądarce unikaj zapisywania tokenów w Local Storage, jeśli aplikacja jest podatna na XSS.
Gdy API korzysta z ciasteczek sesyjnych zamiast tokenów w nagłówku, musisz dodatkowo zabezpieczyć je przed atakami CSRF.
Własne REST API w 10 minut: przykład w FastAPI
Najlepszy sposób, żeby zrozumieć REST od drugiej strony, to napisać serwer. Poniżej minimalne API w Pythonie z frameworkiem FastAPI (dane trzymane w pamięci, bez bazy).
- Zainstaluj FastAPI:
pip install "fastapi[standard]"
- Utwórz plik
main.py:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class Task(BaseModel):
title: str
done: bool = False
tasks: dict[int, Task] = {}
next_id = 1
@app.get("/tasks")
def list_tasks():
return [{"id": i, **t.model_dump()} for i, t in tasks.items()]
@app.get("/tasks/{task_id}")
def get_task(task_id: int):
if task_id not in tasks:
raise HTTPException(status_code=404, detail="Nie ma takiego zadania")
return {"id": task_id, **tasks[task_id].model_dump()}
@app.post("/tasks", status_code=201)
def create_task(task: Task):
global next_id
tasks[next_id] = task
next_id += 1
return {"id": next_id - 1, **task.model_dump()}
@app.delete("/tasks/{task_id}", status_code=204)
def delete_task(task_id: int):
if tasks.pop(task_id, None) is None:
raise HTTPException(status_code=404, detail="Nie ma takiego zadania")
- Uruchom serwer deweloperski:
fastapi dev main.py
- Otwórz
http://127.0.0.1:8000/docs— FastAPI automatycznie generuje dokumentację w formacie OpenAPI, w której możesz klikać i testować endpointy.
Ten sam wzorzec znajdziesz w każdym frameworku: Express w Node.js, Spring Boot w Javie, ASP.NET Core w C# czy Laravel w PHP. Zmienia się składnia, ale zasoby, metody i kody statusu pozostają takie same. Logikę wspólną dla wielu endpointów, jak sprawdzanie tokenu czy logowanie zapytań, umieszcza się zwykle w middleware.
Nie zawsze trzeba pisać kod, żeby połączyć dwa systemy przez API. Platformy automatyzacji, takie jak n8n czy Make, wywołują endpointy REST z wizualnego edytora — to dobry sposób, by przetestować integrację, zanim zbudujesz własne rozwiązanie.
REST, SOAP, GraphQL czy gRPC — co wybrać
REST nie jest jedynym sposobem budowania API. Najczęściej porównuje się go z trzema alternatywami:
| Cecha | REST | SOAP | GraphQL | gRPC |
|---|---|---|---|---|
| Format | dowolny, zwykle JSON | XML | JSON | Protocol Buffers (binarny) |
| Transport | HTTP | najczęściej HTTP | HTTP, jeden endpoint | HTTP/2 |
| Kontrakt | opcjonalny (OpenAPI) | obowiązkowy (WSDL) | schemat GraphQL | pliki .proto |
| Typowe zastosowanie | publiczne API, aplikacje web i mobilne | systemy bankowe, administracja, starsze integracje | złożone frontendy pobierające dane z wielu źródeł | komunikacja między mikroserwisami |
REST wygrywa prostotą, wsparciem cache’owania HTTP i tym, że da się go „przeklikać” w przeglądarce. GraphQL rozwiązuje problem pobierania zbyt wielu lub zbyt mało danych naraz. gRPC jest szybszy i ściśle typowany, ale trudniej go debugować i wywołać z przeglądarki. SOAP spotkasz głównie przy integracjach z dużymi, starszymi systemami — tam przyda się umiejętność czytania plików XML.
Plan nauki REST API krok po kroku
Jeśli zaczynasz, przejdź tę ścieżkę w tej kolejności:
- Wyślij kilka zapytań GET, POST i DELETE do testowego API w curl i w Postmanie. Obserwuj nagłówki i kody statusu.
- Podłącz się do prawdziwego publicznego API z dokumentacją (np. GitHub API, pogoda, kursy walut NBP) i przeczytaj, jak opisuje endpointy i uwierzytelnianie.
- Napisz własne API z jednym zasobem (CRUD) w wybranym frameworku, najpierw w pamięci, potem z bazą danych.
- Dodaj walidację danych, poprawne kody błędów, stronicowanie i uwierzytelnianie tokenem.
- Opisz API w OpenAPI i dopisz testy automatyczne endpointów.
Po tych pięciu krokach będziesz rozumieć REST lepiej niż wiele osób, które używają go od lat, ale nigdy nie zajrzały, co dzieje się „pod spodem”.
Najczęściej zadawane pytania
REST API — co to jest w prostych słowach?
To sposób, w jaki jedna aplikacja prosi drugą o dane lub zmianę danych przez internet. Klient wysyła zapytanie HTTP na konkretny adres, a serwer odpowiada kodem statusu i danymi, zwykle w formacie JSON.
Czym różni się REST API od zwykłego API?
API to ogólne pojęcie oznaczające dowolny interfejs programistyczny. REST API to konkretny rodzaj API webowego, zbudowany według zasad architektury REST i oparty na metodach oraz kodach HTTP.
Czym się różni PUT od PATCH?
PUT zastępuje cały zasób nową reprezentacją, więc trzeba wysłać wszystkie pola. PATCH zmienia tylko wskazane pola, np. sam adres e-mail użytkownika.
Czy REST API musi używać JSON?
Nie. REST nie narzuca formatu danych, może to być XML, CSV czy HTML. W praktyce zdecydowana większość nowych API zwraca JSON, a format wybiera się nagłówkami Accept i Content-Type.
Od czego zacząć naukę REST API?
Od wysłania kilku zapytań GET i POST do publicznego testowego API w curl lub Postmanie i obserwowania kodów odpowiedzi. Potem napisz własne proste API z kilkoma endpointami w wybranym frameworku.
Autor
Założyciel i redaktor XAD.pl. Pisze o sieciach, bezpieczeństwie IT, administracji systemami Windows i Linux oraz o sprzęcie, który sprawia ludziom problemy na co dzień.


