Slovník pojmů

GraphQL

GraphQL dává klientovi přesný výběr dat. Není to databázový jazyk ani automatické řešení výkonu, oprávnění nebo návrhu API.

Stručná definice

Kontrakt API popsaný typy, poli a operacemi.

Server nejprve zveřejní GraphQL schéma: typy, dostupná pole, vstupy a operace. Klient pak pošle query pro čtení nebo mutation pro změnu a zvolí jen potřebná pole. Server dotaz syntakticky i typově ověří, spustí resolvery a zpravidla vrátí JSON s daty, případně i se seznamem chyb.

GraphQL nestojí přímo nad tabulkami. Resolver může číst relační databázi, volat několik interních služeb, použít cache nebo složit data z externího API. Veřejné GraphQL schéma je kontrakt pro klienta, ne zrcadlo interní databázové struktury.

K čemu se používá

Když různí klienti potřebují různé pohledy na stejná data

Výběr polí je užitečný zejména pro více frontendů nebo obrazovek, které nad stejným doménovým modelem zobrazují odlišný detail.

  • webová a mobilní aplikace čtou objednávky s jiným rozsahem detailu
  • administrace skládá přehled z objednávek, zákazníků a stavů synchronizace
  • frontend si jedním dotazem načte data potřebná pro konkrétní obrazovku
  • mutace vytváří nebo mění business objekty přes typovaný vstupní kontrakt
  • interní API postupně vyvíjí schéma bez nutnosti vystavovat tabulky přímo klientům

Praktický příklad

Detail objednávky bez zbytečných polí

Frontend administrace potřebuje zobrazit číslo objednávky, stav, jméno zákazníka, položky a celkovou cenu. Dotaz výslovně vybírá tato pole; server před jejich vrácením ověří, že aktuální uživatel smí objednávku v dané organizaci číst.

Ukázka neznamená, že pole customer nebo items jsou veřejná pro každého. Resolver nebo společná autorizační vrstva musí vynutit stejná pravidla jako u REST endpointu. Citlivé údaje se do schématu nezařazují jen proto, že je interně obsahuje databáze.

GraphQL a JSON

query OrderDetail($id: ID!) {
  order(id: $id) {
    number
    status
    customer { displayName }
    items { quantity productName totalPrice }
    totalPrice
  }
}

{"id":"ord_42"}

Jak funguje

Textový diagram: klientský dotaz → schéma → resolvery → autorizovaná data → JSON odpověď

Schéma vymezuje veřejný kontrakt; jednotlivé resolvery pak rozhodují, odkud data vezmou a zda je smí vrátit.

  1. Schéma popisuje kontrakt Typy určují dostupná pole, jejich vstupy a nullabilitu. Introspection může klientům pomoci kontrakt poznat, pokud ji provozovatel vědomě zpřístupní.
  2. Klient sestaví operaci Query vybírá data, mutation žádá změnu a proměnné nesou hodnoty odděleně od textu dotazu. Fragment dovolí znovu použít výběr polí.
  3. Server operaci validuje Kontroluje syntaxi, existenci polí, typy vstupů a limity. Validní GraphQL ještě neznamená, že je požadavek oprávněný nebo levný.
  4. Resolvery načtou a zkontrolují data Resolver může pracovat s databází či službou, ale musí řešit autorizaci, chyby a efektivní načtení souvisejících objektů.
  5. Odpověď nese data i chyby Část dat může být úspěšná, zatímco jiné pole skončí chybou. Klient proto nevyhodnocuje jen HTTP status, ale i strukturu odpovědi.

Důležité pojmy

Typy a resolvery dávají výběru polí pravidla

Dobrý kontrakt je srozumitelný klientovi a současně neschovává provozní pravidla jen do implementace.

Query, mutation a subscription

Query čte data, mutation vyjadřuje změnu. Subscription může oznamovat průběžné změny, ale pro přenos často používá WebSocket nebo jiný mechanismus a potřebuje stejnou autorizaci.

Typ, pole a nullabilita

Typ určuje tvar kontraktu, pole poskytuje konkrétní hodnotu a nullabilita říká, zda může hodnota chybět. Není to totéž co databázový sloupec či tabulka.

Resolver

Resolver je kód, který vypočítá nebo načte hodnotu pole. Jeden resolver může spojit více zdrojů, proto musí mít rozumné limity a sledovat počet dalších volání.

Proměnná a fragment

Proměnné nesou vstupní hodnoty odděleně od struktury dotazu. Fragment pomáhá sdílet opakovaný výběr polí; ani jeden mechanismus nenahrazuje validaci business pravidel.

Introspection a vývoj schématu

