© StonePictures/Shutterstock.com
GraphQL in Serverless-Architekturen integrieren

Hoch optimierte APIs


Mit seinen drei Jahren auf dem Markt stellt GraphQL eine gereifte und etablierte Alternative zu REST dar und sollte bei Erstellung oder Weiterentwicklung eines API in Betracht gezogen werden. Verschiedene Anwendungen wie Facebook, Instagram und XING verwenden die REST-Alternative bereits erfolgreich [1]. Grund genug, einen Einblick zu geben, wie GraphQL mit wenig Aufwand in moderne Serverless-Architekturen integriert werden kann. Dazu wird im Zusammenspiel von GraphQL mit AWS Lambda eine hoch skalierbare Implementierung vorgestellt, die auf verschiedene Architekturen und Frameworks adaptiert werden kann.

Wie oft hat man sich als Frontend-Entwickler darüber geärgert, dass ein REST Call nicht alle benötigten Daten geliefert hat. Auch als Backend-Entwickler wurde man jedes Mal wieder von Kollegen darum gebeten, eine weitere Property zu einer Response hinzuzufügen, wenn diese fehlte. Zum Glück gehören diese Probleme dank GraphQL der Vergangenheit an. Während REST hier fest vorgegebene Strukturen für die Rückgabe eines Aufrufs definiert, liefert GraphQL nur die Daten, die im Frontend gewünscht sind. Das Vermeiden von sogenanntem Over- und Underfetching wird erreicht, da mit dem Aufruf der Schnittstelle nicht nur die gewünschte auszuführende Methode genannt wird, sondern auch die gewünschten Rückgabestrukturen.

Moderne Entwicklungen in Microservices- und Serverless-Architekturen machen es möglich, hoch skalierbare Systeme zu erstellen. Kombiniert man diesen Vorteil mit GraphQL für netzlastoptimierte APIs, erhält man hoch optimierte, datengetriebene Systeme. Der Artikel gibt einen ersten Einblick in GraphQL. Dabei wird besonders auf das Zusammenspiel mit AWS Lambda als ein Vertreter der Serverless-Architekturen eingegangen.

Wichtige Begriffe des GraphQL-Schemas

GraphQL liefert eine Reihe von Begriffen, die in dessen Schemadefinition verwendet werden. Einige davon werden im Artikel behandelt. Für andere sei auf die GraphQL-Dokumentation verwiesen [2]:

  • Query – lesende Zugriffe auf Daten

  • Mutation – schreibende Zugriffe auf Daten; der Aufbau einer Mutation entspricht innerhalb des Schemas dem einer Query, beginnt jedoch mit dem Wort „mutation“

  • Inline Fragments – Objektbäume können sauber strukturiert und beispielsweise in anderen Queries wiederverwendet werden; Duplicate Code wird so vermieden

  • Type und InputType – Objekte und ihre Properties sind im Schema fest definiert. Diese Info ist dem Client und dem Server bekannt, wodurch eine Validierung direkt bei Start des Servers und Ausführung eines Requests verwendet werden kann

  • Scalar – Objekte wie Datumswerte (DateTime) können zu den GraphQL-nativen Elementen wie String, Int und Boolean ergänzt und direkt als Datentyp verwendet werden

  • Argument/Variable – Bei Übergabe von Serveranfragen können Argumente direkt in die Anfrage geschrieben oder als separate Variablen übergeben werden

  • Pflichtfelder – werden innerhalb des Schemas mittels nachgestelltem „!“ beschrieben

  • Direktive – gewünschte Rückgabestrukturen können durch die konditionalen Operatoren if und skip gefiltert werden

Ein erster Einblick

Wie genau sieht nun der Aufruf eines GraphQL-Servers aus? Der Client erstellt einen JSON Request mit den Elementen query und variables. Der Inhalt des Query-Objekts ist dabei ein String, der die namensgebende Graph Query Language als Wert beinhaltet. Als Variablen werden normale JSON-Objekte von beliebiger Komplexität übergeben. Diese Anfrage wird über einen klassischen POST Request an den Server gesendet. Der Endpoint lautet dabei beispielsweise /graphql. Listing 1 zeigt eine Serveranfrage inklusive Parameter.

Listing 1: GraphQL Request

{ "query": " query testQuery($id: Int!) { getCustomer(id: $id) { id name orders { date } } } ", "variables": { "id": 0 } }

Das Beispiel könnte nun beliebig erweitert werden, zum Beispiel um den Geburtstag des Kunden, seine Bestell-IDs oder das letzte Log-in. Alles ist möglich, solange die...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang