GraphQL kontra REST
Forstå, hvornår GraphQL er bedre end REST, og hvorfor.
GraphQL kontra REST er en gratis PHP Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i PHP Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. PHP Academy-kurset indeholder 4 lektioner i alt.
Hvorfor GraphQL?
Du ved allerede, hvordan du leverer REST-API'er i PHP. GraphQL er ikke en erstatning for HTTP eller en magisk løsning – det er et forespørgselssprog og et typesystem, der lader klienten beskrive præcis, hvad den har brug for, og får præcis det tilbage i én rundrejse.
I denne lektion sammenligner vi de to ærligt: hvor GraphQL virkelig er bedre, hvor REST stadig er det rigtige valg, og hvad GraphQL koster driftsmæssigt.
For meget og for lidt data
De klassiske problemer med REST:
- For meget data:
GET /users/1returnerer 40 felter, selv om brugerfladen kun har brug for 3. - For lidt data: For at gengive en brugers indlæg og antallet af kommentarer til hvert indlæg kalder du
/users/1, derefter/users/1/postsog derefter N kommentarslutpunkter.
GraphQL samler dette i én deklarativ forespørgsel.
query {
user(id: 1) {
name
posts {
title
commentCount
}
}
}Ét slutpunkt, et typet skema
REST udstiller mange URL'er, mens GraphQL udstiller ét slutpunkt (som regel POST /graphql) med et stærkt typet skema bag sig. Skemaet er kontrakten – det kan inspiceres, så værktøjer som automatisk fuldførelse, dokumentation og kodegenerering følger med uden ekstra arbejde.
Nedenfor ser du et minimalt skema i SDL. Formen på hvert muligt svar er kendt på forhånd.
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
commentCount: Int!
}
type Query {
user(id: ID!): User
}Svaret afspejler forespørgslen
En vigtig egenskab er, at JSON-svarets form er forudsigelig ud fra forespørgslen. Klienter behøver aldrig gætte feltnavne. Det fjerner en hel kategori af versionsbesvær – du kan tilføje felter uden at ødelægge gamle klienter og udfase felter med @deprecated i stedet for at fjerne URL'er som /v2.
{
"data": {
"user": {
"name": "Ada",
"posts": [
{ "title": "On Engines", "commentCount": 12 }
]
}
}
}Hvor GraphQL er bedre end REST
GraphQL er det stærkere valg, når:
- Du betjener mange forskellige klienter (web, iOS, Android) med forskellige databehov.
- Dataene danner en graf med dybe relationer, som klienterne navigerer dynamisk i.
- Du vil samle flere bagvedliggende tjenester bag én typet gateway.
- Hurtig udvikling af brugerfladen er vigtig, og du vil undgå endeløse ændringer af slutpunkter i backend.
Hvor REST stadig vinder
Grib ikke automatisk til GraphQL. REST er enklere og ofte bedre, når:
- Du har brug for HTTP-caching — CDN-/edge-cachelagre bruger URL'er og HTTP-metoder som nøgler; et enkelt
POST /graphqler uigennemsigtigt for dem. - API'et er ressourceorienteret og stabilt (CRUD over nogle få entiteter).
- Du er afhængig af filoverførsler eller streaming, hvor multipart og byteintervaller er førsteklasses i REST.
- Dine forbrugere er tredjeparter, som forventer konventionel REST-semantik.
En hurtig sammenligning med PHP
Her er de samme data samlet på REST-måden i PHP — bemærk, at klienten stadig skal foretage flere kald, eller at du selv må skrive en embed-parameter. GraphQL flytter i stedet denne udvælgelseslogik til klienten.
<?php
// REST: server decides the payload shape
function userResource(int $id): array {
return [
'id' => $id,
'name' => 'Ada',
'email' => 'ada@example.com', // over-fetched by mobile
'createdAt' => '1815-12-10',
'posts' => [ // pre-embedded, all-or-nothing
['title' => 'On Engines', 'commentCount' => 12],
],
];
}
header('Content-Type: application/json');
echo json_encode(userResource(1), JSON_PRETTY_PRINT);
Omkostningerne ved GraphQL
GraphQL flytter kompleksiteten til serveren. Nye ting, du nu selv har ansvar for:
- N+1-forespørgsler — indlejrede resolvere udløser én databaseforespørgsel pr. node, medmindre du samler dem i batches (DataLoader).
- Begrænsning af forespørgselsomkostning og -dybde — en ondsindet dybt indlejret forespørgsel kan overbelaste din tjeneste.
- Caching er sværere; typisk cachelagrer du på resolver-/datalaget, ikke på HTTP-niveauet.
- Fejlhåndtering er anderledes — et 200 OK kan stadig indeholde et
errors-array.
Fejl: 200 med et errors-array
I modsætning til REST-statuskoder returnerer GraphQL normalt HTTP 200 og rapporterer delvise fejl i svaret. data kan være delvist udfyldt, mens errors oplister det, der mislykkedes. Dine klienter skal undersøge begge.
{
"data": { "user": null },
"errors": [
{
"message": "User not found",
"path": ["user"],
"extensions": { "code": "NOT_FOUND" }
}
]
}Beslutningsregel
En pragmatisk tommelfingerregel:
- Offentlige, cachetunge API'er med ressourcebaseret CRUD → REST.
- Interne produkt-API'er, der leverer data til forskellige funktionsrige klienter over sammenkoblede data → GraphQL.
- Mange backend-systemer, der skal samles bag én typet kontrakt → GraphQL-gateway.
Det er almindeligt og fornuftigt at bruge begge: REST til webhooks og filoverførsler, GraphQL til appens læsegraf.
Sådan leverer du GraphQL over HTTP i PHP
I praksis er et GraphQL-endepunkt i PHP én rute, der læser JSON-indholdet, trækker query og variables ud, udfører forespørgslen mod skemaet og returnerer { data, errors }. Sammenlignet med REST's mange ruter er transporten ensartet — al variation ligger i forespørgselsstrengen, som klienten sender.
<?php
// Minimal GraphQL-over-HTTP entry point
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$query = $input['query'] ?? '';
$variables = $input['variables'] ?? null;
// $result = GraphQL::executeQuery($schema, $query, null, $ctx, $variables);
// header('Content-Type: application/json');
// echo json_encode($result->toArray());
var_dump(['query' => $query, 'variables' => $variables]);
Hurtigt tjek
Hvornår har REST fortsat en klar fordel frem for GraphQL?
Opsamling
Du sammenlignede GraphQL og REST på det væsentlige:
- GraphQL løser problemet med for meget eller for lidt hentede data med ét typet endepunkt og klientstyret udvælgelse.
- Det udmærker sig med mange klienter, grafstrukturerede data og aggregering på backend.
- REST står stærkt for cachebare offentlige API'er, enkel CRUD, filoverførsler og konventionelle klienter.
- GraphQL flytter omkostningen til serveren: N+1, begrænsninger på forespørgselsomkostning, caching og semantik for 200-med-fejl.
Næste: at bygge et skema med webonyx/graphql-php.
Lær PHP med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 49
- Lektioner
- 195
Ofte stillede spørgsmål
Er lektionen “GraphQL kontra REST” gratis?
Ja — hele teksten til “GraphQL kontra REST” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af PHP Academy-kurset, skal du opgradere til CoddyKit PRO. PHP Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “GraphQL kontra REST”?
Forstå, hvornår GraphQL er bedre end REST, og hvorfor. Du øver dig i PHP Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på PHP Academy?
Der kræves ingen tidligere erfaring. PHP Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “GraphQL kontra REST”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne PHP Academy-lektion?
Ja. Alle PHP Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- GraphQL kontra REST
- Opbygning af et skema med graphql-php
- Resolvers, mutationer og abonnementer
- Ydeevne: N+1 og DataLoader