GraphQL ist eine Open-Source-Abfragesprache für APIs, mit der Daten aus mehreren Quellen in einem einzigen API-Aufruf abgerufen werden können. Sie dient außerdem als serverseitige Laufzeitumgebung, um Abfragen anhand vorhandener Daten auszuführen. GraphQL stellt sicher, dass der Client nur die angeforderten Daten erhält, bietet zugleich aber eine vollständige Beschreibung der API-Daten und erleichtert die Skalierung und Weiterentwicklung von APIs.

GraphQL verstehen

GraphQL wurde mit Blick auf Flexibilität, Geschwindigkeit und die Bedürfnisse von Entwicklern konzipiert. Mit GraphQL können Entwickler APIs nach ihren Vorstellungen erstellen und anschließend mithilfe einer GraphQL-Spezifikation sicherstellen, dass die APIs für Clients funktionieren.

Eines der Grundprinzipien einer GraphQL-Abfrage besteht darin, dass die zurückgegebenen Daten vorhersehbar sind. Statt überflüssiger Codezeilen wird genau das zurückgegeben, was angefordert wurde. Dieser deklarative Datenabruf ist besonders auf Mobilgeräten nützlich, auf denen die Bandbreite begrenzt ist. Apps, die GraphQL verwenden, sind außerdem stabil und schnell, da sie – und nicht der Server – bestimmen, welche Daten angefordert und empfangen werden. Selbst bei langsamen Netzwerkverbindungen sind sie schnell, da eine einzige Anfrage mehrere angeforderte Elemente gleichzeitig zurückgeben kann.

Aufbauend auf der Datenvereinfachung durch GraphQL werden APIs nach Typen und Feldern statt nach Endpunkten organisiert. Dadurch kann über einen einzigen Endpunkt auf alle Daten zugegriffen werden, sodass Apps nur das anfordern, was sie tatsächlich benötigen. Durch die Verringerung der betrieblichen Komplexität fügt sich GraphQL in den Workflow einer optimierten API-Konnektivitätslösung.

Ein kurzer historischer Überblick

Im Jahr 2012 benötigte Meta (damals Facebook) eine API zum Abrufen von Daten, die leistungsfähig genug für seine mobilen Facebook-Anwendungen war. Unter der Leitung von Lee Byron entwickelte Facebook GraphQL, um den Datenabruf zu vereinfachen – insbesondere aus der Perspektive von Produktdesignern und Entwicklern. GraphQL wurde zunächst intern bei Facebook eingesetzt, bevor es 2015 öffentlich zugänglich gemacht und als Open Source veröffentlicht wurde. Wie viele andere Open-Source-Projekte wechselte auch das GraphQL-Projekt 2019 zu einer eigenen Stiftung, der GraphQL Foundation, die von der Linux Foundation getragen wird.

GraphQL wurde als Alternative zur REST-Architektur entwickelt. Standardmäßige REST-APIs erfordern das Laden von Informationen von mehreren URLs über separate HTTP-GET-Anfragen. Bei GraphQL-APIs werden alle Daten über eine einzige POST-Anfrage abgerufen. Sowohl REST als auch GraphQL geben Antworten im JSON-Format zurück, doch GraphQL zielt darauf ab, den Datenabruf zu optimieren und zu bündeln.

Wie funktioniert GraphQL?

GraphQL unterstützt präzise Datenabfragen und gibt Clients mehr Kontrolle darüber, welche Informationen übermittelt werden. Der Client sendet eine GraphQL-Abfrage in Form einer POST-Anfrage, auf die der Server mit einer JSON-formatierten Antwort reagiert. GraphQL erfordert keine bestimmte Anwendungsarchitektur, kann in verschiedenen Umgebungen bereitgestellt werden (einschließlich einer integrierten Entwicklungsumgebung [IDE]) und lässt sich mit vorhandenen API-Management-Tools oder auf bestehenden REST-APIs verwenden.

Zu den wichtigsten Begriffen in GraphQL gehören:

  • Schema – Von API-Entwicklern erstellt, um aufzuzeigen, welche Daten Clients abfragen können. Schemas bestehen aus Objekttypen, die festlegen, was ein Client anfordern kann, sowie aus Feldern, die die Eigenschaften des Objekts darstellen.
  • Abfrage – Abfragen werden anhand des Schemas validiert und anschließend ausgeführt. GraphQL kann eine Abfrage nur ausführen, wenn ein Objekttyp definiert ist.
  • Resolver – Resolver-Funktionen, die den einzelnen Schemafeldern zugeordnet sind, werden bei der API-Ausführung aufgerufen, um einen Wert zu erzeugen. Resolver sind entscheidende Architekturkomponenten von GraphQL.

Eine Besonderheit von GraphQL besteht darin, dass die Antworten die Struktur der Abfrage widerspiegeln (die wiederum durch das Schema definiert ist). Dies vereinfacht das Parsen auf Clientseite, da das Format der Serverantwort vollständig vorhersehbar ist.

Design

Die hierarchische Struktur von GraphQL bildet die Beziehungen zwischen Objekten ab und eignet sich gut für hierarchische Benutzeroberflächen. GraphQL ist außerdem stark typisiert, das heißt, jede Abfrageebene entspricht einem Typ. Diese Typen definieren wiederum eine Reihe von Feldern. Dies ähnelt SQL, wo aussagekräftige Fehlermeldungen angezeigt werden, bevor eine Abfrage ausgeführt wird.

Resolver mit Datenquellen verbinden

