Software

Was ist GraphQL? Unterschied zu REST API und wann es sich lohnt

Talha Aslan 18 Minuten Lesezeit 2 Aufrufe

Was ist GraphQL?

GraphQL ist eine Abfragesprache für APIs, bei der der Client genau beschreibt, welche Daten er braucht, und der Server eine Antwort in genau dieser Form liefert. Konkret läuft sie meist über einen einzigen Endpunkt und stützt sich auf ein Schema. Dadurch können eine mobile App, eine Weboberfläche und ein Admin Bereich unterschiedliche Datenausschnitte aus derselben API holen.

Kurz gesagt, GraphQL ist weder eine Datenbank noch ein fertiges Produkt. Es ist stattdessen eine Abfragesprache samt Regeln, wie ein Server sie ausführt. Also gilt: Egal in welcher Programmiersprache Sie den Server schreiben, die Konzepte bleiben gleich. Als Quellen nutzen wir die offiziellen GraphQL Lernseiten und die GraphQL Spezifikation.

Zunächst klären wir Definition und Bild, danach die Funktionsweise. Danach folgen der Vergleich mit REST, die Risiken und eine Checkliste. Wenn Sie sich fragen, was ist GraphQL und ob es zu Ihrem Projekt passt, finden Sie hier beides.

Wie erklärt man GraphQL mit einem einfachen Vergleich?

Stellen Sie sich ein Restaurant vor. Zum Beispiel bringt bei REST der Kellner ein festes Menü. Suppe, Hauptgang und Dessert kommen zusammen, auch wenn Sie nur die Suppe wollten. Manchmal müssen Sie den Kellner außerdem ein zweites Mal in die Küche schicken.

Stattdessen funktioniert GraphQL eher wie ein Bestellzettel. Dann kreuzen Sie genau an, was Sie möchten, und die Küche bereitet nur das zu. Anders gesagt, der Client schreibt das Rezept, und der Server kocht danach. Die Idee wirkt einfach, gibt dem API Design aber viel Spielraum.

Der Vergleich hat allerdings eine Grenze. Denn die Küche kann Ihren Zettel nur lesen, wenn die Speisekarte vorher feststeht. In GraphQL heißt diese Karte Schema. Ohne Schema gibt es keinen Zettel, deshalb steht das Schema bei der Frage „was ist GraphQL“ immer im Mittelpunkt.

Warum ist GraphQL überhaupt entstanden?

Ingenieure eines großen sozialen Netzwerks haben GraphQL entwickelt, als mobile Apps schnell wuchsen. Danach wurde es Open Source. Außerdem liegt die Spezifikation heute bei einer eigenen Stiftung. Datum und Versionsnummern nennen wir hier nicht; prüfen Sie den aktuellen Stand bitte auf der offiziellen Seite.

Der Grund war allerdings ganz praktisch. Erstens waren mobile Bildschirme klein, und die Verbindungen waren oft instabil. Zweitens brauchte jeder Bildschirm eine andere Mischung aus Daten. Deshalb kamen feste Endpunkte kaum hinterher. Ein Profilbildschirm brauchte zum Beispiel drei getrennte Anfragen, oder er lud eine viel zu große Antwort.

Die historische Antwort auf „was ist GraphQL“ ist daher genau dieser Schmerzpunkt. Statt dem Server zu sagen „liefere diese Ressource“, konnte der Client sagen „ich brauche Daten in dieser Form“. Dadurch konnten Frontend Teams arbeiten, ohne auf das Backend zu warten.

Wie funktioniert GraphQL?

Der Client schickt einen Abfragetext, meist über HTTP, an eine einzige Adresse. Zunächst prüft der Server diesen Text gegen das Schema. Danach führt er die Resolver Funktionen der einzelnen Felder aus und liefert das Ergebnis als JSON zurück, das der Form der Abfrage entspricht.

Außerdem ist die Struktur der Antwort in der Spezifikation klar geregelt. Erfolgreiche Daten stehen unter dem Schlüssel data. Treten Probleme auf, erklärt dann der Schlüssel errors, was passiert ist. Beide können in derselben Antwort vorkommen, also ist ein teilweise erfolgreiches Ergebnis möglich. Teams, die REST gewohnt sind, überrascht das anfangs, denn ein Fehler zeigt sich nicht immer im HTTP Statuscode.