Schéma lze strojově zkoumat a postupně rozšiřovat. Zastaralé pole je vhodné označit jako deprecated a odstranit až po řízené migraci klientů.

Vztah k podobným pojmům

GraphQL neříká, jak ukládat data ani jak implementovat backend

Stejná aplikace může používat GraphQL pro některé klienty a REST, webhooky nebo fronty pro jiné integrační potřeby.

GraphQL a REST API
REST typicky rozděluje operace do endpointů a pracuje s HTTP zdroji. GraphQL nabízí typované schéma a výběr polí v operaci. Ani přístup není univerzálně lepší.
GraphQL a SQL
GraphQL dotazuje veřejné API, SQL relační databázi. Resolver může SQL používat, ale klientský GraphQL dotaz nesmí dostat neomezenou moc nad interní databází.
Schéma GraphQL a schéma databáze
GraphQL schéma popisuje, co API slibuje klientovi. Databázové schéma popisuje uložené objekty a vztahy; obě se mohou a často mají lišit.
Subscription a WebSocket
Subscription popisuje semantiku odběru změn. WebSocket je jeden možný obousměrný transport; implementace může používat i jinou technologii.

Výhody a omezení

Přesný výběr dat výměnou za náročnější řízení nákladů a oprávnění

Přínosy

  • jedna operace může dodat data pro konkrétní obrazovku bez nadbytečných polí
  • typované schéma usnadňuje dokumentaci, validaci a práci editorů
  • lze vyvíjet kontrakt postupně přidáváním polí a deprecací starších
  • sjednocuje přístup k více zdrojům dat za jeden veřejný kontrakt

Časté chyby

  • zaměnit GraphQL za přímý přístup k databázi
  • spoléhat na to, že výběr polí automaticky řeší N+1 a výkon
  • autorizovat pouze celou operaci, ale ne jednotlivé objekty nebo citlivá pole
  • povolit neomezenou hloubku, šířku či cenu dotazů
  • považovat HTTP 200 za úspěch, i když odpověď obsahuje GraphQL chyby

Kdy jej použít

Když se vyplatí dlouhodobě spravovat bohatý kontrakt pro více klientů.

GraphQL může sedět administraci a více frontendům, které používají stejné doménové objekty, ale na každé obrazovce potřebují jiný výřez. Přínos roste s kvalitou schématu, rozumným modelováním mutací a schopností provozovat dotazové limity, monitoring a autorizaci.

Pro malou integrační operaci s jasným HTTP zdrojem může být REST endpoint jednodušší na pochopení, cache i provoz. GraphQL není náhrada za databázový model, dokumentaci chybových stavů ani rozhraní pro asynchronní události.

Na co myslet

Veřejné schéma je produktové i bezpečnostní rozhraní.

Důležité jsou limity, dohledatelnost a autorizační pravidla blízko dat, nikoli pouze pohodlný výběr polí na klientovi.

  • modelovat typy a mutace podle doménového významu, ne jako přímé tabulky
  • ověřovat oprávnění na úrovni operace, objektu a citlivého pole
  • měřit dobu resolverů, počet načtení a nákladnost dotazu; řešit N+1 batchingem nebo vhodným načítáním
  • omezit hloubku, složitost, velikost vstupů a případně používat uložené či povolené operace
  • verzovat kontrakt evolučně: přidávat, označovat deprecated a teprve potom bezpečně odstraňovat

Časté otázky

GraphQL bez zkratkovitých slibů

Je GraphQL náhradou za REST?

Ne nutně. Je to jiný způsob návrhu API kontraktu. V jednom systému mohou vedle sebe dávat smysl GraphQL pro frontend, REST pro partnerskou integraci a webhook pro oznámení události.

Je GraphQL databázový jazyk?

Není. Dotazuje veřejné API schéma. Resolver může sahat do databáze, ale server určuje, která data jsou dostupná a jak se načítají.

Odstraňuje GraphQL N+1 problém?

Ne automaticky. Naivní resolver může při každém řádku spustit další dotaz. Je potřeba měřit a použít vhodné dávkování, eager loading nebo jiné strategie.

Znamená HTTP 200 vždy úspěch GraphQL operace?

Ne. Odpověď může obsahovat částečná data a pole errors. Klient musí umět pracovat s kontraktem odpovědi, nejen s transportním statusem.

Jak navrhuji API v praxi

API kontrakt vážu na doménový význam, oprávnění a provozní limity.

Při návrhu integrací řeším data, kompatibilitu, chyby, výkon dotazů i serverové ověření konkrétního přístupu — bez ohledu na to, zda transport používá REST nebo GraphQL.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.