Was ist GraphQL?

Eine kurze Übersicht zur GraphQL Spezifikation

GraphQL ist eine Abfragesprache für APIs und eine serverseitige Laufzeitumgebung zur Ausführung dieser Abfragen. GraphQL wurde 2012 entwickelt und 2015 von Facebook als Open Source zur Verfügung gestellt. Es hat schnell an Popularität gewonnen, und Tech-Unternehmen wie Github, Shopify, Stripe und Twitter haben inzwischen GraphQL-basierte APIs. Die GraphQL Foundation wacht über die GraphQL-Spezifikation.

Einer der entscheidenden Vorteile von GraphQL ist die Verringerung von unnötigem Datenverkehr. Mit GraphQL können Entwickler nur die Daten abrufen, die sie benötigen, wodurch die Menge unnötiger Datenübertragungen und die Notwendigkeit, zusätzliche Endpunkte oder komplexe Abfrageparameter zu implementieren, reduziert wird.

GraphQL

GraphQL arbeitet mit einem einzigen Endpunkt, um vorhandene Daten mit Hilfe von Abfragen abzurufen und vorhandene Daten mit Hilfe von Mutationen zu ändern. Außerdem werden Echtzeit-Updates und Subscriptions unterstützt, was die Erstellung reaktiver Apps erheblich vereinfacht. Das macht GraphQL besonders leistungsfähig für Front-End-Entwickler, die Anwendungen schneller entwickeln wollen.

GraphQL-Terminologie - Schema, Typen, Resolver

Dieser Abschnitt beschreibt die GraphQL-Terminologie, auf die ein API-Entwickler bei der Entwicklung mit GraphQL stößt, wie z. B.:

  • GraphQL-Schema and -Typen
  • GraphQL Queries
  • GraphQL Mutations
  • GraphQL Subscriptions
  • GraphQL Resolvers

GraphQL Schema and Typen

Die Typisierung ist ein weiterer entscheidender Vorteil, den GraphQL-APIs gegenüber klassischen RESTful-APIs haben. Der GraphQL-Server validiert die Struktur von Abfragen, mit Hilfe des GraphQL-Schemas bevor sie ausgeführt werden. Mit der GraphQL-Schemasprache definieren API-Entwickler die Objekttypen, -felder, und die Input-Typen.

Wesentliche Bestandteile eines GraphQL-Schemas sind:

  • Objekttypen
  • Objektfelder
  • Die query-, mutation- und subscription-Typen
  • Enumerationstypen
  • Interfaces
  • Input-Typen
  • Union-Typen

Die meisten Typen in einem GraphQL-Schema sind Objekttypen, die Objekte einer Anwendung darstellen, wie z. B. User, Account, Order, Event oder ähnliches. Jeder Objekttyp hat ein oder mehrere Felder, die Eigenschaften wie id, amount, name, age, createdAt, email, oder ähnliches repräsentieren.


Beispiele für Objekttypen von bekannten Plattformen:

  • Facebook: Friend, Post, Message, Event, Page, Group.
  • Airbnb: Listing, Host, Guest, Trip, Experience.
  • Slack: Team, Member, Channel, Message, Reaction, Thread.
  • Intercom: Customer, Teammate, Message, Conversation, Article.

Ein GraphQL-Server validiert Abfragen gegen das Schema, wenn GraphQL-Abfragen eingehen, und führt angehängte Resolver bei Erfolg aus. Ein Client kann Informationen über ein Schema über Introspektion abrufen.

GraphQL Abfragen (Queries)

Queries sind GraphQL-Operationen, die das Abrufen von Daten vom Server ermöglichen. Die Abfrage definiert, welche(s) Objekt(e) und Feld(er) von der Datenquelle zurückgegeben werden sollen. Ein GraphQL-API-Entwickler deklariert Abfragen als Felder des Root-Query-Typs. GraphQL-Queries sind das Äquivalent zu HTTP-GET-Anfragen in einer REST-API.

