GraphQL vs. REST
Verstehen, wann GraphQL REST überlegen ist und warum
GraphQL vs. REST ist eine kostenlose PHP Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des PHP Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum GraphQL?
Sie wissen bereits, wie Sie REST-APIs in PHP bereitstellen. GraphQL ist kein Ersatz für HTTP und kein Allheilmittel – es ist eine Abfragesprache und ein Typsystem, mit denen der Client genau beschreiben kann, was er benötigt, und genau das in einem Roundtrip zurückerhält.
In dieser Lektion vergleichen wir beide Ansätze sachlich: wo GraphQL tatsächlich überlegen ist, wann REST weiterhin die richtige Wahl darstellt und welche betrieblichen Kosten GraphQL verursacht.
Over-fetching und Under-fetching
Die klassischen Schwachstellen von REST:
- Over-fetching:
GET /users/1gibt 40 Felder zurück, obwohl die UI nur 3 benötigt. - Under-fetching: Um die Beiträge eines Benutzers und die Anzahl der Kommentare zu jedem Beitrag darzustellen, rufen Sie zunächst
/users/1, dann/users/1/postsund anschließend N Kommentarendpunkte auf.
GraphQL führt dies in einer einzigen deklarativen Anfrage zusammen.
query {
user(id: 1) {
name
posts {
title
commentCount
}
}
}Ein Endpunkt, ein typisiertes Schema
REST stellt viele URLs bereit; GraphQL stellt einen Endpunkt bereit (normalerweise POST /graphql), der auf einem stark typisierten Schema basiert. Das Schema ist der Vertrag – es kann per Introspection untersucht werden, sodass Werkzeuge wie Autovervollständigung, Dokumentation und Codegenerierung automatisch verfügbar sind.
Unten sehen Sie ein minimales Schema in SDL. Die Struktur jeder möglichen Antwort ist im Voraus bekannt.
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
commentCount: Int!
}
type Query {
user(id: ID!): User
}Die Antwort spiegelt die Anfrage wider
Eine zentrale Eigenschaft: Die Struktur der JSON-Antwort ist aus der Anfrage vorhersehbar. Clients müssen niemals Feldnamen erraten. Dadurch entfällt eine ganze Klasse von Versionsproblemen – Sie können Felder hinzufügen, ohne alte Clients zu beschädigen, und Felder mit @deprecated als veraltet markieren, statt /v2-URLs einzuführen.
{
"data": {
"user": {
"name": "Ada",
"posts": [
{ "title": "On Engines", "commentCount": 12 }
]
}
}
}Wo GraphQL REST überlegen ist
GraphQL ist die bessere Wahl, wenn:
- Sie viele unterschiedliche Clients bedienen (Web, iOS, Android), die unterschiedliche Daten benötigen.
- Die Daten einen Graphen bilden, den Clients dynamisch über tiefe Beziehungen durchlaufen.
- Sie mehrere Backends aggregieren möchten, die hinter einem einzigen typisierten Gateway liegen.
- Schnelle Iterationen im Frontend wichtig sind und Sie endlose Änderungen an Backend-Endpunkten vermeiden möchten.
Wo REST weiterhin überzeugt
Greifen Sie nicht reflexartig zu GraphQL. REST ist einfacher und oft die bessere Wahl, wenn:
- Sie HTTP-Caching benötigen — CDN-/Edge-Caches orientieren sich an URLs und Verben; ein einzelnes
POST /graphqlist für sie undurchsichtig. - Die API ressourcenorientiert und stabil ist (CRUD für wenige Entitäten).
- Sie auf Datei-Uploads/-Downloads oder Streaming angewiesen sind, bei denen Multipart und Byte-Ranges in REST First-Class-Konzepte sind.
- Ihre Clients Drittanbieter sind, die konventionelle REST-Semantik erwarten.
Ein kurzer PHP-Vergleich
Hier sehen Sie dieselben Daten in PHP auf REST-Art zusammengestellt — beachten Sie, dass der Client weiterhin mehrere Aufrufe benötigen würde oder Sie einen Embed-Parameter von Hand erstellen müssten. GraphQL verlagert diese Auswahl-Logik stattdessen zum Client.
<?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);
Die zusätzlichen Kosten von GraphQL
GraphQL verlagert die Komplexität auf den Server. Neue Aspekte, für die Sie nun verantwortlich sind:
- N+1-Abfragen — verschachtelte Resolver lösen pro Knoten jeweils eine DB-Abfrage aus, sofern Sie sie nicht bündeln (DataLoader).
- Begrenzung von Query-Kosten und -Tiefe — eine böswillige, tief verschachtelte Abfrage kann einen DoS-Angriff verursachen.
- Caching ist schwieriger; typischerweise cachen Sie auf der Resolver-/Datenebene und nicht über HTTP.
- Fehlerbehandlung unterscheidet sich — ein
200 OKkann trotzdem einerrors-Array enthalten.
Fehler: 200 mit einem errors-Array
Im Gegensatz zu REST-Statuscodes liefert GraphQL üblicherweise den HTTP-Status 200 und meldet teilweise Fehler im Body. data kann teilweise befüllt sein, während errors die fehlgeschlagenen Vorgänge auflistet. Ihre Clients müssen beides prüfen.
{
"data": { "user": null },
"errors": [
{
"message": "User not found",
"path": ["user"],
"extensions": { "code": "NOT_FOUND" }
}
]
}Entscheidungshilfe
Eine pragmatische Faustregel:
- Öffentliche, cache-intensive APIs mit ressourcenorientiertem CRUD → REST.
- Interne Produkt-APIs, die vielfältige, funktionsreiche Clients mit verknüpften Daten versorgen → GraphQL.
- Viele Backends, die hinter einem einzigen typisierten Vertrag vereinheitlicht werden sollen → GraphQL-Gateway.
Es ist üblich und sinnvoll, beides zu betreiben: REST für Webhooks/Uploads, GraphQL für den Lesegraphen der App.
GraphQL über HTTP in PHP bereitstellen
Im Betrieb ist ein GraphQL-Endpunkt in PHP eine Route, die den JSON-Body liest, query und variables herauszieht, die Abfrage anhand des Schemas ausführt und { data, errors } zurückgibt. Im Vergleich zu den vielen REST-Routen ist der Transport einheitlich — die gesamte Variation steckt im Query-String, den der Client sendet.
<?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]);
Wissenscheck
Wann hat REST gegenüber GraphQL weiterhin einen klaren Vorteil?
Zusammenfassung
Sie haben GraphQL und REST inhaltlich verglichen:
- GraphQL behebt Probleme durch Overfetching und Underfetching mit einem typisierten Endpunkt und clientgesteuerter Auswahl.
- Es spielt seine Stärken bei vielen Clients, graphförmigen Daten und der Aggregation im Backend aus.
- REST bleibt stark bei cachebaren öffentlichen APIs, einfachem CRUD, Uploads und konventionellen Konsumenten.
- GraphQL verlagert die Kosten auf den Server: N+1, Query-Kostenlimits, Caching und die Semantik von 200 mit errors.
Als Nächstes: ein Schema mit webonyx/graphql-php tatsächlich erstellen.
Häufig gestellte Fragen
Ist die Lektion „GraphQL vs. REST“ kostenlos?
Ja — der vollständige Text von „GraphQL vs. REST“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des PHP Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „GraphQL vs. REST“?
Verstehen, wann GraphQL REST überlegen ist und warum Du übst PHP Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um PHP Academy zu starten?
Keine Vorkenntnisse erforderlich. PHP Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „GraphQL vs. REST“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser PHP Academy-Lektion Code schreiben und ausführen?
Ja. Jede PHP Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- GraphQL vs. REST
- Ein Schema mit graphql-php erstellen
- Resolver, Mutationen und Subscriptions
- Performance: N+1 und DataLoader