Eine der häufigsten Entscheidungen zu Beginn eines neuen Projekts ist diese: REST vs GraphQL — mit welchem Ansatz baust du deine API-Schicht? Beide sind ausgereifte, bewährte Wege, Daten zwischen Client und Server zu transportieren, aber sie lösen unterschiedliche Probleme auf unterschiedliche Weise. In diesem Artikel erkläre ich die Kernidee hinter jedem Ansatz, ihre Stärken und Schwächen, praktische Themen wie Over/Under-Fetching und Caching und schließlich, wann du welchen wählen solltest.
Die Kernidee hinter jedem Ansatz
REST modelliert Ressourcen mit URLs. Jede Ressource hat eine Adresse, und du wirkst mit HTTP-Verben (GET, POST, PUT, DELETE) auf sie ein. Typischerweise gibt /users/42 einen Benutzer zurück und /users/42/posts dessen Beiträge. Der Server entscheidet, welche Felder zurückgegeben werden.
GraphQL hingegen ist eine Abfragesprache, die über einen einzigen Endpoint läuft (meist /graphql). Der Client gibt in einer Query genau an, welche Felder er möchte, und der Server gibt nur diese Felder zurück. Die Seite, die über die Form der Daten entscheidet, ist also der Client, nicht der Server.
Vergleichen wir dieselben Daten mit beiden Ansätzen. Einen Benutzer in REST abrufen:
GET /users/42
{
"id": 42,
"name": "Aslain",
"email": "hello@aslain.dev",
"createdAt": "2026-01-10"
}
In GraphQL nur Name und E-Mail desselben Benutzers anfordern:
query {
user(id: 42) {
name
email
}
}
Die Antwort entspricht exakt der angeforderten Form:
{
"data": {
"user": { "name": "Aslain", "email": "hello@aslain.dev" }
}
}
Over-Fetching und Under-Fetching
Der meistgepriesene Vorteil von GraphQL dreht sich um diese beiden Begriffe. Over-Fetching bedeutet, mehr Daten zu erhalten, als du brauchst: In REST gibt /users/42 Name, E-Mail, Registrierungsdatum und vielleicht zehn weitere Felder zurück, aber wenn du nur den Namen anzeigst, wurde der Rest umsonst übertragen.
Under-Fetching bedeutet, in einer einzigen Anfrage nicht genug Daten zu bekommen. Um einen Benutzer und seine letzten fünf Beiträge in REST anzuzeigen, musst du zwei Anfragen stellen — zuerst /users/42, dann /users/42/posts. Das ist das N+1-Anfrageproblem. In GraphQL kannst du alles verschachtelt in einer einzigen Query anfordern:
query {
user(id: 42) {
name
posts(last: 5) { title publishedAt }
}
}
Das ist ein echter Gewinn, besonders in mobilen Apps und bei geringer Bandbreite. Aber Achtung: Diese Probleme lassen sich auch auf der REST-Seite lösen. Feldauswahl-Parameter wie ?fields=name,email reduzieren Over-Fetching, während Embedding-Parameter wie ?include=posts Under-Fetching weitgehend beheben. Was GraphQL löst, ist in REST also nicht unmöglich; es erfordert nur Designdisziplin.
Caching: wo REST glänzt
Hier neigt sich die Waage zu REST. REST passt perfekt zu den nativen Caching-Mechanismen von HTTP. Da jede Ressource eine eindeutige URL hat, können Browser, CDNs und Reverse-Proxys (Nginx, Varnish, Cloudflare) GET-Antworten leicht anhand der Header Cache-Control, ETag und Last-Modified cachen.
In GraphQL ist fast alles eine einzige POST /graphql-Anfrage, deren Body sich jedes Mal unterscheidet. Caching auf HTTP-Ebene ist daher schwierig; du verlagerst das Caching meist auf die Client-Seite (den normalisierten Cache von Bibliotheken wie Apollo Client, urql oder Relay) oder auf serverseitige Lösungen auf Feldebene (zum Beispiel persisted queries). Das ist mächtig, erfordert aber mehr Einrichtung.
Schema, Typen und Entwicklererfahrung
GraphQL hat ein starkes Typsystem. Das Schema ist ein Vertrag: Es definiert explizit, welche Felder existieren, ihre Typen und ihre Beziehungen. Dadurch:
- Automatische Dokumentation: Werkzeuge wie GraphiQL oder Apollo Studio erzeugen aus dem Schema eine lebendige, durchsuchbare Dokumentation.
- Typsicherheit: Mit TypeScript-Codegeneratoren erhältst du End-to-End-Typen auf der Client-Seite.
- Eine Quelle, viele Bildschirme: Web, Mobile und verschiedene Clients ziehen alle aus demselben Schema, was sie brauchen; das Backend-Team muss nicht für jeden Bildschirm einen neuen Endpoint öffnen.
Auf der REST-Seite erhältst du eine ähnliche Garantie mit OpenAPI (früher Swagger). Das OpenAPI-Schema bietet ebenfalls Dokumentation und Generierung von Client-Code; da das Typsystem GraphQL jedoch innewohnt, kommt diese Disziplin dort natürlicher.
Komplexität und worauf zu achten ist
GraphQL gibt es nicht umsonst. Der Preis seiner Flexibilität ist, dass du einige Probleme auf der Server-Seite selbst lösen musst:
- Das N+1-Abfrageproblem: Verschachtelte Felder können viele separate Abfragen an die Datenbank abfeuern. Um das zu lösen, brauchst du Batching-Werkzeuge wie
DataLoader. - Abfragekosten: Ein Client kann den Server mit einer sehr tiefen oder sehr breiten Query belasten. Begrenzung der Abfragetiefe und Query-Cost-Analysis sind unverzichtbar.
- Caching und Fehlerbehandlung: Wie oben erwähnt, ist HTTP-Caching schwach; zudem gibt GraphQL selbst bei Fehlern
200 OKzurück und trägt den Fehler imerrors-Feld des Bodys, was die Überwachung verändert.
REST punktet mit Einfachheit. HTTP-Statuscodes (404, 201, 401) sind von Natur aus aussagekräftig, das Tooling-Ökosystem ist riesig, und fast jeder Entwickler kennt REST bereits. In kleinen und mittleren Projekten ist diese Einfachheit oft die richtige Wahl.
Wann solltest du was wählen?
Es gibt keine feste Regel, aber diese Kriterien erleichtern die Entscheidung:
- Wähle REST: wenn deine Ressourcen klar und einfach sind, wenn HTTP-Caching und CDNs für dich entscheidend sind, wenn dein Team mit REST vertraut ist oder wenn du eine einfache öffentliche API veröffentlichst.
- Wähle GraphQL: wenn du viele verschiedene Clients (Web + Mobile) hast, die jeweils eine andere Datenform wollen, wenn verschachtelte Beziehungen komplex sind oder wenn Backend- und Frontend-Teams schnell und unabhängig vorankommen wollen.
Denk daran: Das ist kein Entweder-oder-Krieg. Viele Teams nutzen beides zusammen — etwa GraphQL für client-getriebene Datenaggregation und REST für Datei-Uploads, Webhooks und Drittanbieter-Integrationen. Wichtig ist, auf die echten Bedürfnisse des Projekts zu schauen, nicht auf Ideologie.
Häufige Fragen
Wird GraphQL REST ersetzen?
Nein. Auch wenn GraphQL in manchen Szenarien eine reibungslosere Entwicklererfahrung als REST bietet, sind die Einfachheit von REST und seine Abstimmung auf HTTP-Caching weiterhin sehr wertvoll. Beide koexistieren seit Jahren und werden es weiterhin tun; das richtige Werkzeug hängt ganz von deinem Anwendungsfall ab.
Ist GraphQL schneller?
Es allein als "schneller" zu bezeichnen, ist irreführend. GraphQL kann die wahrgenommene Geschwindigkeit auf der Client-Seite verbessern, indem es unnötige Daten über das Netzwerk reduziert und mehrere Anfragen in einer Query zusammenfasst. Aber wenn N+1-Abfragen auf der Server-Seite nicht richtig verwaltet werden, kann es sogar langsamer sein als REST. Geschwindigkeit hängt von deiner Architektur und Optimierung ab.
Sollte ich meine bestehende REST API zu GraphQL migrieren?
Eine funktionierende REST API nur deshalb neu zu schreiben, weil es im Trend liegt, ist selten sinnvoll. Wenn du echten Over/Under-Fetching-Schmerz spürst oder deine Client-Vielfalt gewachsen ist, ist es oft der klügere Weg, GraphQL als Schicht über dem bestehenden REST hinzuzufügen (ein Gateway-Ansatz).
Möchtest du deine API-Architektur richtig aufsetzen? Wenn du Hilfe beim Entwurf einer skalierbaren API mit REST oder GraphQL auf der Laravel- und Node.js-Seite brauchst, nimm Kontakt mit mir auf — lass uns gemeinsam den besten Ansatz für dein Projekt wählen.