Damit der Server weiß, welche Daten er vom Server zurückgeben soll, fügt ein GraphQL-API-Entwickler Resolver für jede Abfrage hinzu und implementiert sie. Der GraphQL-Server projiziert die von der Datenquelle abgerufenen Ergebnisse auf die angegebenen Abfragefelder und validiert und erzwingt die definierte Abfragestruktur. Die Query-Resolver werden parallel ausgeführt, um die bestmögliche Leistung zu gewährleisten. Clients können Abfragen in einer einzigen HTTP-Anfrage bündeln, um Ergebnisse für mehrere Objekttypen auf einmal abzurufen.

GraphQL Mutations

Ein GraphQL-API-Entwickler deklariert Mutationen als Felder des Root-Mutationstyps zum Schreiben, Aktualisieren oder Löschen von Daten. GraphQL-Mutationen sind das Äquivalent zu HTTP POST-, PUT-, PATCH- und DELETE-Anfragen in einer REST-API.

Um Daten auf dem Server zu ändern, fügt ein GraphQL-API-Entwickler Mutation-Resolver für jede deklarierte Mutation hinzu und implementiert sie. Ähnlich wie bei Abfragen definiert der Client, der eine Mutation aufruft, welche Felder bei erfolgreicher Ausführung in der Antwort enthalten sein müssen. Das Stapeln von Mutationen in einer einzigen Anfrage führt diese nacheinander aus.

GraphQL Subscriptions

Ein GraphQL-API-Entwickler kann GraphQL-Abonnements verwenden, um Echtzeit-Updates vom Server zu erhalten. Um dies zu erreichen, abonniert der Client Mutationsereignisse, die auf dem Server auftreten. Ein Mutationsereignis kann das Schreiben, Aktualisieren oder Löschen von Daten auf dem Server darstellen. GraphQL Subscriptions ermöglichen Echtzeit- oder reaktive Funktionen für eine Anwendung.

Ein Client baut eine persistente WebSocket-Verbindung zum Server auf, um Mutationsereignisse über GraphQL Subscriptions abzurufen. Eine WebSocket-Verbindung bleibt offen, bis sie entweder vom Client oder vom Server beendet wird.

GraphQL-Resolver

Im vorigen Abschnitt haben wir bereits etwas über Resolver gelernt. Resolver erledigen die Arbeit der Auflösung von GraphQL-Anfragen durch die Ausführung von Code. Einige Beispiele hierfür sind die Validierung von Abfrageparametern, das Abrufen von Daten aus einer oder mehreren Datenquellen, die Handhabung der Zugriffskontrolle auf der Basis von Berechtigungen, die Projektion von Abfragefeldern auf abgefragte Datenattribute oder sogar die Abfrage von Daten aus anderen APIs.

GraphQL ermöglicht es Ihnen, einen GraphQL-Resolver an jedes Objekttypfeld eines GraphQL-Schemas anzuhängen. Dieses leistungsfähige Konzept ermöglicht es Entwicklern, Daten aus mehreren Quellen gleichzeitig abzurufen. Es ist zu beachten, dass der GraphQL-Standard keine Anweisungen darüber gibt, wie Daten zu speichern sind oder welche Programmiersprache zu verwenden ist. API-Entwickler können also APIs mit der von ihnen bevorzugten Methode erstellen. Die GraphQL-Spezifikation stellt sicher, dass sie auf vorhersehbare Weise funktionieren.

GraphQL Introspektion

GraphQL ist introspektiv, was es Entwicklern ermöglicht, das Schema einer GraphQL-API abzufragen, um etwas über ihre Typen und Felder zu erfahren. Die Introspektionsabfrage ermöglicht es Entwicklern also, die verfügbaren GraphQL-Abfragen, Mutationen, Abonnements, Objekttypen und Objektfelder einer GraphQL-API zu entdecken. Die Fähigkeit zur Introspektion ermöglicht es der Gemeinschaft daher, Entwicklerwerkzeuge für GraphQL zu entwickeln. Andererseits könnte Introspektion ohne Zugriffskontrolle zu einem Sicherheitsrisiko werden, da potenzielle Angreifer eine GraphQL-API gut verstehen können, indem sie eine Introspektionsabfrage ausführen.

Weiterführende Infos zu GraphQL