graf kjú elTakéGraphQL APIPokročilý

Definice

GraphQL je dotazovací jazyk a běhové prostředí pro API, ve kterém klient přesně popíše, jaká data chce dostat, a server odpoví ve stejném tvaru. Nejčastěji se používá nad HTTP, ale není databází ani transportním protokolem; hlavní hodnotou je typované schéma, flexibilní dotazy a evoluce API bez mnoha verzí.

Kategorie: Webové technologieAktualizováno

Proč GraphQL vznikl u API s mnoha klienty

GraphQL řeší situaci, kdy web, mobilní aplikace, administrace a integrace potřebují podobná data, ale pokaždé v jiném řezu. U klasického API často vznikají zvláštní endpointy pro detail produktu, seznam objednávek, profil uživatele nebo mobilní verzi stejné obrazovky. GraphQL místo pevného seznamu odpovědí nabízí typované schéma a jeden vstupní bod, nad kterým si klient složí dotaz.

GraphQL není povinně spojený s jednou databází ani s jedním frameworkem. Server může číst z PostgreSQL, REST služby, cache, fronty nebo interního mikroservisu. Klient vidí schéma, nikoli vnitřní topologii systému. Přínos je největší tam, kde se datový model často rozšiřuje a kde různé obrazovky potřebují různé kombinace polí.

Schéma jako smlouva mezi klientem a serverem

Schéma GraphQL popisuje typy, pole, argumenty a operace. Běžné operace jsou query pro čtení, mutation pro změnu dat a subscription pro průběžné události. Každé pole má návratový typ, takže nástroje mohou doplňovat dotazy, validovat je před spuštěním a generovat typy pro klientský kód.

Silná stránka schématu je evoluce bez okamžitého rozbití klientů. Nové pole lze přidat, aniž by starší aplikace musely změnit dotaz. Staré pole lze označit jako zastaralé a odstranit až po migraci spotřebitelů. GraphQL tím nenahrazuje verzování úplně, ale snižuje tlak na vytváření mnoha paralelních verzí stejného API.

Dotaz určuje tvar odpovědi

Klient v GraphQL dotazu vyjmenuje jen pole, která potřebuje. Server vrátí odpověď ve struktuře podobné dotazu, obvykle jako JSON. Tím se omezuje over-fetching, tedy posílání zbytečně širokých dat, i under-fetching, kdy klient musí volat několik endpointů kvůli jedné obrazovce.

Flexibilita dotazů zároveň přenáší část odpovědnosti na server. GraphQL server musí hlídat autorizaci na úrovni polí, limity hloubky dotazu, nákladné spojování dat a správné dávkování načítání. Bez těchto kontrol může jediný dotaz vyvolat mnoho pomalých přístupů do databáze nebo obejít oprávnění, která byla původně kontrolována jen u endpointu.

Resolver není kouzlo nad databází

Resolver je funkce, která pro konkrétní pole obstará hodnotu. GraphQL pouze definuje, jak dotaz vypadá a jak se vyhodnocuje proti schématu. Výkon závisí na implementaci resolverů, cache, dataloaderu, indexech a síťových voláních. Špatně napsaný resolver může být pomalejší než jednoduchý REST endpoint.

GraphQL se proto dobře hodí pro produktová API, interní platformy a brány nad více zdroji dat. Méně vhodný může být pro velmi jednoduché CRUD služby, veřejná API bez jasných limitů nebo systémy, kde je hlavním požadavkem snadná HTTP cache na úrovni URL.

Příklady z praxe

  1. Produktová karta v mobilní aplikaci

    Mobilní aplikace zobrazuje kartu produktu a nepotřebuje dlouhý popis, skladové pohyby ani doporučení. GraphQL dotaz vyžádá pouze název, cenu a obrázek. Server pošle menší odpověď a stejný backend může obsloužit i webovou stránku s širším dotazem.

    query ProductCard($id: ID!) {
      product(id: $id) {
        name
        price
        imageUrl
      }
    }
  2. Detail objednávky přes více služeb

    Administrace potřebuje na jedné obrazovce objednávku, zákazníka, položky a stav doručení. GraphQL server může data posbírat z několika interních služeb a vrátit je jako jednu odpověď. Klient nemusí ručně skládat několik REST volání a řešit jejich pořadí.

    query OrderScreen($id: ID!) {
      order(id: $id) {
        number
        customer { name }
        items { title quantity }
        delivery { status eta }
      }
    }

Časté omyly

MýtusGraphQL je náhrada databáze.
Ve skutečnostiGraphQL není databázový systém. GraphQL server jen přijímá dotazy podle schématu a resolvery data získávají z databází, služeb, souborů nebo jiných zdrojů.
MýtusGraphQL je vždy rychlejší než REST.
Ve skutečnostiGraphQL může snížit počet volání a objem přenesených dat, ale výkon závisí na resolverech, cache a limitech dotazů. Špatně navržené GraphQL API může být pomalejší než jednoduchý REST endpoint.

Časté dotazy

Kdy dává GraphQL větší smysl než REST endpointy?
GraphQL dává největší smysl, když klienti potřebují různě tvarovaná data ze stejné domény a backend se často vyvíjí. REST bývá jednodušší pro malé služby s několika jasnými zdroji, dobře cachovatelnými URL a minimem variant odpovědí. GraphQL přidává typované schéma, introspekci a přesné dotazy, ale také vyžaduje promyšlené limity, autorizaci polí a sledování nákladnosti dotazů.
Je GraphQL totéž co HTTP endpoint?
GraphQL endpoint typicky vrací data přes HTTP ve formátu JSON, ale GraphQL samo o sobě není HTTP metoda ani síťový protokol. GraphQL popisuje dotazy, typy, validaci a vyhodnocení operací proti schématu. Přenos může být navržen různě podle serveru a klienta, i když v praxi nejčastěji potkáte jeden HTTP endpoint pro query a mutation operace.
Jak se u GraphQL řeší bezpečnost a oprávnění?
GraphQL bezpečnost stojí hlavně na serverové implementaci, ne na samotném dotazovacím jazyce. GraphQL API musí kontrolovat oprávnění u objektů i jednotlivých polí, omezovat hloubku a složitost dotazů, filtrovat introspekci podle prostředí a logovat nákladné operace. Bez těchto pravidel může flexibilní dotazování zhoršit výkon nebo nechtěně odhalit citlivé části datového modelu.
Jak se v GraphQL API zavádějí změny bez rozbití klientů?
GraphQL schema se mění přidáváním nových typů a polí, protože starší klienti si o ně sami nepožádají. GraphQL pole, které už nemá být používáno, se obvykle označí jako deprecated a ponechá se po dobu migrace. Rozbíjející změny, například přejmenování pole nebo změna typu, vyžadují koordinaci s klienty stejně jako u jiných API.

Zdroje

  1. What is GraphQL?(otevře se v novém okně)Amazon Web Services
  2. GraphQL(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.