Der Ablauf in vier Schritten:

  • Der Client schreibt die Abfrage und schickt sie ab.
  • Der Server prüft die Abfrage gegen das Schema.
  • Die Resolver sammeln den Wert jedes Feldes.
  • Der Server liefert eine Antwort in der Form der Abfrage.

In der Praxis ist ein Detail wichtig. Die Antwort spiegelt immer die Abfrage. Der Client erhält genau das, was er gefragt hat, in derselben Reihenfolge und derselben verschachtelten Struktur. Daher erleichtert diese Vorhersehbarkeit den Frontend Code.

Zudem verdient die Prüfung Beachtung. Fragt ein Client nach einem Feld, das es nicht gibt, lehnt der Server die Anfrage ab, bevor er Arbeit leistet. Tippfehler und falsche Typen fallen folglich früh auf, und manche Prüfung, die Sie bei REST von Hand schreiben, übernimmt das Schema.

Was sind Schema und Typsystem?

Das Schema ist der Vertrag Ihrer API. Konkret beschreibt es, welche Typen, Felder und Beziehungen existieren. Sie schreiben es in der Schemasprache von GraphQL, und es liest sich wie eine Dokumentation. Deshalb schaut das ganze Team auf denselben Vertrag.

Zunächst besteht das Typsystem aus vier Grundbausteinen. Skalare Typen tragen einzelne Werte, zum Beispiel Text, Ganzzahlen oder Wahrheitswerte. Zweitens bündeln Objekttypen Felder. Dann listen Enum Typen eine begrenzte Menge von Optionen auf. Schließlich bringen Eingabetypen Daten in Mutationen hinein.

Außerdem markieren Sie im Schema, ob ein Feld leer sein darf oder Pflicht ist. Das wirkt unscheinbar, macht den Client Code aber sicherer, denn der Client weiß vorher, welche Felder leer zurückkommen können.

Außerdem erwähnen wir zwei weitere Typen kurz. Interfaces bündeln gemeinsame Felder mehrerer Objekte an einer Stelle. Unions erlauben also, dass ein Feld Objekte verschiedener Art liefert. Ein Suchergebnis kann zum Beispiel ein Artikel oder ein Produkt sein, und der Client fragt je nach Typ andere Felder ab. Am ersten Tag brauchen Sie das nicht, aber es hilft, wenn das Schema wächst.

Weil das Schema maschinenlesbar ist, bieten Werkzeuge Autovervollständigung, Validierung und erzeugte Dokumentation. Zudem kann ein Server sein eigenes Schema auf Anfrage beschreiben; diese Fähigkeit heißt Introspection.

Was sind Query, Mutation und Subscription?

GraphQL kennt konkret drei Operationstypen. Erstens liest eine Query Daten. Zweitens verändert eine Mutation Daten, legt also zum Beispiel einen Datensatz an oder aktualisiert ihn. Schließlich schickt eine Subscription Daten an den Client, sobald ein Ereignis eintritt. Das ähnelt den Lese und Schreibmethoden von REST, ist aber nicht identisch.

  • Query: zum Lesen; Sie wählen die gewünschten Felder und Beziehungen.
  • Mutation: zum Schreiben; Sie sagen auch, welche Felder Sie danach zurückbekommen möchten.
  • Subscription: für Live Updates; sie braucht meist eine dauerhafte Verbindung.

Eine schöne Eigenschaft der Mutationen: Sie können frische Daten in derselben Anfrage zurückverlangen. Sie legen zum Beispiel eine Bestellung an und erhalten den neuen Status gleich in der Antwort. Somit sparen Sie eine zusätzliche Leseanfrage.

Subscriptions laufen meist über einen dauerhaften Kanal wie WebSocket. Dieses Thema haben wir in einem eigenen Beitrag behandelt, deshalb wiederholen wir es hier nicht.

Was ist ein Resolver und wozu dient er?

Ein Resolver ist eine kleine Funktion, die dem Server sagt, wie er den Wert eines einzelnen Feldes findet. Ein Feld kann zum Beispiel aus einer Datenbank, aus einem anderen Dienst oder aus einem Cache stammen. Das Schema beantwortet „was gibt es“, der Resolver beantwortet „woher kommt es“.

