REST in GraphQL sta dve najbolj priljubljeni metodi oblikovanja API-jev v letu 2026. Vsaka ima svoje mesto – vendar napačna izbira pomeni mesece preoblikovanja. Tukaj je vodnik, kdaj katero uporabiti, kakšne so pasti in kako obe pravilno implementirati v svetu PHP (WordPress, Craft, Laravel).
Kaj je REST?
Prenos reprezentativnega stanja – arhitektura iz leta 2000. Vsak vir ima URL, metode HTTP definirajo dejanje:
-
GET /api/posts— seznam objav. -
GET /api/posts/123— ena objava. -
POST /api/posts— ustvari. -
PUT /api/posts/123— posodobitev. -
DELETE /api/posts/123— izbriši.
Strežnik določi obliko odgovora – vedno enako za isto končno točko.
Kaj je GraphQL?
Poizvedbeni jezik za API-je, Facebook 2015. Ena končna točka ( /graphql ), odjemalec natančno definira, katera polja želi:
query { posts(limit: 10) { id title author { name } comments(limit: 3) { body } } }Strežnik vrne točno to. Brez neobveznih polj, brez dodatnih poizvedb.
Glavna razlika
- REST: oblika, ki jo poganja strežnik. Odjemalec vzame, kar da strežnik. Več končnih točk, preprosti URL-ji.
- GraphQL: oblika, ki jo poganja odjemalec. Odjemalec določi, kaj želi. Ena končna točka, bolj kompleksne poizvedbe.
Kdaj uporabiti REST
- Javni API za razvijalce tretjih oseb. REST je splošno znan, lažje dokumentiran in podprt z vsakim kompletom za razvoj programske opreme (SDK).
- Aplikacija, ki temelji na CRUD-u. Standardne operacije so preslikane ena na ena.
- Zahtevano je predpomnjenje HTTP. REST se predpomni prek standardnih glav HTTP (ETag, Cache-Control). GraphQL je težaven (vse je POST).
- Spletni kavlji in strežnik-strežnik. Lažje definirati fiksno pogodbo.
- Strogo gledano, brezdržavnost. REST je v bistvu brezdržaven.
Kdaj uporabiti GraphQL
- Frontend potrebuje različne podatke za različne zaslone. Mobilna aplikacija zahteva manj polj kot spletna – GraphQL ponuja točno to, kar potrebuje.
- Več različnih vrst odjemalcev. Mobilni, spletni, integracijski partner, vsi delujejo prek enega API-ja.
- Zmanjšajte število omrežnih povratnih poti. Namesto 5 klicev REST ena poizvedba GraphQL z ugnezdenimi viri.
- Hitro razvijajoči se frontend. Backendu ni treba spreminjati končne točke, ko frontend potrebuje dodatno polje.
- Tipsko varna pogodba. Shema GraphQL je strogo tipizirana, kar olajša razvojno izkušnjo z orodji za generiranje kode.
WordPress REST API
WP ima od leta 2016 vgrajen REST API ( /wp-json/wp/v2/ ). Vsi ključni viri so izpostavljeni:
GET /wp-json/wp/v2/posts?per_page=10 GET /wp-json/wp/v2/posts/123 GET /wp-json/wp/v2/users GET /wp-json/wp/v2/categoriesAvtorizacija: Gesla aplikacij (na uporabnika, ustvarjena v profilu), JWT (vtičnik), OAuth (vtičnik).
Končne točke po meri: register_rest_route() v vtičniku/temi.
WordPress GraphQL — vtičnik WPGraphQL
Vtičnik WPGraphQL doda končno točko /graphql in vso vsebino WP razkrije kot tipe GraphQL.
Plus: odlično za brezglavo WP (Next.js, Astro, Gatsby frontendi).
Nastavitev: namestite vtičnik, po izbiri WPGraphQL JWT avtentikacija za avtorizacijo.
CMS za ustvarjanje – GraphQL izvorno
Craft ima GraphQL vgrajen že od različice 3.3 (z REST kot alternativo prek vtičnika Element API). To je glavna razlika v primerjavi z WP – Craft je najprej brezglav.
POST /api { "query": "{ entries(section: \"blog\", limit: 5) { title, slug, postDate } }" }Shema je samodejno ustvarjena iz definicij razdelkov/polj. Žetoni za avtorizacijo (ustvarjeni v Craft CP). Javna shema samo za branje brez žetonov, če želite.
Laravel – oba podprta
REST v Laravelu
Vgrajeno. Route::apiResource('posts', PostController::class) ustvari vse standardne RESTful poti. Viri API-ja za transformacijo JSON.
// Controller public function index() { return PostResource::collection(Post::paginate(10)); } // Resource return [ 'id' => $this->id, 'title' => $this->title, 'author' => new UserResource($this->author), ];GraphQL v Laravelu
Najbolj priljubljen paket: Lighthouse (od Nuwave). Pristop, ki daje prednost shemi, tipe definirate v datotekah SDL.
composer require nuwave/lighthouse Alternative: rebing/graphql-laravel (najprej koda).
Problem N+1 — ubijalec GraphQL-a
Največja past v GraphQL. Poizvedba:
{ posts { author { name } } }Naivna implementacija: 1 poizvedba za objave (vrne 10) + 10 poizvedb za avtorje = 11 poizvedb. Slabo se skalira.
Rešitev: vzorec DataLoader.
- Svetilnik: direktivi
@hasOnein@belongsTo+ vgrajeno paketno nalaganje. - Obrt: nestrpen naklad skozi
.with(['author']). - WPGraphQL:
WPGraphQL\Data\Connection\AbstractConnectionResolverobravnava paket.
Brez njega je GraphQL počasnejši od REST-a.
Predpomnjenje
Predpomnjenje REST
Standardni HTTP — Cache-Control: max-age=3600 , ETag , pogojni GET ( If-None-Match ). CDN to obravnava samodejno.
Predpomnjenje GraphQL – zapleteno
Vsaka poizvedba je zahteva POST – CDN je ne shrani v predpomnilnik. Rešitve:
- Vztrajne poizvedbe – niz poizvedbe za zgoščevanje, strežnik ohranja preslikavo, odjemalec pošilja samo zgoščevanje. Predpomni se lahko na CDN.
- Predpomnilnik strežnika Apollo — predpomnjenje po posameznih poljih iz direktive.
- Predpomnilnik odgovorov na strani strežnika (Redis) – poizvedba o zgoščevanju + spremenljivke, odgovor predpomnilnika.
- Zahteve za posredovanje GET – nekateri strežniki GraphQL podpirajo GET za poizvedbe (Apollo, Hot Chocolate).
Varnost — REST
- Avtorizacija: žetoni API-ja, OAuth 2.0, JWT.
- Omejevanje hitrosti glede na končno točko in metodo.
- CORS pravilno nastavljen.
- Validacija vnosa (zahteve za obrazce Laravel, enodnevnice WP).
Varnost — GraphQL
GraphQL ima dodatne vektorje napada:
- DoS zaradi kompleksnosti poizvedbe – odjemalec lahko pošlje globoko ugnezdeno poizvedbo ("daj mi vse objave z avtorji z njihovimi objavami z avtorji..."). Nastavi največjo globino (5–10) in najvišjo oceno kompleksnosti.
- Introspekcija v produkciji – shema vidna vsem. Onemogočite v produkciji ali dovolite samo overjene.
- Avtorizacija na ravni polja – nekatera polja zahtevajo dovoljenje. Direktiva Lighthouse
@can, razreševalniki po meri. - Omejitev hitrosti glede na kompleksnost – ne glede na končno točko, temveč glede na stroške vsake poizvedbe.
Verzioniranje
- REST: na podlagi URL-jev (
/v1/posts,/v2/posts) ali na podlagi glave. - GraphQL: izogiba se vodenju različic. Dodajanje polja ne prekine odjemalca. Brisanje uporablja direktivo
@deprecated, odjemalci vidijo opozorilo.
Dokumentacija
- REST: Specifikacija OpenAPI/Swagger Ustvari interaktivne dokumente (Swagger UI, Redoc).
- GraphQL: shema se sama dokumentira. Orodja: GraphiQL (interaktivni brskalnik), Apollo Studio.
Merila uspešnosti
Ne obstaja nekaj takega kot "GraphQL je hitrejši" ali "REST je hitrejši". Odvisno je od primera uporabe:
- Preprosto pridobivanje enega samega vira: REST + predpomnilnik HTTP zmaga.
- Zapletena stran s 5 neodvisnimi viri: GraphQL ena poizvedba v primerjavi s 5 klici REST.
- Mobilna aplikacija s slabim omrežjem: GraphQL prihrani povratne poti in pasovno širino.
- Množično pošiljanje med strežniki: REST s straničenjem je bolj predvidljiv.
Hibridni pristop
Mnogi sodobni skladi uporabljajo oboje:
- REST za javni API (razvijalci tretjih oseb).
- GraphQL za interni frontend (mobilni + spletni odjemalec aplikacije).
- REST za sprejemnike spletnih kavljarjev.
- REST za nalaganje datotek (večdelno lažje v REST-u).
Nastavitev orožja za množično uničevanje in API-ja
Vsa gostovanja WMD podpirajo tako REST kot GraphQL delovne obremenitve. Za odjemalce WP brez glave nastavimo WPGraphQL + plast predpomnjenja + trajne poizvedbe. Za odjemalce Craft konfiguriramo preverjanje pristnosti žetonov GraphQL + javno shemo. Za odjemalce Laravel namestimo vire Lighthouse ali API, odvisno od potreb. Omejitev hitrosti (po IP in kompleksnosti), CORS, preverjanje pristnosti JWT, omejitve globine poizvedb – vse vključeno v načrt vzdrževanja. Pregled delovanja in pregled N+1 za obstoječe API-je.
Pogosta vprašanja
Ali moram izbrati samo eno? Ne. Številne produkcijske aplikacije imajo tako končne točke REST kot GraphQL.
Je GraphQL varnejši od REST-a? Drugačna površina za napad. Sam po sebi ni varnejši. Pravilno ga je treba konfigurirati.
WPGraphQL ali WP REST API za brezglavi sistem? WPGraphQL – sodobnejši, boljši DX, manj režijskih stroškov. WP REST je dobra rezerva.
Ali lahko imam GraphQL pred REST API-jem? Da, vzorec "BFF (Backend za Frontend)" - prehod GraphQL, ki posreduje REST mikrostoritve. Dražja nastavitev, uporabna za mikrostoritve.
Stroški časa nastavitve? REST: minute. GraphQL: dnevi-tedni za pravilno načrtovanje sheme. Za prototipe je REST hitrejši začetek.
Potrebujete nastavitev API-ja ali migracijo? WMD nastavi REST/GraphQL za WP, Craft, Laravel z ustrezno avtorizacijo, predpomnjenjem in omejitvijo hitrosti. Stopite v stik z nami prek kontaktnega obrazca .