GraphQL ist eine Abfragesprache und Spezifikation für Anwendungsdienste. Eine GraphQL-API beschreibt ihre Fähigkeiten über ein Typsystem; Clients formulieren Abfragen, die festlegen, welche Felder und verschachtelten Beziehungen sie als Antwort benötigen.
Was ist GraphQL?
Eine mobile App benötigt zu einem Auftrag nur Nummer, Status und Kundenname. Eine Desktop-Anwendung benötigt zusätzlich Positionen, Dokumente und Lieferinformationen. Bei GraphQL können beide Clients über dieselbe API genau die Felder abfragen, die sie benötigen.
Die GraphQL-Spezifikation beschreibt GraphQL als Abfragesprache für Anwendungsdienste mit einer flexiblen Syntax und einem Typsystem. GraphQL schreibt dabei weder eine Programmiersprache noch eine Datenbank vor.
Eine einfache GraphQL-Abfrage
{ order(id: 42) { number status customer { name } } }
Der Client benennt die gewünschten Felder. Die Antwort folgt in der Regel derselben Struktur. Dadurch kann ein Client verschachtelte Informationen in einer Anfrage zusammenstellen, sofern das Schema diese Beziehungen anbietet.
Das Schema ist der Vertrag der API
Ein zentrales Element von GraphQL ist das Typsystem. Das Schema beschreibt, welche Typen, Felder und Operationen verfügbar sind. Clients können das Schema untersuchen und Werkzeuge können daraus Dokumentation, Validierung und Autovervollständigung ableiten.
Queries und Mutations
Queries werden für lesende Abfragen verwendet. Mutations beschreiben Operationen, die Daten verändern. Zusätzlich existieren in vielen Implementierungen Subscriptions für ereignisbasierte Aktualisierungen.
GraphQL vs. REST
GraphQL ist nicht pauschal „moderner“ oder besser als REST. Beide Ansätze lösen API-Kommunikation mit unterschiedlichen Schwerpunkten.
- REST organisiert Ressourcen typischerweise über mehrere HTTP-Endpunkte.
- GraphQL bündelt viele Abfragen hinter einem Schema und erlaubt flexible Feldauswahl.
- HTTP-Caching ist bei klassischen REST-Ressourcen häufig direkter nutzbar.
- GraphQL kann bei komplexen, clientabhängigen Datenanforderungen Over- und Underfetching reduzieren.
Für eine einfache öffentliche API mit wenigen stabilen Ressourcen kann REST völlig ausreichend sein. Bei einer Anwendung mit vielen Oberflächen und stark unterschiedlichen Datenbedürfnissen kann GraphQL dagegen die Client-Entwicklung vereinfachen.
GraphQL verschiebt Komplexität auf den Server
Flexible Abfragen sind mächtig, müssen aber kontrolliert werden. Ohne Limits können Clients sehr tiefe oder rechenintensive Queries erzeugen. Deshalb gehören Query-Komplexität, Depth Limits, Timeouts, Autorisierung und Monitoring zur produktiven Architektur.
Das N+1-Problem
Ein bekanntes Performanceproblem entsteht, wenn Resolver für jedes Element einer Liste separat auf Datenquellen zugreifen. Bei 100 Aufträgen könnten dann 100 zusätzliche Abfragen entstehen. Batching und Caching, beispielsweise über DataLoader-Muster, helfen dabei, solche Zugriffe zusammenzufassen.
Versionierung funktioniert anders als bei vielen REST APIs
GraphQL-Schemas werden häufig evolutionär weiterentwickelt. Neue Felder können ergänzt werden, ohne vorhandene Clients zu brechen. Nicht mehr gewünschte Felder lassen sich als deprecated markieren, während Verbraucher Zeit für die Migration erhalten.
Das reduziert den Druck, bei jeder Änderung einen neuen Endpunkt wie /v2 einzuführen. Es funktioniert aber nur, wenn Schemaänderungen diszipliniert gepflegt und Breaking Changes vermieden oder klar gesteuert werden.
Autorisierung muss feldnah gedacht werden
Weil Clients sehr unterschiedliche Datenkombinationen abfragen können, reicht eine Prüfung auf Endpunktebene oft nicht aus. Berechtigungen sollten sich daran orientieren, welche Entitäten und Felder ein Nutzer sehen oder verändern darf. Gerade bei verschachtelten Abfragen ist das Teil der fachlichen API-Logik und nicht nur ein vorgeschalteter Security-Filter.
Fazit
GraphQL gibt Clients große Freiheit bei der Auswahl benötigter Daten und kombiniert diese Freiheit mit einem klaren Typsystem. Besonders bei komplexen Anwendungsoberflächen kann das sehr produktiv sein. Die Flexibilität ist jedoch kein kostenloser Vorteil: Performance, Sicherheit und Query-Kontrolle müssen bewusst in die API-Architektur eingebaut werden.
Passende Leistungen von Wils Solutions
Häufige Fragen
Ist GraphQL eine Datenbank?
Nein. GraphQL ist eine Abfragesprache und Spezifikation für Anwendungsdienste. Die dahinterliegenden Daten können aus Datenbanken, APIs oder anderen Systemen stammen.
Ist GraphQL besser als REST?
Nicht grundsätzlich. GraphQL eignet sich besonders für flexible und verschachtelte Datenanforderungen. REST kann für einfache, ressourcenorientierte APIs übersichtlicher sein.
Was ist ein GraphQL-Schema?
Das Schema definiert die Typen, Felder und Operationen, die eine GraphQL-API anbietet.
Was ist eine Mutation?
Eine Mutation ist eine GraphQL-Operation, die typischerweise Daten verändert, beispielsweise einen Datensatz anlegt oder aktualisiert.