Resolver sind die zentralen Architekturmodule, die GraphQL-Felder, Kanten, Mutationen, Abfragen und Abonnements mit Datenquellen (und Microservices) verbinden.

In diesem GraphQL-Tutorial erfahren Sie, wie Sie Resolver für AWS-Datenquellen erstellen.

Festlegen, welche Daten abgerufen werden sollen

Eine Besonderheit von GraphQL-Abfragen sind spiegelbildliche Antworten. Die von einer Abfrage zurückgegebenen Daten sind vorhersehbar, da ihre Struktur der API-Anfrage entspricht. Wenn sich die Struktur der zurückgegebenen Daten nach der Client-Abfrage richtet, werden Server vereinfacht.

Vorteile von GraphQL

Ein wesentlicher Vorteil von GraphQL besteht darin, dass Erweiterungen verfügbar sind, die Funktionen bereitstellen, die in REST nicht verfügbar sind. Weitere Vorteile von GraphQL sind unter anderem die folgenden.

Legt eine zentrale Datenquelle fest

Ein GraphQL-Schema schafft eine zentrale, verlässliche Datenquelle für GraphQL-Anwendungen, in der sämtliche Daten beschrieben werden. Obwohl das GraphQL-Schema in der Regel auf dem Server definiert wird, können Clients auf Grundlage des Schemas weiterhin Daten abfragen und schreiben.

Kein Overfetching

In REST-Architekturen kann Overfetching schnell zum Problem werden: Die Anwendung (Backend) legt fest, welche Daten für die einzelnen Ressourcen verfügbar sind, und gibt in ihrer Antwort sämtliche Daten zurück, selbst wenn der Client (Frontend) nur ein einziges Element benötigt. GraphQL-Aufrufe erfolgen in einem einzigen Durchgang und liefern Clients genau die angeforderten Daten – ganz ohne Overfetching.

Verbesserte Kommunikation zwischen Client und Server

Da die Datentypen eindeutig definiert sind, ist die Kommunikation zwischen Client und Server bei GraphQL klarer als bei REST. Diese zugrunde liegende Struktur bedeutet außerdem, dass keine komplexen Clients erforderlich sind, um einen GraphQL-Server aufzurufen. Weitere Informationen und praktische Codebeispiele finden Sie im Abschnitt über Clients und Server auf der offiziellen GraphQL-Seite.

Skalierbar mit Federation

Als Sammlung von Designprinzipien und Werkzeugen ermöglicht API Federation, Dienste innerhalb eines abgegrenzten Kontexts als konsistente API für Benutzer bereitzustellen und gleichzeitig zuzulassen, dass sich die Dienste in diesem Kontext uneingeschränkt weiterentwickeln. GraphQL bietet eine Methode, um die gesamte API zu föderieren und weiterzuentwickeln, ohne bestehende Abfragen zu beeinträchtigen. Dieser Ansatz ist skalierbar – und diese Skalierbarkeit ist einer der Gründe, warum GraphQL von vielen Unternehmen eingesetzt wird.

Introspektion

Die introspektive Natur von GraphQL ermöglicht es, das GraphQL-Schema über eine GraphQL-API abzurufen. Clients können außerdem eine Liste der verfügbaren Datentypen anfordern. Dies eignet sich ideal für die automatische Erstellung von Dokumentationen sowie zum Testen oder Abrufen von Schemas aus mehreren Microservices.

Nachteile von GraphQL

Obwohl es viele Gründe für den Einsatz von GraphQL gibt, sollte man sich auch einiger Nachteile bewusst sein. So funktioniert beispielsweise nicht alles ohne Weiteres – für die Nutzung der API eines anderen Anbieters sind spezielle Bibliotheken erforderlich. Insgesamt benötigt GraphQL zudem eine umfangreichere Tool-Unterstützung als REST.

GraphQL hat gegenüber REST unter anderem die folgenden Nachteile.

Lernkurve

Für Entwickler, die an REST-APIs gewöhnt sind, ist die Lernkurve bei GraphQL steiler. Zudem kann sich der Arbeitsablauf ändern: API-Teams, die GraphQL verwenden, müssen auch wartbare GraphQL-Schemata erstellen. Bei einem Neuanfang kann GraphQL jedoch leicht zu erlernen und zu verwenden sein, da Anfragen und Antworten dieselbe Struktur haben.

Einzigartige Strategien für das API-Management

GraphQL erfordert möglicherweise neue API-Management-Strategien, während sich REST-APIs in der Regel in bestehende API-Management-Modelle integrieren lassen. Dies sollte berücksichtigt werden, da die Einführung einer neuen API-Management-Strategie die Gesamtkosten erhöhen kann.

Komplexes Caching

Caching ist bei GraphQL weniger unkompliziert als bei REST, wo Anfragen üblicherweise eine HTTP-Methode verwenden (GET, POST, PUT oder DELETE). Eine standardmäßige GraphQL-Anfrage verwendet POST, was auf HTTP-Ebene nicht cachefähig ist. Auch kann das Caching bei GraphQL komplex werden, da ein einzelner Endpunkt bedeutet, dass dessen URL mehrere unterschiedliche, nicht cachefähige Antworten liefert (gut für den Datenabruf, schlecht für das Caching). Serverentwickler müssen daher letztlich zwischen verschiedenen Abfragen unterscheiden, obwohl diese jeweils innerhalb desselben Objekts ausgeführt werden. Allerdings bieten viele GraphQL-Bibliotheken standardmäßig Caching-Mechanismen an.