GraphQL ist eine Abfragesprache fuer APIs und eine serverseitige Runtime zur Ausfuehrung dieser Abfragen. Im Gegensatz zu traditionellen REST APIs, bei denen der Server die Struktur der Antwort bestimmt, gibt GraphQL dem Client die Kontrolle: Er fragt exakt die Daten ab, die er benoetigt.
GraphQL wurde 2012 bei Facebook entwickelt, um die Performance der mobilen App zu verbessern. Die bestehende REST-API lieferte entweder zu viele oder zu wenige Daten -- ein Problem, das GraphQL elegant loest. 2015 wurde es als Open Source veroeffentlicht und hat seitdem die Art und Weise veraendert, wie APIs designt werden.
Das Grundprinzip: Client bestimmt die Daten
Over-Fetching und Under-Fetching
Das zentrale Problem, das GraphQL loest:
| Problem | REST | GraphQL |
|---|---|---|
| Over-Fetching | /users/1 liefert alle 30 Felder, obwohl nur Name und E-Mail benoetigt werden | Client fragt nur name und email ab |
| Under-Fetching | Fuer Profil + Posts + Kommentare sind 3 API-Calls noetig | Ein einziger Query holt alle zusammenhaengenden Daten |
Eine Query, alle Daten
Ein GraphQL-Query fuer eine Profilseite koennte so aussehen:
query {
user(id: "1") {
name
email
posts(last: 5) {
title
createdAt
comments {
text
author { name }
}
}
}
}
Statt drei REST-Calls (/users/1, /users/1/posts, /posts/X/comments) erhaelt der Client mit einer einzigen Anfrage genau die Daten, die er fuer die Darstellung braucht.
Kernkonzepte von GraphQL
Schema und Types
Das GraphQL-Schema definiert die verfuegbaren Daten und deren Struktur. Es ist gleichzeitig Dokumentation und Vertrag zwischen Client und Server.
Queries (Lesen)
Queries dienen dem Abrufen von Daten. Der Client definiert die Struktur der gewuenschten Antwort, der Server fuellt sie mit Daten.
Mutations (Schreiben)
Mutations aendern Daten auf dem Server -- das Aequivalent zu POST, PUT und DELETE in REST.
Subscriptions (Echtzeit)
Subscriptions ermoglichen Echtzeit-Updates: Der Client abonniert bestimmte Ereignisse und wird automatisch benachrichtigt, wenn sich Daten aendern.
Resolvers
Resolver-Funktionen auf dem Server bestimmen, woher die Daten fuer jedes Feld kommen -- aus einer Datenbank, einem anderen Service oder einer externen API.
GraphQL vs. REST
| Kriterium | REST | GraphQL |
|---|---|---|
| Endpunkte | Mehrere (ein Endpunkt pro Ressource) | Einer (/graphql) |
| Datenmenge | Vom Server bestimmt | Vom Client bestimmt |
| Versionierung | URL-basiert (/api/v2/) | Nicht noetig (Schema-Evolution) |
| Caching | HTTP-Caching einfach | Komplexer (POST-Requests) |
| Lernkurve | Niedrig | Mittel |
| Tooling | Ausgereift | Stark wachsend (Apollo, Relay) |
| Fehlermanagement | HTTP-Statuscodes | Immer 200 OK, Fehler im Body |
GraphQL im Webentwicklungs-Oekosystem
Headless CMS mit GraphQL
Viele moderne Headless CMS-Systeme bieten GraphQL-APIs an:
- Contentful: GraphQL-API als Alternative zur REST-API
- Hygraph (ehemals GraphCMS): GraphQL-native, kein REST
- Strapi: GraphQL-Plugin verfuegbar
- Sanity: GROQ als eigene Query-Sprache, GraphQL als Alternative
GraphQL mit React und Next.js
In React- und Next.js-Anwendungen hat sich Apollo Client als beliebteste GraphQL-Client-Library etabliert. Alternativen sind urql und Relay (Facebooks eigene Library).
GraphQL Federation
Fuer Microservices-Architekturen ermoeglicht Apollo Federation die Kombination mehrerer GraphQL-APIs zu einem einzigen, vereinheitlichten Schema. Jeder Service definiert seinen Teil des Schemas, und das Gateway fuegt sie zusammen.
Herausforderungen von GraphQL
Caching
Da alle GraphQL-Anfragen als POST an denselben Endpunkt gehen, funktioniert klassisches HTTP-Caching nicht. Client-seitige Caching-Loesungen (Apollo Cache, Normalized Cache) loesen das Problem, erhoehen aber die Komplexitaet.
N+1-Problem
Wenn ein Resolver fuer jedes Element in einer Liste einen eigenen Datenbankaufruf macht, entstehen N+1 Queries. DataLoader (ein Pattern/Tool von Facebook) loest dieses Problem durch Batching.
Sicherheit
GraphQL erlaubt beliebig tiefe und komplexe Queries. Ohne Begrenzung kann ein boesartiger Client den Server mit einer extrem verschachtelten Query ueberlasten. Query Depth Limiting, Complexity Analysis und Rate Limiting sind Pflicht.
Wann GraphQL einsetzen?
GraphQL ist die richtige Wahl fuer Projekte mit komplexen Datenbeziehungen, mehreren Client-Typen und dem Beduerfnis nach flexibler Datenabfrage. Fuer einfache CRUD-APIs mit wenigen Clients ist eine REST API oft einfacher und ausreichend.