Zum Inhalt

GraphQL #

TL;DR

GraphQL ist:

  • Eine Datenabfragesprache für API's
  • Kann Daten mit einer Abfrage abrufen
  • Kann Daten mit einer Mutation ändern
  • Der Kunde gibt die genauen Daten an, die er haben möchte
  • Ergebnis ist kein übermässiger Abruf von Daten
  • Stellt einen einzigen Endpunkt zur Verfügung, um all diese Dinge zu tun

Was ist GraphQL#

Wer schon ein Mal mit Datenbanken zu tun hatte, hat sicherlich schon einmal mit SQL gearbeitet. Mithilfe von SQL können spezifische Abfragen gemacht werden, welche über Tabellen und Spalten hinweg führen. So können genau diese Elemente abgefragt werden, welche benötigt werden. Das gleiche Prinzip möchte man nun auch auf API's anwenden. Durch einen einzigen Endpunkt sollten alle möglichen Daten abgefragt werden können. Selbstverständlich gibt es auch bei GraphQL ein Schema, was den Aufbau der Daten beschreibt.

Wie funktioniert GraphQL#

GraphQL Abfragen sind in zwei Teile unterteilt: query und mutation. Über Query werden Daten abgefragt und über Mutation werden Daten geändert.

Eine Abfrage wird zuerst validiert, ob sie irgendwelche Fehler beinhaltet und ob sie dem Schema entsprechen. Die abgefragten Felder werden aus der Abfrage extrahiert. Diese werden dann in einer Datenbank oder einem sonstigen Service abgefragt. Zurück werden nur die gefragten Felder zurückgegeben.

GraphQL - Schema

Dieses Projekt kann auch über GraphQL abgefragt werden. Aus diesem Grund kann eine genauere Beschreibung zum Schema und zu den Abfragen unter API/Schema aufgefunden werden.

Vergleich zu REST#

GraphQL ist eine Weiterentwicklung zu REST. Die Idee dahinter ist, das Problem von zu vielen Abfragen zu lösen. Im folgenden Beispiel wird das verhalten von REST- zud GraphQL-API's verglichen.

Für jede Abfrage braucht es einen anderen Endpunkt. Das heisst, dass mehrere Abfragen passieren müssen, damit alle Daten zur Verfügung stehen:

REST Abfrage

Bei der GraphQL Abfrage werden alle Daten auf einem Mal übertragen:

GraphQL Abfrage

Unterschiede#

GraphQL ist Schema basiert. Das bedeutet, die Datenstruktur ist schon im Vorhinein festgelegt. So kann eine spezifische Abfrage erstellt werden, welche nur die benötigten Daten liefert. Dadurch wird bei der Übertragung von Daten nicht mehr zu viel Daten gesendet. Durch einen einzigen Endpunkt können Daten abgefragt oder geändert werden. Für den Client ist es einfacher, da er nur noch eine einzige Abfrage machen muss und nicht mehrere Endpunkte anspricht. GraphQL erlaubt auch die Verwendung von Subscriptions, welche es dem Client erlaubt, sich über Änderungen der Daten zu informieren. Dadurch das ein Schema besteht, können im Hintergrund ohne Probleme Änderungen am Backend vorgenommen werden.

Es gibt jedoch auch Schwierigkeiten, welche mit einer neuen Technologie kommen. Dazu gehört die Sicherheit. Da alles über einen Endpunkt läuft, ist es schwieriger, die Auslastung zu verteilen oder Abfragen für Benutzer zu limitieren. Jede Abfrage ist unterschiedlich, was das Zwischenspeichern von Daten sehr schwierig macht. Es gibt zwar schon Lösungen dafür, jedoch sind diese noch nicht so gut wie bei REST. Das Schema hat bereits vordefinierte Datentypen, welche verwendet werden. Im Moment sind diese noch sehr limitiert.

Microservice werden immer beliebter, da somit Aufgaben auf mehrere Bereiche verteilt werden können. Das ist ein Trend, welcher sich in den letzten Jahren stark verändert hat. Der Vorteil von diesem Trend ist, dass jede Schnittstelle einen eigenen Server haben kann. Durch GraphQL können auch externe Server eingebunden werden. Da alles über einen Endpunkt abfragbar ist, merkt der Client davon nichts.

Immer mehr Firmen verwenden GraphQL. Zu diesen Firmen gehören GitHub, Airbnb, AWS, Meta, Microsoft und noch weitere. Eine Liste der Firmen ist hier zu finden.

GraphQL Landscape

Dokumentation#

GraphQL zu Dokumentieren ist etwas, was mit Abstand das Einfachste ist. Es braucht keine Erklärung, was die einzelnen Endpunkte machen, da alles im Schema beschrieben ist. Die Felder sollten durch die Namen der Daten selbstbeschreibend sein. Als Beispiel wenn ein Mensch eine Höhe hat, dann ist klar, dass damit gemeint ist, wie gross er ist. Wenn ein Tisch eine Höhe hat, dann ist auch automatisch klar, was damit gemeint ist. Dies kann im folgenden Beispiel erkannt werden:

type Human {
    id: ID!
    surname: String
    lastname: String
    height: Float
}

type Table {
    id: ID!
    width: Float
    height: Float
}

Spring GraphQL#

Netflix verwendet Kotlin für bestimmte Bereiche ihrer Anwendungen. Sie schrieben ein Tool, welches nun Open Source gemacht wurde. Damit kann sehr einfach mit Java und GraphQL gearbeitet werden. Das Projekt heisst DGS und kann ohne Probleme mithilfe von Maven importiert werden. Die Dokumentation ist sehr ausführlich und beinhaltet alle möglichen Einstellungen. Das Projekt kann auch mithilfe von GraphQL abgerufen werden. Die Schnittstelle und Beschreibungen können unter API/Schema gefunden werden.

Für die Recherche in dieser Erklärung wurden folgende Links gebraucht: