iX 12/2017
S. 126
Praxis
Anwendungsschnittstellen
Aufmacherbild

APIs mit GraphQL implementieren

Koordinierte Information

GraphQL ist eine Schnittstelle, um strukturierte Daten zwischen Anwendungen zu übertragen. Es konkurriert mit REST und SOAP und kann gerade bei komplexeren Anfragen punkten.

GraphQL ist eine Abfragesprache für Webapplikationen, die sowohl lesende als auch schreibende Operationen beherrscht. Facebook hatte sie ursprünglich mit dem Ziel entwickelt, Daten für die mobilen Anwendungen vom Server zu holen. Dabei sollte sie so einfach sein, dass Entwickler sie leicht erlernen können. Die Sprache befindet sich seit 2012 im Einsatz.

Bei GraphQL handelt es sich nicht um ein konkretes Produkt, sondern vielmehr um ein Konzept, das mittlerweile in zahlreichen Sprachen umgesetzt ist. Es gibt unter anderem Implementierungen in Java, PHP, Go und JavaScript. Dieser Artikel zeigt den Funktionsumfang der JavaScript-Bibliotheken für den Client und den Server. Unter graphql.org/code/ findet sich eine Liste der Client- und Server-Implementierungen. Zusätzlich sind dort Werkzeuge und Dienste aufgelistet wie das Browser-Interface GraphiQL, ein Parser in C++ oder Backends as a Service, die eine GraphQL-Schnittstelle für verschiedene Frameworks anbieten.

GraphQL lässt sich auf einer Ebene mit REST und SOAP einordnen. Die Sprache dient dem Formulieren von Anfragen an einen Server. Die Umsetzung der Applikationslogik ist nicht Teil von GraphQL. So kann es in einer bestehenden Anwendung zum Einsatz kommen, ohne dass große Teile des Quellcodes ausgetauscht werden müssen.

Während Anwender bei REST jede Ressource über eine eindeutige URL ansprechen, existiert bei GraphQL eine URL für sämtliche Daten. Die eigentliche Abfrage erfolgt über eine Zeichenkette in einer strukturierten Form. Sie gibt gleichzeitig die Struktur der Antwort vor.

Bei GraphQL bestimmt die Query Inhalt und Struktur der Antwort (Abb. 1).

Bei REST übermittelt der Server die angefragte Ressource komplett. Im Gegensatz dazu sendet der GraphQL-Server lediglich die Daten, die der Client angefragt hat. Diese Eigenschaft kann das Transfervolumen der Applikation reduzieren. Der Server antwortet mit einer JSON-Struktur, die der Form der Anfrage entspricht. Abbildung 1 zeigt eine GraphQL-Anfrage und die Antwort des Servers.

GraphQL ist anders

GraphQL weist einige Charakteristika auf, die es von vergleichbaren Ansätzen wie REST unterscheiden. Das Verständnis dieser Eigenschaften ist wichtig für den richtigen Einsatz von GraphQL.

 Die Anfrage bestimmt die Struktur der Antwort. Der Server liefert nur die Felder zurück, die der Client bei der Anfrage angibt.

 GraphQL arbeitet mit Objektgraphen, nicht mit einzelnen Ressourcen und kann Relationen abbilden. Mit einer Anfrage lassen sich damit sowohl einzelne Objekte als auch Sätze von mehreren Objekten und ganze Objektbäume auslesen.

 Die Abfragesprache arbeitet mit einem eigenen Typsystem. Entwickler definieren serverseitig bestimmte Datentypen. Diese geben die Datenstrukturen vor und schaffen den Rahmen für die Abfragen. Ein Typ besteht aus einem oder mehreren Feldern, die wiederum mit Typangaben versehen werden.

 GraphQL ist nur eine Abfragesprache. Die Bibliotheken, die die Applikation zur Umsetzung von GraphQL verwendet, kümmern sich lediglich darum, dass die Vorgaben eingehalten werden. Die Implementierung der Businesslogik und das Speichern der Daten muss die Applikation übernehmen.

 Durch das Typsystem ist GraphQL weitgehend selbstdokumentierend. Anfragen erlauben, das gesamte Schema und die Struktur einzelner Typen auszulesen. Mit dieser Introspektion lässt sich eine vollständige Schnittstellenbeschreibung erzeugen.

 Die Dynamik von GraphQL macht eine Versionierung der Schnittstellen überflüssig. Neue Felder beeinflussen bestehende Anfragen nicht. Entwickler können nicht weiter benötigte Felder im Schema als deprecated markieren und zu einem späteren Zeitpunkt löschen. Die Informationen über solche Markierungen lassen sich über Introspektion auslesen.

Zusätzlicher Overhead und nur Text

Von einigen Entwicklern wird GraphQL als Ersatz für REST für die Kommunikation in Webapplikationen gehandelt. Dem stehen jedoch einige Nachteile entgegen.