API REST dla początkujących: zasoby, metody, kody stanu i brak stanu
Przewodnik w prostym języku wyjaśniający, czym jest REST API, pięć zasad umożliwiających jego funkcjonowanie, gdzie jest wykorzystywany w rzeczywistych zespołach oraz jak stworzyć i przetestować swój pierwszy REST API.
Źródła: REST API Explained for Beginners: What It Actually Is and Why It Matters
"Naucz się REST API" to rada, którą słyszy każdy nowy programista, jednak rzadko towarzyszy jej jasne wyjaśnienie znaczenia tego zwrotu. Większość wyjaśnień albo zalewa czytelnika słownictwem (czasowniki, punkty końcowe, brak stanu), albo sprowadza je do „czegoś, co łączy frontend z backendem”, co jest prawdą, ale nie dostarcza żadnych przydatnych informacji.
Ten przewodnik obiera środkową drogę. Poznasz pięć zasad, które stanowią podstawę niemal każdego REST API, model mentalny ułatwiający ich zapamiętanie, miejsca, w których REST występuje w codziennej pracy inżynierskiej, oraz praktyczną sekwencję kroków do stworzenia i przetestowania swojego pierwszego API przy użyciu Node.js i Express, wraz z błędami, które najczęściej spowalniają początkujących.
Krótka definicja
REST API to zbiór konwencji umożliwiających komunikację między dwoma programami przez Internet. Najczęściej chodzi o interfejs użytkownika, który prosi serwer o dane lub o ich zapisanie. Pomysł wydaje się abstrakcyjny, dopóki go nie stworzysz – wtedy szybko staje się zrozumiały. Dlatego REST jest zazwyczaj jednym z pierwszych rzeczywiście istotnych pojęć związanych z serwerem, których uczą się ludzie, niezależnie od tego, czy będą specjalizować się w pracy po stronie serwera, czy zostaną deweloperami full stack, zajmującymi się obiema stronami aplikacji.
REST to skrót od Representational State Transfer – styl architektoniczny sformalizowany w celu opisania sposobu, w jaki powinna funkcjonować sama sieć internetowa. Aby dobrze go używać, nie potrzebujesz formalnej teorii; to poniższe praktyczne konwencje stanowią podstawę rzeczywistych REST API.
Dlaczego REST tak bardzo myli początkujących
Dwie rzeczy sprawiają, że ten temat jest trudniejszy, niż powinien być.
Pierwszym problemem jest zmienność słownictwa. W internecie termin „API” jest używany niemal dla każdej interfejsu, który jeden program oferuje drugiemu: API przeglądarki, funkcje biblioteki, usługa chmurowa. REST to jeden konkretny i bardzo popularny sposób projektowania API internetowych. Ze względu na jego powszechność ludzie często mówią „API”, mając na myśli „REST API”, przez co osoby uczące się nie wiedzą, gdzie kończy się jeden koncepcja, a zaczyna druga.
Drugim problemem jest to, że API nie ma żadnej wizualnej formy. Przycisk lub układ jest czymś, co można zobaczyć; REST API tak nie jest. Możliwe jest budowanie projektów frontendowych przez tygodnie, traktując „wywołanie API” jako czarną skrzynkę. Zamieszanie pojawia się zwykle wtedy, gdy w końcu trzeba stworzyć własne API, a koncepcja musi stać się natychmiast konkretna.
Pięć zasad leżących u podstaw każdego REST API
Pozbawione skrótów, REST API to uzgodniony sposób żądania i wysyłania danych przez HTTP przy użyciu adresów URL wraz z małą liczbą standardowych działań. Pięć podstawowych koncepcji obejmuje niemal wszystko.
Zasoby i ich adresy URL
Zasób to coś, czym zarządza API: użytkownicy, wpisy, zamówienia, zadania. Każdy zasób lub zbiór zasobów ma swój własny adres. /users odnosi się zazwyczaj do zbioru użytkowników, natomiast /orders/42 odnosi się do konkretnego zamówienia. Dobry projekt REST używa rzeczowników do nazewnictwa zasobów i pozwala metodom HTTP opisywać wykonywane działania, dlatego widzimy /orders/42 zamiast /getOrder?id=42.
Metody HTTP
Metoda informuje serwer o tym, co chcemy zrobić z zasobem:
GETodczytuje dane bez ich modyfikacji.
POST tworzy coś nowego, zazwyczaj wewnątrz kolekcji takiej jak /tasks.PUT zastępuje istniejący zasób, natomiast PATCH aktualizuje jego część.DELETE usuwa go.Jedną z właściwości, które warto poznać wcześnie, jest idempotencja. Oczekuje się, że GET, PUT i DELETE są idempotentne: wysłanie tego samego żądania dwa razy pozostawia serwer w tym samym stanie co po jego wysłaniu raz. POST zazwyczaj nim nie jest, ponieważ dwa identyczne żądania mogą stworzyć dwa rekordy. Ta różnica tłumaczy wiele późniejszych decyzji dotyczących projektowania API, na przykład dlaczego ponawianie prób jest bezpieczne w przypadku niektórych wywołań, a ryzykowne w innych.
Żądania i odpowiedzi
Klient wysyła żądanie do jednej z tych adresów URL. Żądanie zawiera metodę, adres URL, nagłówki (metadane takie jak typ treści lub token autoryzacji) oraz, w przypadku metod takich jak POST lub PATCH, ciało żądania. Serwer odpowiada odpowiedzią zawierającą kod stanu, nagłówki i zazwyczaj ciało odpowiedzi. W nowoczesnych API to ciało jest niemal zawsze w formacie JSON.
Kody stanu
Każda odpowiedź zawiera trzycyfrowy numer, który podsumowuje wynik. Zobaczysz 200 w przypadku sukcesu, 404, gdy zasób nie istnieje, oraz 500, gdy na serwerze wystąpił błąd. Pierwsza cyfra wskazuje rodzinę kodów: 2xx oznacza sukces, 4xx oznacza, że klient wysłał coś, czego serwer nie może przyjąć (błąd żądania, brak autoryzacji, nieznany zasób), a 5xx oznacza problem w samym serwerze. Przeczytanie najpierw rodziny kodów to najszybszy sposób na ustalenie, którą stronę systemu należy sprawdzić.
Braak stanu
Każda prośba musi zawierać wszystko, czego serwer potrzebuje, aby ją obsłużyć. Serwer nie polega na pamiętaniu tego, o co prosiłeś chwilę wcześniej. Jeśli na przykład dany punkt końcowy wymaga autoryzacji użytkownika, każda prośba zawiera dane uwierzytelniające, często token w nagłówku. Brak stanu to właśnie to, co ułatwia skalowanie API typu REST: każda instancja serwera może obsłużyć dowolną prośbę, ponieważ żadna z nich nie polega na prywatnej pamięci rozmowy.
Gdy te pięć koncepcji staną się oczywiste, większość dokumentacji API typu REST przestaje wyglądać jak język obcy. Prawie każda strona referencyjna, na którą natrafisz, to po prostu lista zasobów, metod, które one obsługują, struktura ciał żądania i odpowiedzi oraz kody stanu, które możesz otrzymać.
Model mentalny: zamawianie w restauracji
Restauracja to przydatna analogia. Klienci nie wchodzą do kuchni i sami gotują. Czytają menu, mówią kelnerowi, czego chcą, a kuchnia to przygotowuje i podaje im.
- Menu to dokumentacja API: wymienia, o co można poprosić.
- Kelner to cykl żądania i odpowiedzi – przekazuje zamówienie do środka i przywozuje wynik z powrotem.
- Kuchnia to serwer, który wykonywa pracę, której nigdy nie widzimy bezpośrednio.
Gdy przenieśliśmy to na metody, GET służy do zapytania o to, co jest na menu, lub sprawdzenia tego, co już znajduje się na twoim stole. POST służy do złożenia nowego zamówienia. DELETE służy do zwrócenia dania. Nie musisz znać wewnętrznej organizacji kuchni; wystarczy, że zamówisz poprawnie, a za każdym razem możesz oczekiwać przewidywalnej i spójnej odpowiedzi. Ta analogia ma swoje ograniczenia (restauracje pamiętają o twoim stole, podczas gdy API bez stanu tego nie robi), ale dobrze oddaje podział obowiązków.
Gdzie REST występuje w rzeczywistej pracy inżynierskiej
REST to nie tylko ciekawostka z podręczników. Jest częścią codziennej pracy niemal każdego zespołu projektowego:
- Rozwijający interfejs użytkownika korzysta z punktów końcowych REST, aby załadować profil, wysłać formularz lub odświeżyć panel sterowania.
Ostatni punkt jest głównym powodem, dla którego REST stał się standardowym stylem dla API internetowych. Dobrze zaprojektowany zestaw punktów końcowych może jednocześnie wspierać klienta w przeglądarce, aplikacje iOS i Android oraz integrację z zewnętrznymi partnerami. Staranne projektowanie tych punktów końcowych jest ważne, ponieważ każdy klient w końcu od nich zależy; naszy artykuł na temat błędów w umowie API, które niszczą niezawodność frontendu omawia problemy, które pojawiają się, gdy tak nie jest.
Dlaczego REST nadal jest odpowiednim punktem wyjścia
Istnieją inne podejścia. GraphQL i gRPC, między innymi, rozwiązują pewne problemy bardziej elegancko niż REST – na przykład umożliwiają klientom żądanie dokładnie tych pól, których potrzebują, lub zapewniają efektywne połączenia między usługami. REST pozostaje najlepszym wyborem dla początkujących z trzech praktycznych powodów.
Najpierw jest wszędzie. Większość publicznych API, których prawdopodobnie będziesz używać – od dostawców płatności, przez dane pogodowe, aż po platformy społecznościowe – oferuje interfejs REST, często jako standardowy. Poznanie go raz daje ci model myślowy, którego możesz ponownie wykorzystać za każdym razem, gdy otwierasz nieznane dokumentacje.
Za drugie, REST jest zgodny z własną architekturą sieci. Metody HTTP i kody stanu nie zostały stworzone specjalnie dla REST; to protokół, którego już używają przeglądarki i serwery. Prawidłowe poznanie REST oznacza zrozumienie, jak działa sieć niezależnie od używanego frameworka, a ta wiedza przetrwa każdą konkretną bibliotekę.
Po trzecie, jest to naturalny następny krok po opanowaniu podstaw frontendu. Gdy już swobodnie operujesz HTML, CSS i JavaScript, w momencie, gdy interfejs zaczyna ładować rzeczywiste dane zamiast sztywno zdefiniowanych zmiennych tymczasowych, projekt zazwyczaj przechodzi od prototypu do czegoś, co ludzie mogą faktycznie używać. Dla wielu programistów skupionych na frontendzie to właśnie wtedy tworzenie własnej API przestaje być opcjonalne, a rozpoczyna się droga do pracy nad pełnym stackiem. Jeśli później chcesz dokładnie porównać style, sprawdź REST vs GraphQL i zalety oraz wady każdej z tych architektur.
Tworzenie pierwszej REST API przy użyciu Node.js i Express
Czytanie samych materiałów nie wystarczy w tym temacie. Staje się to jasne, gdy już coś stworzysz, nawet jeśli jest to coś małego. Typowy pierwszy projekt z Node.js i Express przebiega według następującej sekwencji:
- Stwórz minimalny serwer, który będzie odbierał przychodzące żądania HTTP na określonym porcie.
- Dodaj trasę taką jak
/tasksi połącz ją z obsługownikiemGET, który zwraca listę. - Dodaj obsługownik
POSTna tej samej trasie, który przyjmuje nowe zadania; w tym etapie wystarczy przechowywać je w zwykłym tablicy pamięci. - Dodaj obsługowniki
PUT(lubPATCH) orazDELETE, zazwyczaj na trasie/tasks/:id, aby aktualizować i usuwać poszczególne wpisy. - Gdy struktura API będzie już odpowiednia, zastąp tablicę prawdziwą bazą danych.
- Przetestuj każdą trasę za pomocą narzędzia takiego jak Postman przed połączeniem z dowolnym interfejsem użytkownika.
Dwa elementy sprawiają, że ta sekwencja działa skutecznie. Rozpoczęcie od tablicy w pamięci operacyjnej pozwala skupić się na trasach, metodach i kodach stanu, a nie na konfiguracji bazy danych. Ostatni krok, testowanie tras w izolacji, jest tym, co początkujący najczęściej pomijają. Sprawdzanie API oddzielnie, zanim będzie od niego zależeć interfejs, znacznie ułatwia debugowanie, ponieważ nie musisz się zastanawiać, czy błąd znajduje się w API, czy w kodzie, który je wywołuje.
W trakcie pracy zwracaj odpowiednie kody stanu zamiast 200 we wszystkich przypadkach: 201, gdy POST tworzy zadanie, 404, gdy id nie istnieje, 400, gdy ciało żądania brakuje wymaganego pola. To właśnie te drobne decyzje sprawiają, że API jest przyjemne w używaniu.
Gdzie początkujący zwykle się zapierają
Ludzie, którzy mają trudności z REST, rzadko cierpią na brak umiejętności. Zazwyczaj utykają z przewidywalnych, naprawialnych powodów:
- Uczenie się jednocześnie koncepcji REST oraz frameworka takiego jak Express, przez co nigdy nie jest jasne, które zasadniczo należą do HTTP, a które do biblioteki.
- Nigdy nie testowanie tras bezpośrednio za pomocą narzędzia takiego jak Postman, co sprawia, że błędy frontendu i backendu stają się nierozróżnialne.
- Ignowanie kodów stanu i obsługi błędów, co prowadzi do zamieszania, gdy klient nie potrafi odróżnić sukcesu od porażki.
- Pryskanie do tematu autoryzacji, zanim podstawowe trasy create, read, update i delete będą dobrze opracowane.
- Dokładne odtwarzanie API z tutorialu zamiast tworzenia czegoś prostszego z różnymi zasobami, co ukrywa fakt, czy koncepcje zostały zrozumiane.
To problemy strukturalne, a nie talentu. Ich rozwiązanie zazwyczaj odróżnia osobę, która naprawdę dobrze radzi sobie z tworzeniem backendowych API, od osoby, która potrafi tylko recytować terminologię, ale nie potrafi jeszcze zaprojektować punktu końcowego na podstawie pustego pliku.
Przystosowanie ścieżki do Twojego punktu wyjścia
Ty same podstawy dotyczą wszystkich, ale nacisk zmienia się w zależności od Twojej sytuacji.
- Studenci korzystają z wcześniejszego uczenia się REST, ponieważ to zazwyczaj pierwsza rzecz, która przekształca projekt osobisty z statycznej strony w prawdziwą aplikację.
- Osoby szukające pracy potrzebują zarówno praktycznych umiejętności tworzenia i korzystania z API, jak i zdolności do ich jasnego wyjaśnienia, ponieważ pytania dotyczące REST pojawiają się podczas rozmów kwalifikacyjnych na wiele stanowisk.
Habity, które pomagają zapamiętać koncepcje
Kilka konkretnych nawyków regularnie odróżnia osoby, które naprawdę rozumieją REST, od tych, które po prostu znają te terminy.
Niechaj tworzysz coś małego i oryginalnego, np. listę zadań lub API do notatek, zamiast tylko czytać dokumentację. Koncepcje stają się trwałe, gdy musisz naprawić uszkodzoną ścieżkę.
Nauć się diagnozować awarie zamiast zgadywać. Przeczytaj kod stanu i komunikat błędu, zdecyduj, czy problem leży po stronie klienta, czy serwera, i potwierdź to bezpośrednią prośbą. W praktyce ten instynkt jest ważniejszy od zapamiętanych definicji i to właśnie on odróżnia osobę, która tworzy API, od tej, która je jedynie wykorzystuje. W miarę rozwoju zwracanie błędów w jednym spójnym, udokumentowanym formacie ułatwia diagnozę wszystkim użytkownikom twojego API.
Otrzymuj szybką informację zwrotną. Umiejętność zapytania doświadczonego programisty, kolegi lub forum społecznościowego o to, dlaczego prośba zwraca niewłaściwe dane, często decyduje o tym, czy uda się dokończyć pierwszy projekt API, czy trzeba go porzucić. Długie okresy pasywnej oglądania filmów bez takiego obiegu informacji zwrotnych powodują, że wielu uczących się traci impet.
Częste pytania początkujących
Czym jest REST API, jednym zdaniem?
Jest to zbiór konwencji, które umożliwiają aplikacjom komunikację przez Internet przy użyciu standardowych żądań HTTP i przewidywalnych odpowiedzi.
Czy programiści front-end muszą uczyć się REST?
Tak. Praca nad interfejsem użytkownika wymaga ciągłego korzystania z API REST, dlatego prawie wszędzie oczekuje się od nich solidnej znajomości tego tematu. Jest to również jeden z najłatwiejszych punktów wejścia, jeśli później chcą przejść na rozwój w modelu full stack.
Czy REST jest trudny do nauczenia?
Główne koncepcje stają się zrozumiałe, gdy są wyjaśnione w prosty sposób. Większość trudności pochodzi od wyjaśnień pełnych żargonu, a nie samej istoty koncepcji.
Czy do tworzenia API backend wymagany jest dyplom z informatyki?
Nie. Wielu praktykujących programistów, w tym tych zajmujących się full stackiem, nauczyło się dzięki bootcampom, samokształceniu lub mentorstwu, a nie formalnemu wykształceniu.
Czy można to nauczyć się pracując na pełen etat?
Tak. Koncepcje są zwięzłe, a niewielki projekt stworzony w ciągu kilku wieczorów lub weekendów wystarczy, by je ukonkretnić.
Podsumowanie
REST nie jest tak przerażający, jak sugeruje jego reputacja. To spójny sposób na żądanie i wysyłanie informacji przez oprogramowanie, oparty na tym samym HTTP, który już napędza internet, i znajduje się u podstaw większości aplikacji, których używamy codziennie.
- Pięć koncepcji stanowi istotę: zasoby z adresami URL, metody HTTP, żądania i odpowiedzi, kody stanu oraz brak stanu.
- Naucz się tych koncepcji przed poznaniem frameworka, a następnie użyj Express, aby je ukonkretnić.
- Przetestuj każdą trasę osobno, zanim jakikolwiek interfejs użytkownika od niej będzie zależeć.
- Traktuj kody stanu i obsługę błędów jako część projektu, a nie coś dodanego później.