Hands of man using online virtual app on mobile phone. Millennial guy chatting on smartphone, using banking services, reading text message, typing, shopping, making call, browsing internet. Close up

GraphQL – Die Alternative zu REST

Teil 1: Übersicht und Backend

Was ist GraphQL?

GraphQL ist eine Abfragesprache für APIs zur Ausführung von Abfragen mit Hilfe eines für die Daten definierten Typensystems. GraphQL ist nicht an eine bestimmte Datenbank gebunden (https://graphql.org/learn/)

GraphQL vs. REST

GraphQL bietet die Möglichkeit, Daten über HTTP zu senden. Jede Anfrage in GraphQL ist eine POST-Anfrage. Der Body enthält die Abfrage für den Server, welcher die Abfrage auflöst. Um Daten zu erhalten, wird eine Query gesendet. Wenn man Daten erstellen, ändern oder löschen möchte, wird eine Mutation gesendet.
GraphQL ist eine flexible Abfragesprache für APIs. Es ermöglicht Entwicklern, genau die Daten zu erhalten, die sie benötigen.

Vor- und Nachteile von GraphQL

Pro:

  • Schnelle Prototypenentwicklung
  • API-Erweiterung ohne Versionierung
  • Autogenerierte API-Dokumentation mit GraphiQL
  • Es werden immer die Daten geholt, die benötigt werden
  • Loose coupling zwischen Server und Client

Contra:

  • Keine simple Caching-Strategie
  • Overkill für kleine Anwendungen
  • File-Upload nicht möglich
  • Komplex beim Einstieg
  • Performanceprobleme bei tief verschachtelten Abfragen

GraphQL 101

In dieser kleinen Blog-Serie schauen wir uns einfache Queries und Mutations an. Wir haben eine kleine Testanwendung mit Adressen und Benutzern, diese stehen in einer 1-zu-1 Beziehung zueinander. Die Anwendung wurde mit folgender Technologie umgesetzt:

  • .NET Core 2.2
  • Entity Framework Core
  • GraphQL for .NET (https://graphql-dotnet.github.io/)
  • GraphiQL (https://github.com/graphql/graphiql)
  • Angular

Query

Die einfachste Art eine Query zu beschreiben ist es, diese mit einem GET-Request à la REST zu vergleichen.

Screenshot eine einfache Query in GraphiQL
Abbildung 1: eine einfache Query in GraphiQL

Mit dieser einfachen Query wird ein User mit den Eigenschaften firstName und lastName geladen. Hier sieht man bereits den Vorteil von GraphQL, dass das Ergebnis den gleichen Aufbau aufweist wie die Abfrage. Außerdem haben wir nur die Daten erhalten, die wir auch abgefragt haben.

Screenshot User und Address Klasse mit Eigenschaften
Abbildung 2: User und Address Klasse mit Eigenschaften

Die Entität User hat mehr Eigenschaften als nur firstName und lastName:

Screenshot Datenabfrage eines Users mit einer spezifischen Id
Abbildung 3: Datenabfrage eines Users mit einer spezifischen Id

In Abbildung 3 haben wir ein Beispiel einer Query mit einem Argument.

user(id:25)

  • user = Name der Query
  • id = Name des Arguments
  • 25 = Wert des Arguments

In GraphQL spricht man nicht von Parametern, sondern von Argumenten.

Außerdem zeigt dieses Beispiel die verschachtelte Abfrage der Address-Eigenschaften.

Mutation

Eine Mutation ist eine Unterart der Query. Damit werden, wie der Name schon vermuten lässt, Daten erstellt, geändert oder gelöscht.

Screenshot Beispiel Mutation mit zwei Argumenten und dem Rückgabewert Id
Abbildung 4: Beispiel Mutation mit zwei Argumenten und dem Rückgabewert Id

In diesem Beispiel können wir eine weitere Eigenschaft von GraphQL Queries sehen: query variables. Darin werden komplexe Objekte eingetragen; in unserem Beispiel ein User und eine Address.

Jede Mutation beginnt mit dem Wort mutation,um diese Query als eine Mutation zu erkennen. Der Inhalt in der Klammer definiert Variablen und den entsprechenden Datentypen dazu. In unserem Beispiel entspricht die Variable $user einem UserInput.

Screenshot UserInputType
Abbildung 5: UserInputType

Unsere UserInputType Klasse erbt von InputObjectGraphType<T> wobei T in unserem Beispiel die Entität User ist. Der Name entspricht dem Namen in Abbildung 4. Standardmäßig akzeptieren die Felder keine NULL-Werte. Mit einem false als zweiten Parameter, akzeptieren die Felder auch ein NULL als Wert.

Screenshot Nullable Field
Abbildung 6: Nullable Field

Datentypen in GraphQL, GraphQL for .NET und .NET

Ein GraphQL-Objekttyp hat einen Namen und Felder, aber irgendwann müssen diese Felder in konkrete Daten umgewandelt werden. An dieser Stelle kommen die skalaren Typen ins Spiel.

In der Abbildung 7 sieht man die Typen, die von der GraphQL Specificiation bereitgestellt werden. Außerdem können wie im UserTypeInput-Beispiel eigene Typen erstellt werden.

Screenshot Datentypen in GraphQL, GraphQL for .NET und .NET  Skalare Typen
Abbildung 7: Skalare Typen

Backend Struktur

Das Beispielprojekt ist in zwei Projekte aufgeteilt (das Testprojekt wird ignoriert). Das Data-Projekt enthält die Logik zum Lesen und Schreiben von Daten in die Datenbank mit Entity Framework. Das API-Projekt beinhaltet die interessante GraphQL-Logik. Aus Gründen der Einfachheit werden wir auch das Data-Projekt ignorieren.

Screenshot Projekt Struktur
Abbildung 8: Projekt Struktur

Wir legen den Fokus auf folgende Klassen:

  • GraphQuery
  • AppSchema
  • AppQuery
  • AppMutation
  • UserType und AddressType
  • UserInputType und AddressInputType
  • ContextServiceLocator
  • GraphQlController

GraphQuery.cs

Die GraphQuery Klasse beinhaltet die Definition, welche Eigenschaften eine Query haben kann.

Screenshot GraphQuery.cs
Abbildung 9: GraphQuery.cs

In unserem Beispiel hat unsere Klasse zwei Eigenschaften:

  • Query – die Query selbst
  • Variables – die Variablen, die mit der Query mitgesendet werden

AppSchema

Das AppSchema beschreibt die möglichen Queries und Mutations. Außerdem löst der IDependencyResolver, eine Komponente der GraphQL for .NET Library, die Abhängigkeiten auf.

Screenshot AppSchema
Abbildung 10: AppSchema

AppQuery

Diese Klasse enthält die Definitionen darüber, wie die Daten abgefragt werden können. Eine GraphQL Query wird als Field bezeichnet. Jedes Field ist einem Typen zugeordnet und hat folgende Parameter:

  • name : String – der Name der Query
  • arguments : QueryArguments – Liste mit Argumenten vom Typ QueryArgument<T>, wobei T ein ObjectGraphType ist
  • resolve : ResolveContextField – hier wird definiert, was getan werden muss, um die Daten zu bekommen. Außerdem muss hier ein dem Field entsprechender Rückgabewert definiert werden
Screenshot AppQuery
Abbildung 11: AppQuery

AppMutation

Eine Mutation ist genauso aufgebaut wie eine Query, mit der Ausnahme, dass die Eigenschaft Name gesetzt werden muss.

Screenshot Ausschnitt AppMutation
Abbildung 12: Ausschnitt Mutation

UserType und AddressType

Diese Klassen erben von der Klasse ObjectGraphType. Dadurch können Objekte dieser Klasse in Feldern von Queries und Mutations vorkommen. In unserem Beispiel erben wir von einer konkreteren Klasse, und zwar ObjectGraphType<T>, wobei T einmal User und einmal Address ist. Dadurch können wir die Field-Eigenschaft einfacher mit den Eigenschaften der entsprechenden Entität zusammenführen. Standardmäßig werden hier keine NULL-Werte erlaubt. Mit dem optionalen Parameter true als zweiten Übergabeparameter kann man dennoch NULL-Werte zulassen. Durch einen Namen kann der Type einfacher in der GUI von GraphiQL erkannt werden.

Screenshot eigener Definitionen von ObjectGraphType
Abbildung 13: Eigene Definitionen von ObjectGraphType

UserInputType und AddressInputType

Um Mutations mit ganzen Objekten zu erstellen, werden InputTypes benötigt. Die Klassen der InputTypes erben von InputObjectGraphType<T>. Auch hier kann T wieder einer Entität entsprechen, um die Eigenschaften einfacher zu definieren.

Screenshot UserInput- und AddressInputType
Abbildung 14: UserInput- und AddressInputType

ContextServiceLocator

Diese praktische Klasse dient als Hilfe für unsere AppQuery und AppMutation-Klasse, um die entsprechenden Repositories zu laden.

Screenshot ContextServiceLocator
Abbildung 15: ContextServiceLocator

GraphQlController

Für eine GraphQL Anwendung wird nur ein Controller benötigt. Das heißt natürlich nicht, dass man nicht mehrere Controller verwenden darf. Bei mehreren AppSchema Klassen kann es sehr nützlich sein, auch mehrere Controller zu haben. Durch constructor dependency injection wird das AppSchema und die Komponente IDocumentExecuter bereitgestellt. Der IDocumentExecuter ruft die entsprechende Query oder Mutation auf.

Screenshot GraphQLController
Abbildung 16: GraphQLController

Fazit

GraphQL ist der Traum jedes Frontend-Entwicklers. Keine Daten fehlen in der Anfrage und es werden auch nicht zu viele gesendet. Leider wird in diesem Beispiel das sogenannte “under/overfetching”-Problem nach hinten verschoben, zwischen Backend und Datenbank, da Entity Framework alle Eigenschaften mit lädt. Das Gerüst zu bauen – mit allen Queries und Mutations – kann durchaus mehr Zeit in Anspruch nehmen, als vielleicht zuerst erwartet. Wenn diese initiale Arbeit aber erstmal geleistet worden ist, ist es sehr effizient an einer GraphQL Anwendung zu arbeiten. Wenn am Datenmodel nicht mehr gearbeitet wird, kann jeder Frontend-Entwickler sich die Daten so holen, wie es für seine Plattform am besten ist. 

Vogelperspektive Laptop Tastaturen
Training_Master

Domino REST & Co

Vogelperspektive Laptop Tastaturen
Training_Anfrage

Domino REST & Co

Vogelperspektive Laptop Tastaturen
Training_Termin

Domino REST & Co

Blog

[Whitepaper] Google Workspace: Eine sicherere Alternative

Im Whitepaper erfahren, wie die Secure-by-Design- und Secure-by-Default-Architektur von Google Workspace Kund:innen schützt.

novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog 12.07.18

Nutzung der SharePoint REST API mit Microsoft Flow

Durch Zugriffe über die REST API lassen sich viele Vorgänge mit Microsoft Flow automatisieren.

Blog 30.10.25

Hyperscaler vs. EU-Alternative: Wer liefert wirklich?

Hyperscaler vs. EU-Alternativen. Im Interview mit Marc Achsnich geht es darum, warum der Vergleich von Cloud-Anbietern heute entscheidend ist und wie du mit comparison.cloud objektiv vergleichst.

Offering

Education Special

Upgrade gefällig? Mir der Chrome Education Upgrade Lizenz profitierst Du von der zentralen Verwaltung Deiner Chromebooks.

Cloud Software
Lösung

Cloud-Produkte

Unsere Produkte und Solutions auf einen Blick

Angebote für Cloud und Google Workspace G Suite von CLOUDPILOTS
Lösung

CLOUDPILOTS Angebote

Hier findest Du lauter Angebote von Google, CLOUDPILOTS und unseren Partnern. Sobald neue Angebote vorhanden sind, findest du sie hier.

Teaserbilg HSRM
Referenz

Eine zentrale IAM-Lösung für die Hochschule RheinMain

Gemeinsam mit IPG führt die Hochschule RheinMain eine neue IAM-Lösung und maßgeschneiderte Identitätsprozesse für Studierende und Mitarbeiter ein, um die Sicherheit zu erhöhen. ✅ Lesen Sie mehr dazu.

Mit Google Cloud passende Lösungen finden
Service

Cloud Development

Eine standardisierte Lösung für komplexe Herausforderungen zu finden, ist leider eine Seltenheit. Unsere Experten analysieren Euer Problem und präsentieren maßgeschneiderte Lösungen.

GARANCY ist ein IAM Produkt mit vielfältigen Möglichkeiten
Blog 09.09.20

GARANCY – vielfältigen IAM-Möglichkeiten

Die GARANCY IAM Suite stellt eine dynamische Lösung zur Verfügung, um Datendiebstählen vorzubeugen.

Blog 17.11.23

Wie Kölner Stadtanzeiger 80% CTR Boost mit KI erzielt

Heute zu Gast: Robert Zilz vom Kölner Stadtanzeiger Medien. In der Folge gibt Robert Einblicke wie ein Verlagshaus erfolgreich den Wandel zur datengetriebenen Zukunft vollzieht.

Blog 04.10.23

Multi Cloud + OVHcloud = Sinnvoll?

Dieser Blogbeitrag beschreibt das Konzept der Multi Cloud im Cloud Computing, bei dem Dienste und Ressourcen von verschiedenen Cloud-Anbietern kombiniert werden.

Leistung 22.09.20

Arbeiten mit CLOUDPILOTS

Mit dem richtigen Partner an Deiner Seite ist vieles einfacher und effizienter, obwohl ein direkter Bezug beim Hersteller auf den ersten Blick reizvoll ist. Aber eben nur auf den ersten Blick!

Blog 10.11.23

Internen Traffic mit IPv6 Adressen ausschließen

Die Digitalisierung schreitet unaufhörlich voran und mit ihr die Weiterentwicklung von Netzwerktechnologien. IPv6-Adressen gewinnen immer mehr an Bedeutung, da der Adressraum von IPv4 langsam erschöpft ist. Doch wie passt dies in die Welt von Google Analytics 4, das primär für IPv4 konzipiert wurde? Die Verwendung von IPv6 in GA4 birgt sowohl Chancen als auch Herausforderungen. In diesem Blogbeitrag beleuchten wir, wie man IPv6-Adressen in GA4 nutzt, um internen Traffic zu filtern und gehen auf die Hürden ein, die sich durch die Fokussierung von GA4 auf IPv4 ergeben.

Blog 26.09.23

D2C ermöglicht Next-Level Customer Experience

Gemeinsam mit dem ECC haben wir ein Thesenpapier zum Thema D2C-Strategien im Heim & Garten-Sektor veröffentlicht. Dort wurden insgesamt sieben Thesen zu D2C-Strategien intensiv untersucht. Diese Folge widmet sich der dritten These, die besagt, dass D2C eine Next-Level Customer Experience ermöglicht, dieses Potenzial von Herstellern allerdings noch nicht optimal ausgeschöpft wird.

Titelbild zur Referenz IAM von Otto Gruppe
Referenz

IAM-Lösung für Otto Group IT

Die Otto Group implementiert einen komplexen Benutzerlebenszyklus mit einem hohen Grad an Anpassung und Automatisierung implementiert, der auf Produktivität und rasche Mitarbeiterintegration abzielt.

Blog 25.10.23

Die Innovationskraft hinter modernem E-Commerce

In der Folge spreche ich mit André Menegazzi von commercetools über die Notwendigkeit von Flexibilität und einen innovativen Ansatz bei bestimmten Use Cases.

Zusammenarbeiten mit Google Workspace
Lösung 10.03.23

Business Continuity mit CLOUDPILOTS

Kennt Ihr Eure kritischen Geschäftsfunktionen und deren Risiken? Wisst Ihr, was zu tun ist, wenn etwas schiefläuft?

Bleiben Sie mit dem TIMETOACT GROUP Newsletter auf dem Laufenden!