Jak zbudować REST API: projekt, bezpieczeństwo i wdrożenie
Aby zbudować REST API, wypisz zasoby, którymi zarządza Twoja aplikacja (użytkownicy, zamówienia, rezerwacje), nadaj każdemu adres URL, na przykład /orders i /orders/{id}, a do działań użyj metod HTTP: GET do odczytu, POST do tworzenia, PATCH do aktualizacji, DELETE do usuwania. Zwracaj dane w JSON z sensownymi kodami statusu, waliduj każde wejście, wymagaj uwierzytelnienia i sprawdzania uprawnień do rekordu po stronie serwera oraz stronicuj listy. Następnie udokumentuj endpointy i wdróż API za HTTPS.
Ten poradnik opisuje decyzje projektowe, przykładowy zestaw tras, prompty dla narzędzia AI do budowania aplikacji oraz błędy, które prowadzą do luk bezpieczeństwa. Jeśli API jest dla Ciebie nowością, zacznij od czym jest API.
Kiedy potrzebujesz REST API
- Twój frontend webowy musi zapisywać i wczytywać dane z serwera
- Aplikacja mobilna, partner lub narzędzie automatyzacji potrzebuje dostępu do Twoich danych
- Inne usługi wysyłają do Ciebie zdarzenia (webhooki)
- Dzielisz pracę między zespołem frontendu a backendu
REST jest najpopularniejszym stylem, ale nie jedynym. REST kontra GraphQL wyjaśnia, kiedy lepiej sprawdza się jeden elastyczny endpoint zapytań.
Najpierw projekt: zasoby i trasy
Zapisz rzeczowniki występujące w Twojej aplikacji i to, co ludzie z nimi robią. Dla prostej aplikacji rezerwacji:
| Metoda | Trasa | Co robi | Kod sukcesu |
|---|---|---|---|
GET | /api/bookings | Listuje rezerwacje wywołującego (z paginacją) | 200 |
POST | /api/bookings | Tworzy rezerwację | 201 |
GET | /api/bookings/{id} | Pobiera jedną rezerwację | 200 |
PATCH | /api/bookings/{id} | Zmienia wybrane pola | 200 |
DELETE | /api/bookings/{id} | Anuluje rezerwację | 204 |
GET | /api/health | Sprawdzenie stanu dla monitoringu | 200 |
Te operacje odpowiadają tworzeniu, odczytowi, aktualizacji i usuwaniu; zobacz czym jest CRUD. Warte przestrzegania konwencje:
- Rzeczowniki w liczbie mnogiej, bez czasowników w adresach:
/bookings, a nie/getBookings. - Zagnieżdżaj tylko jeden poziom, gdy wyjaśnia to przynależność:
/bookings/{id}/notes. - Działania niebędące CRUD mogą być pod-zasobami:
POST /bookings/{id}/canceljest czytelniejsze niż tajemnicze PATCH. - Spójne nazewnictwo pól, na przykład
created_atwszędzie.
Kody statusu i błędy
Używaj standardowych kodów HTTP, aby klienci wiedzieli, co się stało, bez analizowania tekstu:
| Kod | Znaczenie | Kiedy używać |
|---|---|---|
| 200 | OK | Udany odczyt lub aktualizacja |
| 201 | Created | POST utworzył zasób |
| 204 | No Content | Sukces bez zwracanej treści |
| 400 | Bad Request | Dane wejściowe nie przeszły walidacji |
| 401 | Unauthorized | Brak logowania lub nieprawidłowy token |
| 403 | Forbidden | Zalogowany, ale bez uprawnień |
| 404 | Not Found | Nie istnieje lub wywołujący nie może wiedzieć, że istnieje |
| 409 | Conflict | Duplikat lub termin jest już zajęty |
| 429 | Too Many Requests | Przekroczono limit zapytań |
| 500 | Server Error | Coś się zepsuło po Twojej stronie |
Zwracaj błędy w jednym, spójnym kształcie JSON, na przykład {"error": {"code": "slot_taken", "message": "Ten termin nie jest już dostępny."}}, i nigdy nie dołączaj do odpowiedzi śladów stosu ani błędów bazy danych.
Opcje i kompromisy
| Decyzja | Prosty wybór | Alternatywa |
|---|---|---|
| Gdzie znajduje się API | Trasy API w Twoim frameworku webowym | Osobny serwis API, przydatny przy kilku klientach lub innym języku |
| Uwierzytelnianie | Ciasteczka sesyjne dla Twojej aplikacji webowej | Tokeny (bearer tokens lub klucze API) dla aplikacji mobilnych i zewnętrznych podmiotów |
| Paginacja | ?page=2&limit=20 | Kursorowa (?after=...), stabilniejsza przy dużych, zmieniających się listach |
| Wersjonowanie | Brak, dopóki nie masz zewnętrznych użytkowników | /v1/ w ścieżce, gdy inni zaczynają od tego zależeć |
| Dokumentacja | README z listą tras | Specyfikacja OpenAPI, z której narzędzia tworzą interaktywną dokumentację i kod klienta |
Krok po kroku
- Wypisz zasoby i trasy jak wyżej, wraz z tym, kto może każdą wywołać.
- Zamodeluj dane w bazie danych z polami i relacjami, których potrzebujesz.
- Najpierw zbuduj trasy odczytu, potem tworzenie, aktualizację i usuwanie.
- Waliduj dane wejściowe przy każdym zapisie za pomocą biblioteki schematów: pola wymagane, typy, długości, dozwolone wartości. Odrzucaj nieznane pola.
- Dodaj uwierzytelnianie, a potem autoryzację per rekord: otwarcie
/bookings/42musi sprawdzić, czy rezerwacja 42 należy do wywołującego, a nie tylko to, czy ktoś jest zalogowany. - Stronicuj każdą listę i ogranicz rozmiar strony.
- Ogranicz liczbę zapytań dla logowania i kosztownych tras. Zobacz limitowanie zapytań.
- Skonfiguruj CORS tylko wtedy, gdy przeglądarki z innych domen muszą wywoływać API, i wymień te źródła jawnie. Jak naprawić błędy CORS wyjaśnia błędy, które zobaczysz.
- Napisz dokumentację i testy dla każdej trasy, w tym przypadków błędów.
- Wdróż z sekretami w zmiennych środowiskowych, HTTPS, logami i sprawdzaniem stanu.
Prompty dla narzędzia AI do budowania
Szkielet:
Utwórz REST API dla rezerwacji z tymi trasami: GET /api/health, GET /api/bookings (z paginacją, maks. 50 na stronę), POST /api/bookings, GET /api/bookings/:id, PATCH /api/bookings/:id, DELETE /api/bookings/:id. Przechowuj dane w naszej bazie danych. Waliduj treść zapytań za pomocą biblioteki schematów i odrzucaj nieznane pola. Zwracaj błędy JSON w postaci {"error": {"code", "message"}} z poprawnymi kodami statusu (400, 401, 403, 404, 409). Trzymaj sekrety w zmiennych środowiskowych.
Bezpieczeństwo:
Wymagaj logowania na każdej trasie bookings. Przy każdym odczycie, aktualizacji i usunięciu sprawdzaj po stronie serwera, czy rezerwacja należy do bieżącego użytkownika; jeśli nie, zwróć 404. Nigdy nie akceptuj identyfikatorów użytkowników ani ról z treści zapytania. Ogranicz POST /api/bookings do 20 na minutę na użytkownika. Zapisuj błędy na serwerze bez zwracania śladów stosu.
Dokumentacja:
Napisz opis OpenAPI tych tras oraz krótkie README z przykładowymi zapytaniami i odpowiedziami dla każdej z nich.
Testowanie API
Testuj z zewnątrz frontendu, bo zrobią to atakujący:
- Każda trasa działa dla poprawnych danych i zwraca opisany kształt oraz kod
- Brakujące lub nieprawidłowe pola zwracają 400 z czytelnym komunikatem
- Brak tokenu zwraca 401 na każdej chronionej trasie
- Użytkownik A żądający rekordu użytkownika B przez ID dostaje 404 lub 403
- Listy są stronicowane, a ogromny
limitjest ograniczony - Zduplikowane lub kolidujące tworzenie zwraca 409, a nie 500
- Limity zapytań zwracają 429
- Odpowiedzi błędów nie zawierają śladów stosu, SQL ani sekretów
- CORS zezwala tylko na zamierzone źródła
Częste błędy
- Sprawdzanie logowania, ale nie własności rekordu. Najczęstsza dziura w API: każdy zalogowany użytkownik może odczytać dowolny rekord, zmieniając ID.
- Ufanie klientowi. Ceny, role i identyfikatory użytkowników z treści zapytania można edytować.
- Zwracanie całych wierszy bazy danych. Hasze haseł i pola wewnętrzne wyciekają. Wybierz, co ma zawierać każda odpowiedź.
- Nieograniczone listy. Jedno zapytanie o wszystkie rekordy może spowolnić całą aplikację.
200 OKz komunikatem błędu w środku. Klienci i monitoring nie wiedzą, że coś się nie udało.- CORS ustawiony na zezwalanie na wszystko w API, które używa ciasteczek.
- Brak sprawdzania stanu i logów, więc o awariach dowiadujesz się od użytkowników.
Aby zrobić szerszy przegląd przed startem, zobacz listę kontrolną bezpieczeństwa dla aplikacji zbudowanych z AI.
Budowanie REST API w Mythex
W Mythex możesz poprosić o API jako część aplikacji lub jako osobny serwis. Przepis w dokumentacji REST API backend zawiera gotowy prompt startowy: nazwij framework i trasy, poproś o czytelne błędy JSON, trzymaj sekrety w zmiennych środowiskowych i dołącz Dockerfile. Backendy kontenerowe w Node, Pythonie, C#, Javie i innych są publikowane przez Dockerfile, a wdrożeniem z menu Publish zajmuje się Mythex (backendy API). Projekt może uruchamiać stronę i serwer API obok siebie, a między nimi przełączać się w podglądzie. Klucze przechowuj jako sekrety projektu, a jeśli API potrzebuje bazy danych, poproś o nią w czacie. Pracę cykliczną wokół API opisuje jak uruchamiać zadania w tle.
Pytania
Czym jest REST API?
REST API to sposób, w jaki programy mogą pracować z danymi Twojej aplikacji przez HTTP. Każdy rodzaj danych jest zasobem z własnym adresem URL, na przykład /orders, a standardowe metody wykonują na nim działania: GET do odczytu, POST do tworzenia, PATCH lub PUT do aktualizacji i DELETE do usuwania. Dane są zwykle przesyłane w formacie JSON.
W jakim języku powinienem zbudować REST API?
Użyj tego, co Ty lub Twój zespół potraficie utrzymać. Node.js z Express lub Fastify, Python z FastAPI oraz frameworki C# lub Java sprawdzą się dobrze. Zasady projektowania tras, kodów statusu, walidacji i uwierzytelniania są ważniejsze niż sam język.
Jak zabezpieczyć REST API?
Wymagaj uwierzytelnienia na każdej trasie, która nie jest publiczna, sprawdzaj po stronie serwera, czy wywołujący ma dostęp do konkretnego rekordu, waliduj wszystkie dane wejściowe, używaj HTTPS, ogranicz liczbę zapytań i przechowuj sekrety w zmiennych środowiskowych. Nigdy nie ufaj identyfikatorom ani rolom przesłanym przez klienta.
Czy potrzebuję osobnego backendu dla REST API?
Nie zawsze. Frameworki takie jak Next.js potrafią obsługiwać trasy API obok stron. Osobny serwis API ma sens, gdy z API korzysta kilku klientów (web, mobile, partnerzy) albo gdy wymaga on własnego języka lub skalowania.