Deshalb ist diese Trennung für Teams stark. Sie können eine GraphQL Schicht auf ein altes System setzen, ohne es zu zerstören, denn Resolver dürfen bestehende Dienste aufrufen. Frontend Entwickler sehen ein Schema, während dahinter mehrere Datenquellen weiterlaufen.

Allerdings sollten Sie Resolver klein und fokussiert halten. Denn packen Sie Geschäftsregeln hinein, schreiben Sie dieselbe Regel später an anderer Stelle noch einmal. Zum Beispiel erklärt unser Beitrag zum Backend diese Schichtung ausführlicher.

Resolver laufen außerdem verschachtelt. Der Resolver eines übergeordneten Feldes liefert ein Ergebnis, und der Resolver eines untergeordneten Feldes nimmt dieses Ergebnis als Eingabe. Somit sammeln Sie verwandte Daten Stück für Stück. Diese Kette zeigt zugleich, wo Leistungsprobleme entstehen, wie der Abschnitt zu N+1 gleich erklärt.

Was ist GraphQL im Vergleich zu REST?

REST ist ein Architekturstil, der Ressourcen Adressen gibt und mit HTTP Methoden arbeitet. GraphQL dagegen ist eine Abfragesprache. Beide lösen dasselbe Problem, nämlich den Datentransport zwischen Client und Server, aber auf verschiedenen Wegen. Daher ersetzt das eine das andere nicht automatisch.

Bei REST denken Sie in einer Adresse pro Ressource. Zum Beispiel haben Kunden, Bestellungen und Produkte eigene Endpunkte. Bei GraphQL gibt es einen einzigen Einstiegspunkt, und Sie laufen innerhalb der Abfrage durch die Beziehungen. Deshalb ist „Alternative zu REST“ nur halb richtig.

Genauer gesagt verlangt GraphQL, dass Sie in einem Graphen von Daten denken statt in einer Liste von Adressen. Ein Kunde, seine Bestellungen und die bestellten Produkte bilden verbundene Knoten, und eine Abfrage wandert an diesen Verbindungen entlang.

Die offizielle Dokumentation betont denselben Denkwechsel: Modellieren Sie Ihre API als Graph Ihrer Fachdomäne, nicht als Liste von Endpunkten.

Was sind Overfetching und Underfetching?

Erstens bedeutet Overfetching, dass die Antwort mehr Felder enthält, als Sie brauchen. Zweitens bedeutet Underfetching, dass eine Anfrage nicht genug liefert und Sie weitere Anfragen senden müssen. Beides kostet Zeit und Datenvolumen, vor allem in mobilen Netzen.

Nehmen wir als Beispielszenario eine Produktliste. Konkret braucht der Bildschirm nur Produktname und Bild. Ein fester Endpunkt liefert dagegen vielleicht Dutzende Felder wie Bestand, Beschreibung und Bewertungen. Liegen die Verkäuferdaten umgekehrt an einem anderen Endpunkt, brauchen Sie eine zweite Anfrage.

Somit löst GraphQL beide Probleme auf Ebene der Abfrage. Der Client listet die genauen Felder auf und holt verwandte Daten in derselben Anfrage. Trotzdem wird nicht automatisch alles schnell, deshalb müssen Sie Abfragen sorgfältig bauen.

Allerdings kann auch REST diese Probleme mindern. Sie können Parameter zur Feldauswahl ergänzen oder eigene Endpunkte pro Bildschirm bauen. Dann entsteht aber bei jedem neuen Bildschirm Arbeit im Backend, während GraphQL diese Last zum Client verschiebt.

Wie unterscheiden sich GraphQL und REST in einer Tabelle?

Zunächst stellt die folgende Tabelle beide Ansätze zu den wichtigsten Themen nebeneinander. Die Einträge zeigen allgemeine Tendenzen, denn beide Stile lassen unterschiedliche Umsetzungen zu. Außerdem dient die Spalte zu gRPC nur als Kontext, und wir erklären sie in einem späteren Abschnitt kurz.

