• GraphQL
  • REST API
  • RESTful API

GraphQL vs. REST API

Odkryj kluczowe różnice między GraphQL a REST API, ich zalety oraz kiedy używać każdego z nich dla optymalnego rozwoju stron internetowych.

Darcy Ye
Darcy Ye
Developer
Simeng
Simeng
Developer

Czy kiedykolwiek pracowałeś nad projektem rozwoju aplikacji internetowej? Jeśli tak, to może już spotkałeś się z terminem „GraphQL”. Ale co to dokładnie oznacza? Czy jest używane w konfiguracjach po stronie serwera, czy klienta? Ponadto, kiedy integracja GraphQL jest preferowana wobec innych alternatyw? W tym artykule przeprowadzimy cię przez te pytania.

Jako kanał komunikacyjny do transferu danych między komponentami oprogramowania przez internet, APIs odgrywają niezbędną rolę w nowoczesnych architekturach usług internetowych, działając jak tlen. Technologie API, takie jak SOAP (protokół przesyłania wiadomości usług internetowych), REST (styl architektoniczny) i GraphQL (język zapytań i narzędzie), ułatwiają rozwój oprogramowania, wspierając integrację i wymianę danych między różnymi usługami, co sprawia, że rozwój jest bardziej wygodny i elastyczny.

Pomimo licznych rodzajów API, debaty w ostatnich latach koncentrowały się głównie na dwóch głównych paradygmatach: REST (transfer stanu reprezentacyjnego) i GraphQL. Oba oferują szereg zalet i są używane na całym świecie w projektach webowych. Różnią się jednak znacznie w sposobie zarządzania komunikacją danych.

Co to jest REST API?

REST to ustrukturyzowany styl architektoniczny opracowany na początku XXI wieku do budowania hiper-medialnych aplikacji wielosiatowych, zaprojektowany do przyjęcia bezstanowego, kasowalnego protokołu komunikacji między klientami a serwerami. REST API (znane również jako RESTful API) jest napędem architektury REST.

REST API używa jednolitych identyfikatorów zasobów (URI) do adresowania zasobów. Działa poprzez użycie różnych punktów końcowych do wykonywania operacji CRUD (tworzenie, odczyt, aktualizacja i usuwanie) na zasobach sieciowych. Opiera się na zdefiniowanych wcześniej formatach danych (znanych jako typy mediów lub typy MIME) do określania formy i wielkości zasobów, które dostarczają klientom. Najpopularniejsze formaty to JSON i XML (czasami HTML lub zwykły tekst).

Po tym, jak klient zażąda zasobu, serwer przetwarza zapytanie i zwraca wszystkie dane związane z tym zasobem. Odpowiedź zawiera kody odpowiedzi HTTP, takie jak „200 OK” (dla pomyślnego żądania REST) i „404 Not Found” (dla nieistniejącego zasobu).

Jak działa REST API?

REST API polegają na zdefiniowanych wcześniej punktach końcowych, które ujawniają zasoby za pośrednictwem HTTP. Każdy punkt końcowy reprezentuje zasób, taki jak użytkownicy czy posty, i jest identyfikowany przez unikalny URL. Operacje REST są powiązane ze standardowymi metodami HTTP, takimi jak GET, POST, PUT i DELETE, które odpowiadają za pobieranie, tworzenie, aktualizowanie i usuwanie danych.

Na przykład, żądanie GET /users pobiera kompletną listę użytkowników, podczas gdy GET /users/123 pobiera szczegóły dotyczące konkretnego użytkownika zidentyfikowanego przez jego ID. Jeśli potrzebujesz także dostępu do powiązanych danych, takich jak organizacje użytkownika i role organizacji, będziesz musiał wykonać dodatkowe wywołania do GET /users/123/organizations.

REST podąża za podejściem zorientowanym na zasoby, koncentrując się na dostępie do dyskretnych zasobów i ich manipulacji.

Co to jest GraphQL?

