Inspirováno článkem GraphQL vs REST. GraphQL je lepší REST API. Např. chci vytvořit stránku, na které chci zobrazit jméno autora, pod tím jeho články a pod tím poslední 3 followery.
Příklad, proč chtít GraphQL
Znám id autora, bude např. 1. V klasickém REST na to potřebuji 3 requesty na API, první mi vrátí jméno autora pro id 1, druhý request vrátí články pro id 1 a třetí request mi vrátí followery. API ale nepozná, že chci použít jen něco a bude vracet všechno co zná o autorovi, všechno co zná o článcích a všechno co zná o followerech.
Budou se přenášet data, která nepotřebuji (overfetching), kdyby se nepřenášelo vše, odezva stránky bude rychlejší. Jde to udělat ? Nebo se přenese málo (underfteching) a budu potřebovat více requestů, abych dostal vše, co potřebuju.
GraphQL místo 3 requestů dokáže vrátit vše potřebné na 1 request a k tomu jen data, která vyspecifikujeme např. jméno autora, názvy článků, jména followerů. Bomba!
Analytics
A to není vše. GraphQL má hlubokou analytiku, která data jsou čtená a jaké funkce se nepoužívají, takže se dá API snáze vyvíjet, odstraňovat zastaralé funkce a monitorovat výkonnost.
Queries
Základní koncepty GraphQL tvoří typovací systém GraphQL a schéma komunikace umožňuje oddělit týmy pracující na backendu a frontendu. Jazyk se jmenuje SDL (Schema Definiton Language). Rozdíl proti REST API, místo několika endpointů stačí jediný endpoint.
Základní typy Query, Mutation, Subscription
Dotaz (Query) se skládá z hlavního pole (root field) a vnitřek dotazu se nazývá payload. Dotazy mohou mít argumenty (např. last: 2) . Zápis, změna a výmaz dat přes API se nazývá mutace (mutation). Aby se klient dozvěděl o případných změnách dat, k tomu slouží subscription. Otevře se spojení a když dojde ke změně, GraphQL v reálném čase pošle požadované informace
Architektura
GraphQL může zjednodušit navenek složité systémy, mikroslužby atd. Na straně serveru zpracovává requesty funkce zvaná resolver. Prováděcí algoritmus spojí požadovaná data a pošle odpověd. Na získání dat se v JavaScriptu používá nástrok zvaný DataLoader. Znovupoužitelnost dat umožňuje kolekce polí zvaná fragment. Místo aby jsme žádali např. pro adresu místa pole „název, ulice, psč, stát“, vytvoříme si z těchto polí fragment adresaDetail. Každé pole má 0 nebo více argumentů. Pro argumenty můžeme nastavit výchozí hodnoty. Před query se dají dávat aliasy, pokud se ptáme vícekrát na to samé, aby jsme věděli, k čemu patří odpověď.
Programování na straně serveru
API natypované podle GraphQL je hezká věc pro tým frontendistů, ale na straně backendu se musí nejdříve naprogramovat. Pokud bych použil na serveru PHP, tak nejpoužívanější implementace GraphQL je od webonyx-graphql-php. V balíčku jsou různé příklady. Pro každý query, mutation atd. je potřeba udělat resolve funkci.