ThemaRESTGraphQLgRPC
EndpunkteEine Adresse pro RessourceMeist eine einzige AdresseDienst und Methodendefinitionen
DatenformDer Server bestimmtDer Client bestimmt in der AbfrageDefinierte Nachrichtenstruktur
Over und UnderfetchingHäufigDurch die Abfrage geringerDurch den Vertrag begrenzt
CachingHTTP Cache passt von Natur ausBraucht Client Cache und Objekt IDsMeist auf Anwendungsebene
VersionierungVersion in der Adresse üblichSchema ohne Versionen weiterentwickelnKompatible Nachrichtenfelder
FehlerbehandlungHTTP StatuscodesFeld errors in der AntwortEigene Statuscodes
AutorisierungOft pro EndpunktPro Feld denkenPro Methode
Typischer EinsatzÖffentliche APIs, einfache RessourcenViele Clients, relationale DatenSchnelle Aufrufe zwischen Diensten

Keine Zeile dieser Tabelle ist ein Urteil. Die richtige Wahl hängt daher von Produkt, Team und Datenverkehr ab. Nutzen Sie die Tabelle daher als Gesprächsstart und nicht als Entscheidungshilfe.

Welche Vorteile hat GraphQL?

Wenn wir „was ist GraphQL“ über den Nutzen beantworten, liegt der größte Gewinn in der Flexibilität des Clients. Entwirft ein Frontend Team einen neuen Bildschirm, muss es oft nicht auf einen neuen Endpunkt warten. Existiert das Feld im Schema, ändert das Team die Abfrage und macht weiter. Das spart Zeit, vor allem bei Produkten mit mehreren Clients.

  • Sie holen verwandte Daten in einer einzigen Anfrage.
  • Sie verkleinern die Antwort auf das, was der Bildschirm braucht.
  • Das starke Typsystem hilft Ihnen, Fehler früh zu finden.
  • Das Schema dient als lebendige Dokumentation.
  • Frontend und Backend Teams arbeiten über den Vertrag unabhängig voneinander.

Außerdem können Sie alte Felder im Schema als veraltet markieren. So stellen Sie Clients schrittweise um, statt sie plötzlich zu brechen. Auf Seite der Frontend Entwicklung zahlt sich das durch schnellere Oberflächen Experimente aus.

Zudem ist die Werkzeugunterstützung ein weiterer Vorteil. Da das Schema maschinenlesbar ist, speisen sich Editoren, Testwerkzeuge und Dokumentationsgeneratoren daraus. So erkundet eine neue Entwicklerin die API einfach über das Schema.

Wie funktioniert Caching bei GraphQL?

Caching ist bei REST einfach, denn jede Ressource hat eine Adresse, die Browser und Zwischenserver erkennen. Bei GraphQL gibt es meist eine Adresse und einen wechselnden Abfragetext. Daher ist es schwerer, sich direkt auf den HTTP Cache zu stützen.

Die Lösung besteht allerdings aus Schichten. Im Client nutzen Sie einen Cache, der Objekte anhand ihrer Kennungen speichert, damit Sie dasselbe Objekt nicht immer wieder laden. Auf dem Server können Sie Datensätze und Ergebnisse teurer Abfragen in einem Speicher Cache halten; mehr dazu in unserem Caching Leitfaden.

Außerdem behandelt auch die offizielle Dokumentation das Thema. Lesende Abfragen unter passenden Bedingungen per GET zu senden und gespeicherte Abfragen zu nutzen, erleichtert die Nutzung eines CDN Caches. Details finden Sie auf der GraphQL Seite zur Performance; die Grundlagen des HTTP Cachings erklärt der MDN Leitfaden zum Caching.

Kurz gesagt, es stimmt nicht, dass GraphQL kein Caching kennt. Sie müssen also Ihre Caching Strategie nur von Anfang an planen.

Wie funktionieren Versionierung und Fehlerbehandlung bei GraphQL?

Bei REST ist es üblich, eine Versionsnummer in die Adresse zu schreiben. Die GraphQL Community empfiehlt stattdessen, das Schema ohne Versionen weiterzuentwickeln. Sie fügen neue Felder hinzu, markieren alte als veraltet und entfernen sie mit der Zeit. Clients fragen nur die Felder ab, die sie wollen, also brechen neue Felder alte Clients nicht.