GraphQL to zarówno typ API (lub język zapytań) jak i silnik czasu wykonywania do odpowiadania na te zapytania. Oferuje uproszczone API i jest szczególnie odpowiednie dla aplikacji mobilnych oraz wdrażania skomplikowanych architektur wymagających określonych podzbiorów danych.

Dzięki GraphQL deweloperzy mogą dokładnie określić dane, które chcą pobrać z API. Umożliwia także pobieranie danych na żądanie zamiast pobierania wszystkiego na raz, natychmiast stosuje zmiany i integruje zewnętrzne źródła danych do aplikacji.

Aplikacje mogą używać zapytań GraphQL do przywoływania usług GraphQL. Te zapytania zwracają dokładne elementy danych, o które prosi klient. Oszczędza to wielokrotne wywołania API, przepustowość sieci i post-processing. Jest to wysoce wydajne rozwiązanie dla API skoncentrowanych na danych, które znajdują się blisko urządzeń konsumentów, takich jak tablety i telefony komórkowe.

Jak działa GraphQL?

GraphQL, w przeciwieństwie, przyjmuje podejście na podstawie zapytań. Zamiast zdefiniowanych wcześniej punktów końcowych, GraphQL udostępnia jeden punkt końcowy, który akceptuje strukturę zapytań. Klienci precyzują, jakie dokładnie dane potrzebują, używając języka zapytań.

Dlatego kompletna implementacja GraphQL musi składać się z dwóch części: schematu i rezolerów.

Schemat GraphQL

Schematy definiują rodzaje danych i ich pola, które mogą zostać pobrane za pomocą zapytań GraphQL:

Na przykład, załóżmy, że masz następujący schemat:

Klient może zapytać o imię użytkownika, email, organizacje i role za pomocą następującego zapytania:

To zapytanie nie tylko pobiera tylko żądane pola (email i organizacje), ale także pobiera powiązane dane (role) w jednym żądaniu.

Resolver GraphQL

Resolver GraphQL jest kluczowym komponentem na serwerze GraphQL, który determinuje, jak pobierać lub obliczać dane żądane przez klienta w zapytaniu GraphQL. Kiedy klient wysyła zapytanie, każde pole w zapytaniu jest dopasowywane do resolvera, który zawiera logikę, aby pobrać lub obliczyć dane dla tego pola.

W powyższym przykładzie rezolery dla schematu wyglądałyby tak:

Istnieją dwa typy rezolerów: rezolery główne i rezolery pól.

  • Rezolery główne: Obsługują pola najwyższego poziomu w schemacie, takie jak Query, Mutation i Subscription.
  • Rezolery pól: Obsługują pojedyncze pola w typie, często dla zagnieżdżonych zapytań. Jeżeli dla pola nie zostanie dostarczony specyficzny rezoler, GraphQL używa domyślnego rezolera, który zwraca wartość z obiektu nadrzędnego o pasującej nazwie pola.

Operacje GraphQL

GraphQL obsługuje trzy rodzaje operacji: query, mutation i subscription.

  • Query: Używane do ODCZYTU danych.
  • Mutation: Używane do ZAPISU danych, w tym operacji dodawania, modyfikacji i usuwania danych.
  • Subscription: Używane do żądania trwałego połączenia dla danych, pozwalając klientowi zadeklarować rodzaje interesujących go zdarzeń i danych, które powinny być zwrócone.

Różnice między GraphQL a REST APIs

GraphQL i REST APIs są narzędziami do wymiany danych między różnymi usługami webowymi, ale ze względu na różne podejścia do rozwiązywania problemów, oto kluczowe różnice między nimi:

Pobieranie danych

REST API często pobiera za dużo lub za mało danych, ponieważ punkty końcowe zwracają ustalone odpowiedzi. GraphQL rozwiązuje to, pozwalając klientom prosić dokładnie to, co potrzebują, redukując niepotrzebny transfer danych. To czyni GraphQL idealnym dla aplikacji o złożonych potrzebach danych, takich jak środowiska mobilne czy o niskiej przepustowości.

