PHP Academy · Lektion

GraphQL kontra REST

Forstå, hvornår GraphQL er bedre end REST, og hvorfor.

Lektion 1 af 413 trin

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/1 returnerer 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/posts og 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 /graphql er 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.

Gratis at komme i gang

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

  1. GraphQL kontra REST
  2. Opbygning af et skema med graphql-php
  3. Resolvers, mutationer og abonnementer
  4. Ydeevne: N+1 og DataLoader
← Tilbage til PHP Academy