Zudem funktioniert die Fehlerbehandlung anders. Auch bei einem Fehler kommt die Antwort oft mit erfolgreichem HTTP Status zurück, und die eigentliche Information steht im Feld errors. Deshalb sollten Sie Ihr Monitoring nicht allein auf Statuscodes stützen. Lesen Sie die Fehlerzahl zusätzlich aus dem Antworttext.

Außerdem gibt es Teilergebnisse. Zum Beispiel kann ein Feld scheitern, während die anderen gelingen. Ist Ihr Client Code nicht darauf vorbereitet, sehen Nutzer dann vielleicht einen halben Bildschirm. Besprechen Sie Fehlerszenarien daher beim Entwurf und nicht erst nach dem Start.

Zudem ist das Entfernen eines Feldes eine Entscheidung. Markieren Sie es zuerst als veraltet, prüfen Sie über die Nutzungsüberwachung, dass niemand es mehr abfragt, und entfernen Sie es erst dann.

Was ist das N+1 Problem?

Beim N+1 Problem laden Sie eine Liste mit einer Abfrage und führen danach für jede Zeile eine weitere Abfrage aus. Die Liste lädt einmal, die verwandten Daten laden so oft, wie die Liste lang ist. Die Folge sind also Hunderte kleiner Abfragen, die Ihre Datenbank unnötig belasten.

Bei GraphQL entsteht dieses Problem allerdings leicht. Jedes Feld hat einen eigenen Resolver, und die Resolver arbeiten, ohne voneinander zu wissen. Holen Sie in einer Buchliste den Autor jedes Buches mit einer eigenen Abfrage, entsteht N+1.

Die Lösung heißt daher Bündeln und Gruppieren. Sie sammeln ähnliche Aufrufe innerhalb derselben Anfrage und fragen die Datenbank nur einmal. Die offizielle Seite zur Performance behandelt dieses Problem offen.

Zudem gehört das Problem nicht allein zu GraphQL; die Schemastruktur kann es nur verstecken. Die Zahl der Datenbankabfragen pro Anfrage zu überwachen, ist daher eine Grundgewohnheit jedes reifen Setups.

Wie können komplexe Abfragen den Server überlasten?

GraphQL gibt dem Client Macht, doch bei falscher Nutzung ermüdet diese Macht den Server. Da Beziehungen sich verschachteln lassen, kann eine unvorsichtige oder böswillige Abfrage einen sehr tiefen und sehr breiten Datenbaum verlangen. Somit kann schon eine einzige Anfrage teuer sein.

Gegen dieses Risiko bauen Sie mehrere Schutzschichten auf:

  • Setzen Sie eine Obergrenze für die Tiefe der Abfrage.
  • Geben Sie jedem Feld Kostenpunkte und begrenzen Sie die Gesamtkosten.
  • Verlangen Sie Seitenaufteilung bei Listenfeldern.
  • Erwägen Sie ein Modell, das nur freigegebene Abfragen annimmt.
  • Setzen Sie Zeitlimits und Ratenbegrenzung ein.

Zudem vertieft der Sicherheitsteil der offiziellen Dokumentation diese Punkte. Vor allem bei einer öffentlichen API müssen Sie die Flexibilität der Abfragen bewusst einschränken. Die Grenzwerte legen Sie selbst nach der Last Ihres Produkts fest; es gibt keine allgemeingültige Zahl.

Diese Maßnahmen sind allerdings keine einmalige Einstellung. Beobachten Sie den echten Datenverkehr und prüfen Sie die Grenzen immer wieder neu.

Wie denken Sie bei GraphQL über Autorisierung pro Feld nach?

Bei REST prüfen Sie Rechte meist auf Ebene des Endpunkts. Bei GraphQL berührt dieselbe Abfrage viele Felder, und manche Felder sind öffentlich, andere privat. Deshalb müssen Sie Autorisierung auf Feldebene denken.

Die offizielle Seite zur Autorisierung nennt ein wichtiges Prinzip: Halten Sie die Berechtigungslogik an einer Stelle in der Geschäftslogik, statt sie in der GraphQL Schicht zu vergraben. Sonst greift dieselbe Regel an verschiedenen Einstiegspunkten unterschiedlich, und Nutzer sehen je nach API andere Daten.

