Was ist GraphQL?
Graph Query Language
GraphQL ist eine Abfragesprache für Programmierschnittstellen, bei der ein typisiertes Schema festlegt, welche Daten es gibt, und der aufrufende Client in seiner Anfrage genau die Felder benennt, die er braucht.
Wenn eine App für einen einzigen Bildschirm fünf Schnittstellen abklappert und dabei ein Vielfaches der benötigten Daten lädt, kommt GraphQL im Team auf den Tisch.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
- Entstanden bei
- Facebook, öffentlich seit 2015
- Heute bei
- GraphQL Foundation
- Aufbau
- Ein Endpunkt, ein typisiertes Schema
- Bekanntes Problem
- N+1-Abfragen in den Resolvern
Schema, Query, Mutation, Resolver
Am Anfang steht das Schema. Es beschreibt Typen und Felder, etwa einen Typ Benutzer mit den Feldern name und projekte, und ist gleichzeitig Dokumentation und Vertrag. Werkzeuge lesen es aus und bieten Autovervollständigung im Editor an, ohne dass jemand eine Extra-Doku pflegt.
Lesende Anfragen heißen Query, schreibende heißen Mutation, und für laufende Aktualisierungen über eine offene Verbindung gibt es die Subscription. Query und Mutation gehen an denselben Endpunkt, meist per POST. Die Antwort hat exakt die Form der Anfrage: Fragst du den Namen und die Titel der Projekte ab, bekommst du genau diese beiden Felder zurück, verschachtelt, wie du sie notiert hast.
Hinter jedem Feld steht auf dem Server ein Resolver, also eine kleine Funktion, die den Wert beschafft. Woher er ihn hat, ist GraphQL egal: aus einer Datenbank, aus einem anderen Dienst, aus dem Cache. Genau deshalb lässt sich GraphQL auch als Fassade vor bestehende Systeme legen.
Warum Teams das einführen
Der übliche Auslöser ist eine App, die für einen einzigen Bildschirm drei Endpunkte nacheinander aufrufen muss und dabei jedes Mal Felder mitbekommt, die niemand anzeigt. Mit GraphQL wird daraus eine Anfrage, die genau die Felder dieses Bildschirms enthält.
Der zweite Grund ist die Entkopplung. Wenn das Frontend ein neues Feld braucht, wird es dem Schema hinzugefügt, alte Abfragen bleiben gültig. Versionierte Pfade wie /v2/ entfallen meist, stattdessen markierst du alte Felder als deprecated und siehst in der Auswertung, wer sie noch abruft.
Was dabei schiefgeht
Das bekannteste Problem heißt N plus 1: Ein Resolver für eine Liste fragt für jeden Eintrag einzeln die Datenbank ab, aus einer Abfrage werden hunderte. Die Standardantwort ist ein Batching-Layer nach dem Muster von DataLoader, der die Einzelabrufe innerhalb eines Durchlaufs sammelt und gebündelt ausführt.
Das zweite ist die Angriffsfläche. Weil Clients Abfragen frei zusammenbauen, kann eine tief verschachtelte Anfrage einen Server über Gebühr beschäftigen. Üblich sind deshalb eine Begrenzung der Verschachtelungstiefe, Kostenbudgets pro Abfrage und im Produktivbetrieb oft nur vorab registrierte Abfragen.
Und schließlich das Caching: REST profitiert davon, dass sich Antworten auf GET über die URL zwischenspeichern lassen. Bei GraphQL läuft alles über einen Endpunkt, das HTTP-Caching greift kaum, dafür halten die Client-Bibliotheken die Daten normalisiert im Speicher.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
GraphQL und was oft damit gleichgesetzt wird
REST verteilt Daten auf mehrere Ressourcen-URLs, deren Antwortform der Server festlegt. Bei GraphQL gibt es einen Endpunkt und der Client bestimmt den Ausschnitt. Dafür verlierst du das einfache HTTP-Caching und die Statuscodes als Fehlersprache, GraphQL antwortet meist mit 200 und einem errors-Feld.
gRPC ist ebenfalls typisiert, richtet sich aber an die Kommunikation zwischen Diensten und ruft Prozeduren auf, statt Datengraphen abzufragen. GraphQL sitzt typischerweise vorne am Client, gRPC hinten zwischen Servern.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Die Last wandert vom Client auf den Server
Jedes Feld im Schema hat einen Resolver, und der weiß nichts davon, dass er innerhalb derselben Abfrage gerade zum fünfzigsten Mal läuft. Eine Liste mit fünfzig Beiträgen und dem jeweiligen Autor erzeugt so eine Abfrage für die Liste und fünfzig weitere für die Autoren. Abhilfe schafft eine Sammelschicht, die diese Einzelzugriffe innerhalb eines Durchlaufs bündelt.
Was bei REST der Cache auf dem Weg erledigt hat, baust du bei GraphQL selbst, denn alle Anfragen gehen als POST an dieselbe Adresse. Dazu kommt, dass eine offene Schnittstelle beliebig tief verschachtelte Abfragen zulässt. Ohne Grenze für Tiefe und Kosten reicht eine einzige Anfrage, um die Datenbank für alle anderen unbrauchbar zu machen.
Die Rechteprüfung sitzt nicht mehr am Endpunkt, sondern gehört an jedes Feld. Wer nur auf der obersten Ebene prüft, gibt über eine Beziehung im Graphen Daten heraus, die der Aufrufer auf dem direkten Weg nie bekommen hätte.
GraphQL lernen
Wie Abfragen, Cache und Komponentenstruktur zusammenspielen, üben die Trainings zum React-Ökosystem an einer laufenden Anwendung.
Wer erst die Gegenseite verstehen will, findet den Vergleich mit klassischen HTTP-Schnittstellen in den Kursen zu Schnittstellen im Web .
Kurse, die GraphQL behandeln
Häufige Fragen
Ersetzt GraphQL meine bestehende REST-API?
Brauche ich für GraphQL eine bestimmte Frontend-Bibliothek?
Wie melde ich Fehler, wenn immer 200 zurückkommt?
Deine Ansprechpartner
Du willst das Thema nicht nur nachschlagen, sondern anwenden können? Wir beraten dich persönlich und kostenlos.
Yves Hoppe
Weiterbildung & Beratung
Ordnet mit dir ein, welcher Kurs zu deinem Vorwissen passt.
Norbert Jansen
Beratung & Inhouse
Plant Inhouse-Trainings, die an euren eigenen Daten und Abläufen ansetzen.
GraphQL im Kurs statt im Lexikon
Nachschlagen bringt dich bis zum Verstehen. Anwenden lernst du an echten Aufgaben.