Wyobraź sobie powyższy przykład, gdzie musisz pobrać dane statyczne użytkownika, organizacje i role organizacji przypisane użytkownikowi. Z REST API musiałbyś wykonać wiele żądań do różnych punktów końcowych, aby otrzymać wszystkie dane. Jednak z GraphQL możesz pobrać wszystkie dane w jednym żądaniu.

Elastyczność

Struktura oparta na punktach końcowych REST jest prosta i dobrze sprawdza się w przypadku prostych aplikacji z standardowymi operacjami CRUD. Wynika to z tego, że REST APIs zostały zaprojektowane, aby być zasobo-centryczne, z każdym punktem końcowym reprezentującym konkretny zasób. Główne ograniczenie tego podejścia polega na tym, że nie pozwala na szybkie iteracje i zmiany w wymaganiach klienta. Przy każdej zmianie dokonanej po stronie klienta, serwer musi zostać zaktualizowany, aby dostosować się do nowych wymagań, albo poprzez dodanie nowych punktów końcowych, albo zaktualizowanie istniejących. To często kończy się w dużej ilości zbędnych punktów końcowych i złożonym zarządzaniem wersjami API.

GraphQL, z drugiej strony, jest bardziej elastyczne i pozwala klientom prosić tylko o dane, które potrzebują. Ta elastyczność jest szczególnie przydatna, gdy wymagania klientów zmieniają się często, ponieważ eliminuje potrzebę modyfikacji implementacji API po stronie serwera. Klienci mogą prosić o nowe pola lub zagnieżdżone dane bez konieczności zmian w serwerze.

Buforowanie

Mimo że GraphQL jest bardziej wydajne i elastyczne w zakresie pobierania danych, ma również pewne wady. Jednym z głównych problemów jest buforowanie.

REST API ma dojrzały ekosystem. Ze względu na bezstanową i ustandaryzowaną charakterystykę, łatwo jest buforować odpowiedzi zarówno na poziomie serwera, jak i klienta. Może to znacznie zmniejszyć liczbę żądań wysyłanych do serwera i poprawić wydajność.

Jednak ze względu na swoją elastyczność, wiele dostępnych technologii buforowania dla REST API nie jest odpowiednich dla GraphQL. Należy zarządzać buforowaniem po stronie klienta, w oparciu o konkretne przypadki użycia, co niesie dodatkowy nakład pracy nad rozwojem klienta.

Plusy i minusy

NazwaPlusyMinusy
REST API- Proste i szeroko stosowane, z rozbudowanymi narzędziami i wsparciem społeczności.
- Jasna struktura, co ułatwia zrozumienie początkującym.
- Wbudowane wsparcie buforowania przy użyciu standardów HTTP.
- Nadmiarowe lub niedostateczne pobieranie danych
- Zmiany często wymagają tworzenia nowych wersji, co zwiększa nakład pracy związany z utrzymaniem.
GraphQL- Dokładne pobieranie danych poprawia wydajność i efektywność.
- Ewolucja schematu redukuje potrzebę wersjonowania.
- Potężne narzędzia, takie jak introspekcja i typowanie, polepszają doświadczenie rozwoju.
- Bardziej złożona konfiguracja i krzywa nauki w porównaniu do REST.
- Wymaga niestandardowych rozwiązań buforowania, ponieważ nie polega na buforowaniu HTTP.
- Design jednego punktu końcowego może komplikować debugowanie i monitorowanie.

Wniosek

Choć GraphQL zyskało silny rozpęd jako nowicjusz w ostatnich latach, REST API nadal odgrywa znaczącą rolę przez długi czas ze względu na jej atomowy design i rygor.

REST i GraphQL służą różnym potrzebom i excel w różnych scenariuszach. Prostota REST czyni go doskonałym wyborem dla prostych aplikacji i mikrousług. GraphQL wyróżnia się w scenariuszach wymagających elastycznego i wydajnego pobierania danych, szczególnie w aplikacjach z różnorodnymi klientami lub skomplikowanymi relacjami między danymi. Wybór między nimi zależy od specyficznych wymagań twojego projektu, doświadczenia zespołu i długoterminowych potrzeb skalowalności.