Die Authentifizierung ist allerdings ein eigener Schritt. Zuerst stellen Sie fest, wer der Nutzer ist, dann entscheiden Sie, was diese Person sehen darf. Die tokenbasierte Anmeldung haben wir in unserem JWT Beitrag erklärt. Vermischen Sie daher beide Themen nicht.

In der Praxis gehen Sie so vor. Zunächst prüft eine Zwischenschicht die Zugangsdaten, sobald eine Anfrage eintrifft. Danach legen Sie die gewonnenen Nutzerinformationen in den Kontext der Anfrage. Die Resolver lesen diesen Kontext und fragen die Geschäftsschicht, ob diese Person das Feld sehen darf. Lautet die Antwort nein, liefern Sie dann einen leeren Wert oder einen klaren Fehler. Die Entscheidung an einer Stelle zu treffen, ist der sicherste Weg zur Konsistenz.

Was ist GraphQL und wofür taugt es in echten Szenarien?

Bauen wir ein konkretes Beispielszenario: ein Handelsprodukt. Eine mobile App, eine Website und ein Tablet im Laden nutzen dieselben Daten. Außerdem möchte jeder Client andere Felder. Die App braucht nur Name und Preis, die Website will Details und Bewertungen, das Tablet braucht Bestand und Regalplatz.

Solche Setups mit mehreren Clients sind das Zuhause von GraphQL. Ein Schema bedeutet drei verschiedene Abfrageformen, und die Teams arbeiten, ohne aufeinander zu warten. Auch Architekturen, die mehrere Backend Dienste hinter einer Oberfläche bündeln wollen, mögen diesen Ansatz.

Deshalb sehen wir es oft bei Teams mit Microservices Architektur. Eine einzige Eingangstür vor vielen Diensten ist ein starkes Argument für GraphQL.

Ein zweites Beispiel ist eine Redaktionsseite. Startseite, Kategorieseite und mobile App zeigen dieselben Artikeldaten mit unterschiedlichen Feldern. Also versorgt ein Schema alle drei Bildschirme. Fügen Sie einen neuen Bildschirm hinzu, schreiben Sie nur eine neue Abfrage und lassen das Backend unberührt.

Andererseits rechtfertigt eine einfache Unternehmensseite den Aufwand womöglich nicht. Wie jede Technik lohnt sich GraphQL nur, wenn es einen Bedarf gibt.

Wann ist GraphQL überflüssig und REST völlig ausreichend?

GraphQL ist nicht für jedes Projekt die richtige Wahl. Ist die Ressourcenstruktur einfach, die Zahl der Clients klein und sind die Antworten ohnehin schmal, reicht REST oft aus. Das heißt weniger Konzepte, weniger Werkzeuge und eine flachere Lernkurve.

REST glänzt in diesen Situationen:

  • Einfache Ressourcenoperationen wie Download und Upload von Dateien.
  • Öffentliche Daten, bei denen Sie den HTTP Cache direkt nutzen möchten.
  • Eine einfache API, die Dritte leicht verwenden sollen.
  • Kleine Teams mit nur einem Client.
  • Endpunkte, die klare Zusicherungen gegen doppeltes Absenden brauchen.

Vor allem der letzte Punkt ist wichtig. Trifft dieselbe Anfrage zweimal ein, darf sich das Ergebnis nicht ändern; das haben wir in unserem Beitrag zur Idempotenz behandelt. Bei Mutationen in GraphQL brauchen Sie daher dieselbe Sorgfalt.

Zusammengefasst: Entscheiden Sie nicht nach Mode. Schreiben Sie Ihr echtes Problem auf, messen Sie es und wählen Sie erst dann das Werkzeug. Lässt sich Overfetching bei Ihnen nicht messen, lässt sich auch der Gewinn durch GraphQL nicht messen. Zudem kostet Teamwissen etwas, denn eine neue Abfragesprache und ein neues Fehlermodell bedeuten Einarbeitungszeit.

Wie unterscheiden sich GraphQL, REST und gRPC?

gRPC ist ein Rahmenwerk für Fernaufrufe, gebaut für schnelle und streng typisierte Kommunikation zwischen Diensten. Meist dient es also Aufrufen zwischen Servern. Sein Datenformat ist binär, deshalb ist die direkte Nutzung im Browser schwieriger. Das Konzept können Sie auf der offiziellen gRPC Einführung nachlesen.

