Preskočiť na obsah
API štandard

GraphQL

GraphQL je dotazovací jazyk pre API a runtime pre vykonávanie týchto dotazov, ktorý klientovi umožňuje presne špecifikovať, aké dáta potrebuje — a dostane ich v jednej odpovedi, nie vo viacerých REST endpointoch.

Ako to funguje

V klasickom REST API má každý zdroj vlastný endpoint: `/users`, `/posts`, `/comments`. Klient zavolá každý z nich zvlášť, dostane vždy celý objekt — aj polia, ktoré nepotrebuje — a ak potrebuje dáta z viacerých zdrojov, robí viacero požiadaviek. GraphQL tento model otáča: je jeden endpoint, a klient si sám opíše, čo chce. Pošle dotaz, dostane presne tie polia, ktoré žiadal, nie viac, nie menej.

Schéma je základom GraphQL API. Definuje všetky typy, ich polia a vzťahy medzi nimi. Klient vidí schému a vie, čo môže pýtať. Resolver funkcie na serveri implementujú, ako sa každé pole vyplní — môžu čítať z databázy, volať ďalšie API alebo kombináciu oboch. Mutácie slúžia na zápis dát, Subscriptions na real-time aktualizácie cez WebSocket.

GraphQL rieši dva konkrétne problémy REST API: over-fetching (dostanete viac dát, ako potrebujete) a under-fetching (musíte robiť viacero požiadaviek, aby ste dostali čo potrebujete). Pre mobilné aplikácie s obmedzenou šírkou pásma je to citeľný rozdiel. Pre agregačné vrstvy nad viacerými backendovými službami je GraphQL elegantné riešenie — klient komunikuje s jedným endpointom, za ktorým môže byť desať interných služieb.

GraphQL nie je vždy správna voľba. Pridáva komplexitu — schéma, resolvers, dataloadery, cache stratégia. Pre jednoduché CRUD API je REST jasnejší a rýchlejší na implementáciu. Pre B2B API, kde si zákazníci sami píšu integrácie, REST s dobrou dokumentáciou funguje lepšie. GraphQL dáva najväčší zmysel pri komplexných frontendoch, kde rôzne obrazovky potrebujú rôzne kombinácie tých istých dát.

Z našej praxe

V Strange Loops GraphQL aktívne nepoužívame — naša stack je postavená na tRPC, ktoré nám dáva end-to-end typovú bezpečnosť bez schémy navyše. tRPC medzi Next.js frontendom a Fastify backendom eliminuje potrebu GraphQL pre interné projekty. Ak zákazník má existujúce GraphQL API alebo explicitne požaduje GraphQL — napríklad pri integrácii na Shopify alebo GitHub API — samozrejme s ním pracujeme. Pre nové projekty však tRPC alebo REST cez Fastify považujeme za pragmatickejšie riešenie.

Kedy to potrebujete

  • Vyvíjate mobilnú aplikáciu, kde každý zbytočný kilobajt sa počíta — GraphQL vám umožní fetchovať presne to, čo obrazovka potrebuje.
  • Máte backend rozdelený na viacero mikroslužieb a frontend by musel volať päť endpointov pre jednu stránku — GraphQL federated gateway to zjednotí do jedného volania.
  • Váš produkt má rôznych klientov s rôznymi potrebami (mobilná app, web, partnerské API) — GraphQL nechá každého klienta pýtať si, čo potrebuje, bez toho aby ste pridávali nové endpointy.
  • Integrujete tretiu stranu s GraphQL API — GitHub, Shopify, Contentful — a potrebujete s ním pracovať zo svojho backendu.

Najčastejšie otázky

Je GraphQL rýchlejšie ako REST?

Nie nevyhnutne — GraphQL môže byť rýchlejší z pohľadu počtu sieťových požiadaviek (menej round-trips), ale server musí vyriešiť potenciálne komplexné dotazy. Bez správnej cache stratégie a dataloaderoov (N+1 problém) môže byť pomalší. Rýchlosť závisí od implementácie, nie od technológie samotnej.

Čo je N+1 problém v GraphQL?

N+1 nastane, keď resolver pre zoznam N položiek zavolá databázu N-krát pre každú položku zvlášť. Ak načítate 100 príspevkov a pre každý chcete meno autora, dostanete 101 SQL dotazov. Rieši to DataLoader — knižnica, ktorá dávkuje tieto volania do jedného dotazu.

Môžem miešať GraphQL a REST v jednej aplikácii?

Áno, a je to bežná prax. Môžete mať GraphQL pre hlavné dátové operácie a REST pre webhooky, file upload alebo jednoduché endpointy. Nie je to problém — dôležité je, aby tím rozumel, kde sa čo nachádza a prečo.

Potrebujete s tým pomôcť?

Ak riešite niečo z toho, čo tu opisujeme, ozvite sa. Povieme vám, či a ako vieme pomôcť.