Kurz getrennt: REST ist ressourcenorientiert, GraphQL ist an Client Abfragen orientiert, und gRPC ist an Methodenaufrufen orientiert. Es sind also weniger Rivalen als verschiedene Werkzeuge. Ein System kann zum Beispiel GraphQL für externe Clients anbieten und zwischen internen Diensten gRPC einsetzen.

Stellen Sie bei der Wahl diese Frage: Wer nutzt die Daten, mit welchem Bedarf und wie oft? Die Antwort ist meist ein verlässlicherer Wegweiser als jeder Technikhype.

Welche Checkliste sollten Sie vor dem Einstieg in GraphQL durchgehen?

Gehen Sie vor der Entscheidung die folgenden Punkte mit Ihrem Team durch. Jeder Punkt lässt sich also mit Ja oder Nein beantworten. Wächst die Zahl der Neins, ist REST womöglich die gesündere Wahl.

  1. Haben Sie mehr als einen Client, und schauen diese auf die Daten unterschiedlich?
  2. Ist Overfetching oder Underfetching ein messbares Problem?
  3. Gibt es ein Team, das das Schema verantwortet?
  4. Können Sie Grenzen für Tiefe und Kosten durchsetzen?
  5. Liegt die Berechtigungslogik an einer Stelle in der Geschäftsschicht?
  6. Gibt es ein Monitoring, das N+1 Probleme erkennt?
  7. Können Sie die Fehlerrate aus dem Antworttext lesen?
  8. Ist Ihre Caching Strategie für Client und Server festgelegt?

Auf dem Papier wirken diese Fragen allerdings simpel. Sind die Antworten im Team unklar, klären Sie sie dann zuerst. Für eine Außensicht kann unsere individuelle Softwareentwicklung auch eine Architekturprüfung umfassen.

Anfänger: Was ist GraphQL und wie lernen Sie es Schritt für Schritt?

Wir empfehlen, mit den offiziellen Lernseiten zu beginnen. Verstehen Sie zuerst Schema und Typen, schreiben Sie dann Queries und gehen Sie danach zu Mutationen über. Lassen Sie Resolver für den Schluss, denn wer zuerst die Clientseite sieht, begreift die Logik leichter.

Wählen Sie ein kleines Projekt. Bauen Sie zum Beispiel ein System aus drei verbundenen Typen wie Buch, Autor und Kategorie. Erzeugen Sie dann absichtlich ein N+1 Problem und lösen Sie es; diese Übung festigt das ganze Konzept. Prüfen Sie vor dem Start auch die sichere Verbindung Ihres Servers, dabei hilft unser SSL Check.

Bleiben Sie auch beim Tempo realistisch. Die Grundlagen verstehen Sie in wenigen Tagen, doch ein Schema in Produktionsqualität zu entwerfen, braucht Erfahrung. Hetzen Sie diesen Teil nicht.

Welche Fehler passieren am häufigsten?

Teams tappen oft in ähnliche Fallen. Wer sie vorher kennt, spart sich unnötige Neuentwicklungen. Die folgende Liste sammelt die typischen Punkte aus unserer Praxis.

  • Das Schema als Eins zu eins Kopie der Datenbanktabellen aufbauen.
  • Berechtigungsprüfungen auf jeden Resolver verteilen.
  • Ohne Grenzen für Tiefe und Kosten öffentlich gehen.
  • Fehler nur über HTTP Statuscodes beobachten.
  • GraphQL als Standardlösung für jedes Projekt ansehen.
  • Das Schema ändern, ohne die Client Teams zu informieren.

Die meisten dieser Punkte betreffen eher den Prozess als die Technik. Sind Schema Verantwortung und Änderungsmanagement unklar, stiftet selbst das beste Werkzeug Verwirrung. Die technische Antwort auf „was ist GraphQL“ zählt, und die Prozessantwort zählt genauso.

Was ist GraphQL im Kurzüberblick?

GraphQL ist eine schemabasierte API Abfragesprache, in der der Client die Daten per Abfrage beschreibt. Sie bringt Flexibilität in Strukturen mit mehreren Clients und relationalen Daten. Im Gegenzug bringt sie Pflichten mit, etwa bei Caching, N+1 Problemen, Abfragekosten und Autorisierung auf Feldebene.

Der richtige Ansatz ist kein Wettstreit „GraphQL gegen REST“. Sie betrachten Bedarf, Team und Datenverkehr und entscheiden danach. Wo es passt, nutzen Sie beides. Als Talha Aslan und Team klären wir bei Softwareprojekten zuerst den Bedarf und wählen erst dann das Werkzeug.

Dieser Leitfaden dient der allgemeinen Information. Für Versions und Bibliotheksdetails prüfen Sie bitte immer die offizielle Dokumentation.

Häufig gestellte Fragen

Was ist GraphQL und wofür wird es genutzt?
GraphQL ist eine API Abfragesprache, bei der der Client die benötigten Daten beschreibt und der Server genau in dieser Form antwortet. Am meisten hilft es bei Apps mit mehreren Clients, relationalen Daten und Bildschirmen mit unterschiedlichem Datenbedarf. Sie laden weniger unnötige Daten und senden weniger Zusatzanfragen. Allerdings braucht nicht jedes Projekt GraphQL.
Ersetzt GraphQL REST?
Nein, beide dienen unterschiedlichen Bedürfnissen. REST ist stark bei einfachen Ressourcen und wenn Sie den HTTP Cache direkt nutzen möchten. GraphQL überzeugt bei flexiblen, relationalen Szenarien mit mehreren Clients. Viele Teams setzen beides im selben Produkt ein. Sie wählen nach Datenverkehr, Team und Bedarf.
Ist ein einziger Endpunkt bei GraphQL ein Problem?
Ein einziger Endpunkt verändert einige Gewohnheiten bei Caching und Monitoring, ist aber an sich kein Problem. Sie können sich nicht direkt auf den HTTP Cache stützen. Stattdessen bauen Sie einen Client Cache auf Basis von Objektkennungen, freigegebene Abfragen und einen Server Cache. Beim Monitoring schauen Sie zusätzlich auf den Operationsnamen, nicht nur auf die Adresse.
Ist das N+1 Problem nur ein GraphQL Problem?
Nein, N+1 ist ein allgemeines Problem beim Datenbankzugriff. In GraphQL entsteht es jedoch leicht, weil jedes Feld einen eigenen Resolver hat, und es fällt schnell durchs Raster. Sie lösen es mit Verfahren, die ähnliche Aufrufe in einer Abfrage bündeln. Außerdem sollten Sie die Zahl der Abfragen pro Anfrage überwachen, um es früh zu erkennen.
Ist GraphQL sicher?
GraphQL ist von sich aus weder sicher noch unsicher; die Sicherheit hängt von Ihrer Umsetzung ab. Bauen Sie Authentifizierung und Autorisierung auf Feldebene in der Geschäftsschicht auf. Setzen Sie außerdem Grenzen für Tiefe, Kosten, Rate und Zeit. Ohne diese Maßnahmen lässt sich eine öffentliche API leicht überlasten. Beachten Sie die offizielle Dokumentation zur Sicherheit.
Muss man erst REST kennen, um GraphQL zu lernen?
Zwingend ist das nicht, aber Grundlagen zu REST und HTTP erleichtern das Lernen sehr. Verstehen Sie Anfrage, Antwort, Statuscode und JSON, sehen Sie klarer, was GraphQL ändert. Lesen Sie zuerst die Abschnitte zu Schema und Query auf den offiziellen Lernseiten und probieren Sie die Ideen danach in einer kleinen Anwendung aus.
  • graphql
  • rest api
  • api design
  • schema
  • n+1 problem
  • softwarearchitektur
  • webentwicklung
Teilen:
Talha Aslan

Google Partner und Experte für digitales Marketing. Seit 2012 praktisch in SEO, Google Ads, Webdesign und E-Commerce Projekten; jeder Beitrag hier stammt aus dieser Erfahrung.

Nächstes Projekt

Sprechen wir über Ihr Projekt.

Ihre Anfrage geht direkt an Talha Aslan und Team: Strategie von Talha, Umsetzung durch ein erfahrenes Team. Das Erstgespräch ist kostenlos, wir hören zu und melden uns mit einer klaren Roadmap.