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.

Abbildung 1: 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.

Abbildung 2: 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:

Abbildung 3: 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.

Abbildung 4: 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.

Abbildung 5: 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.

Abbildung 6: 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.

Abbildung 7: 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.

Abbildung 8: 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.

Abbildung 9: 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.

Abbildung 10: 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
Abbildung 11: AppQuery
Abbildung 11: AppQuery

AppMutation

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

Abbildung 12: Ausschnitt Mutation
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.

Abbildung 13: Eigene 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.

Abbildung 14: 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.

Abbildung 15: 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.

Abbildung 16: 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. 

Mehr Blogposts

DevOps und Container
Blog
Blog

DevOps und Container

DevOps an sich ist nicht an eine Technologie gebunden, jedoch haben sich Container-Technologien und DevOps als Verwandte im Geiste gefunden.

Tipps und Tricks mit Entity Framework
Blog
Blog

Tipps und Tricks mit Entity Framework

In diesem Blogbeitrag möchte ich einige Tipps und Tricks rund um Entity Framework mit euch teilen. In allen Beispielen gehen wir vom Code-First Ansatz aus.

Paket Dependency Manager für .NET
Blog
Blog

Paket Dependency Manager für .NET

Paket ist ein Dependency Manager für .NET, welcher es sich zum Ziel gesetzt hat einige Probleme von NuGet zu beheben.

Ich bin im Flow! – Eine Übersicht zu Microsoft Flow
Blog
Blog

Ich bin im Flow! – Eine Übersicht zu Microsoft Flow

Die Power Platform wird aktuell von Microsoft sehr stark gepusht. Zeit, sich mit dem Potenzial der einzelnen Komponenten zu beschäftigen. Heute: Flow.

DevOps und „The Phoenix Project“
Blog
Blog

DevOps und „The Phoenix Project“

Buchvorstellung "Projekt Phoenix: Der Roman über IT und DevOps - Neue Erfolgsstrategien für Ihre Firma" von Gene Kim.

.NET-Anwendung hinter Proxy-Servern, Kommunikation mit Azure
Blog
Blog

.NET-Anwendung hinter Proxy-Servern, Kommunikation mit Azure

Praktische Beispiele für die Anwendung von Proxy-Servern bei .NET-Apps und -Websites sowie die Kommunikation über den Azure Service Bus.

Teams Extensions – Erstellen von Erweiterungen für Teams
Blog
Blog

Teams Extensions – Erstellen von Erweiterungen für Teams

Mit der Entwicklung von Extensions kann Teams einfach erweitert werden. Hierfür gibt es das App Studio, welches über den Teams Store installiert werden kann.

Azure Functions: Der Webservice ohne Webserver
Blog
Blog

Azure Functions: Der Webservice ohne Webserver

Azure Functions als Authentifizierungs-Helfer für clientseitige Lösungen mit 3rd Party APIs

Die Email-Falle: Overkill eines Kommunikationskanals
Blog
Blog

Die Email-Falle: Overkill eines Kommunikationskanals

Wie Sie die vier häufigsten und schwerwiegendsten Fehler bei der Email-Kommunikation in mittleren und großen Unternehmen verhindern.

SharePoint optimieren, wenn er schlecht läuft
Blog
Blog

SharePoint optimieren, wenn er schlecht läuft

Wie Sie die fünf Anzeichen einer schlechten SharePoint-Implemetierung erkennen und diese vermeiden oder beheben, um die Performance des Systems zu verbessern.

SharePoint und Informationsarchitektur – worauf kommt es an?
Blog
Blog

SharePoint und Informationsarchitektur – worauf kommt es an?

Wie definiert sich eine Informationsarchitektur und die Rolle eines Informationsarchitekten im SharePoint-Umfeld?

Hat Ihr Unternehmen einen Informations-Lebenszyklus?
Blog
Blog

Hat Ihr Unternehmen einen Informations-Lebenszyklus?

Jede Information hat eine Aktualitätsphase, eine Nachschlag-Phase, eine Archiv-Phase und einen Obsoleszenz-Punkt. Steuern Sie den Lebenszyklus Ihrer Information...

Die Bedeutung einer Governance
Blog
Blog

Die Bedeutung einer Governance

In der Governance-Struktur legen Sie fest, wie Sie mit Ihrer SharePoint-Umgebung arbeiten. Governance beschreibt die Rollen der Nutzer, legt Verantwortlichkeite...

Ein Blick auf den Begriff „Intranet“
Blog
Blog

Ein Blick auf den Begriff „Intranet“

Welche Unternehmen brauchen eine Intranet und warum benötigen sie es? Um diese Frage sinnvoll zu beantworten, betrachten wir den Begriff „Intranet“ differenzier...

Interdisziplinärer Mehrkampf in SharePoint-Projekten
Blog
Blog

Interdisziplinärer Mehrkampf in SharePoint-Projekten

In SharePoint-Projekten, speziell wenn man nicht nur einzelne Projektseiten ohne Kontext zur Verfügung stellt, sind viele unterschiedliche Disziplinen gefragt.

Enterprise Content Management: Mühe scheuen, ROI verschenken
Blog
Blog

Enterprise Content Management: Mühe scheuen, ROI verschenken

Zusammenfassung und Diskussion eines Blogposts von Joe Shepley zur Wichtigkeit eines umfassenden Informationsmanagements für Enterprise Content Management.

Das neuste Mitglied der Office 365 Familie: Delve
Blog
Blog

Das neuste Mitglied der Office 365 Familie: Delve

Microsoft legt nach: Mit Delve startet eine neue Form des Suchens und des Auffinden von Dokumenten und Informationen.

Die Micro-Info-Architektur
Blog
Blog

Die Micro-Info-Architektur

Vertiefung zum Thema Informationsarchitektur moderner Intranets mit SharePoint: Das Micro-Management.

Farben zur Optimierung des SharePoint-Kalender
Blog
Blog

Farben zur Optimierung des SharePoint-Kalender

Auch in SharePoint kann man Kategorien für Teamkalender-Einträge farblich abheben und damit die Lesbarkeit erhöhen. Wir zeigen Ihnen, wie das geht.

Die Geschichte von Microsoft SharePoint – Teil 1
Blog
Blog

Die Geschichte von Microsoft SharePoint – Teil 1

Mit SharePoint Team Services (STS) und SharePoint Portal Server (SPS) schuf Microsoft im Jahr 2001 die Grundlage der heutigen SharePoint-Plattform.

Einmaleins zu Inhalt und Organisation eines Intranet
Blog
Blog

Einmaleins zu Inhalt und Organisation eines Intranet

Ein auf Microsoft SharePoint basierendes Intranet vereint sowohl Informations-, Dialog- als auch Kollaborationsfunktionen. Tipps zur Organisation.

Als anderer Benutzer anmelden in SharePoint 2013
Blog
Blog

Als anderer Benutzer anmelden in SharePoint 2013

Warum diese Funktion nun fehlt und wie man alternativ vorgeht, um sich in SharePoint 2013 als 'anderer Benutzer' anzumelden.

Vier Schritte zur anwenderfreundlichen Bibliothek
Blog
Blog

Vier Schritte zur anwenderfreundlichen Bibliothek

Wäre es nicht gut eine Plattform zu haben auf der man Dokumente bereitstellen, Änderungen verfolgen und finale Versionen bereitstellen könnte? Hier unsere Tipps...

Die Geschichte von Microsoft SharePoint – Teil 3
Blog
Blog

Die Geschichte von Microsoft SharePoint – Teil 3

Der Meilenstein zur echten Collaboration wurde 2006 mit dem Release von Microsoft Office SharePoint Server 2007 „MOSS“ erreicht.

Die Geschichte von Microsoft SharePoint – Teil 2
Blog
Blog

Die Geschichte von Microsoft SharePoint – Teil 2

2003 war ein super Jahr für Microsoft. Die Produktfamilie wuchs und gemeinsames Arbeiten war der neue Trend: Es war die Sternstunde der Kollaboration.

Teamsite ist tot – es lebe die Group?
Blog
Blog

Teamsite ist tot – es lebe die Group?

Ob der Funktionsumfang von Groups tatsächlich reicht, um die Beerdigung für Teamsite einzuläuten, erfahrt ihr hier.

Change Management in IT-Projekten
Blog
Blog

Change Management in IT-Projekten

Viele IT-Projekte scheitern am Zusammenspiel verschiedener Faktoren, wie unklare Ziele, ungenügende Ressourcen, schlechte Kommunikation und fehlende User-Akzept...

Informationsorganisation in SharePoint Intranet
Blog
Blog

Informationsorganisation in SharePoint Intranet

In vielen SharePoint Projekten findet man Informationsarchitekturen, die versuchen, die hierarchische Organisation eines Unternehmens abzubilden. Ich zeige ande...

Office 365 Groups als Evolution von SharePoint?
Blog
Blog

Office 365 Groups als Evolution von SharePoint?

Zusätzlich zu SharePoint erlauben die Office 365 Groups es mir als Anwender, schnell und einfach neue Gruppen anzulegen und selbständig Benutzer hinzuzufügen.

Clutter sinnvoll nutzen
Blog
Blog

Clutter sinnvoll nutzen

Microsoft hat in Office 365 eine neue Funktion eingeführt. "Clutter" soll künftig im eigenen Posteingang für Ordnung sorgen und die Emailflut bereinigen.

Strukturen lernen und leben – Praxis Informationsarchitektur
Blog
Blog

Strukturen lernen und leben – Praxis Informationsarchitektur

Teil 1 – Strukturen lernen – Informationsarchitektur erfolgreich vertreten

Strukturen lernen und leben – Praxis Informationsarchitektur
Blog
Blog

Strukturen lernen und leben – Praxis Informationsarchitektur

Teil 2 – Strukturen leben – Informationsarchitekturen zum Leben erwecken

CRM-Implementierung erfolgreich meistern
Blog
Blog

CRM-Implementierung erfolgreich meistern

Es gibt keine todsichere Methode, die CRM-Implementierung erfolgreich zu gestalten. Aber es gibt Tipps und Richtlinien, die man bei einer Einführung einhalten k...

Vier Möglichkeiten, die Nutzung von CRM zu steigern
Blog
Blog

Vier Möglichkeiten, die Nutzung von CRM zu steigern

Wie man die Nutzung von CRM-Plattformen steigern kann, wird im folgenden Artikel ausführlich erklärt.

Drei Tipps für mehr SharePoint-Begeisterung
Blog
Blog

Drei Tipps für mehr SharePoint-Begeisterung

Wir geben Tipps zur der Microsoft Serverplattform für Content Management, (Social)-Collaboration, Portalfunktion, Business Intelligence und Enterprise Search.

Energiekekse für den Berater
Blog
Blog

Energiekekse für den Berater

Der Berater Keks! Schnelle Energie-Zufuhr, Fett verbrennen und Muskeln aufbauen bei der Arbeit war nie einfacher!

Usability in IT-Projekten
Blog
Blog

Usability in IT-Projekten

Noch immer wissen viele nicht genau, worum es bei Usability und User Experience gerade im Rahmen von IT-Projekten überhaupt geht.

Fünf Tipps für eine verbesserte Software-Adoption
Blog
Blog

Fünf Tipps für eine verbesserte Software-Adoption

Die Generation Y stellt im Arbeitsumfeld neue Anforderungen an Unternehmens-Software und -Systeme. Unsere fünf Tipps, um die Adoption einer Software erhöhen.

Produktiver lernen mit SharePoint
Blog
Blog

Produktiver lernen mit SharePoint

Bringt die aktuelle Version der SharePoint-Plattform so viele neue Features mit, es zu einem perfekten Learning Management System zu machen? Wir beleuchten es.

Fünf Tipps für mehr SharePoint-Adoption in Unternehmen
Blog
Blog

Fünf Tipps für mehr SharePoint-Adoption in Unternehmen

SharePoint ist eine vielseitige und mächtige technologische Plattform mit vielen Funktionen. Unseren fünf Expertentipps erhöhen die Adoption.

Icons im Metro-Style generieren
Blog
Blog

Icons im Metro-Style generieren

Die Erstellung von Icons im Metro-Style erweist sich als schnell und unkompliziert, wenn man dafür Syncfusion Metro Studio 4 verwendet.

End of Life – Eine Applikation wird abgelöst
Blog
Blog

End of Life – Eine Applikation wird abgelöst

Die Stilllegung einer Applikation im Application Lifecycle Management nicht beachtet. Dennoch sollten sie in einem ganzheitlichen Ansatz beachtet werden.

Was ist Application Lifecycle Management (ALM)?
Blog
Blog

Was ist Application Lifecycle Management (ALM)?

Application Lifecycle Management beschreibt einen ganzheitlichen Ansatz, der eine Anwendung während allen Phasen der Software begleitet.

Was kann der neue Office 365 Planner – und was kann er nicht
Blog
Blog

Was kann der neue Office 365 Planner – und was kann er nicht

„Office 365 Planner“ ist das neue Tool von Microsoft, mit dem sich Zusammenarbeit und Aufgabenverteilung in Teams organisieren lässt.

SharePoint-Migration unter Einhaltung der BITV 2
Blog
Blog

SharePoint-Migration unter Einhaltung der BITV 2

Einhaltung aller Vorgaben durch die BITV 2 bei einer Migration von SharePoint Server 2013 zu 2016.

SharePoint vs. TYPO3 – Sechs Gründe für SharePoint-Intranet
Blog
Blog

SharePoint vs. TYPO3 – Sechs Gründe für SharePoint-Intranet

Hier lesen Sie die sechs wichtigsten Argumente, warum Sie Office 365 mit SharePoint für Ihre Intranetlösung gegenüber TYPO3 bevorzugen sollten.

Corporate News – Das zentrale Medium interner Kommunikation
Blog
Blog

Corporate News – Das zentrale Medium interner Kommunikation

Um die Akzeptanz des unternehmenseigenen Intranets zu steigern, sind Corporate News ein erster Schritt, um Neuigkeiten, Strategie und Strukturen gleichmäßig zu ...

Hybride Metadaten und Inhaltstypen
Blog
Blog

Hybride Metadaten und Inhaltstypen

Dies sollten Sie bei der Verwaltung von Metadaten in hybriden SharePoint-Umgebungen beachten, um eine reibungslose Synchronisation zu sichern.

Hub Sites – Neues Level der Vernetzung
Blog
Blog

Hub Sites – Neues Level der Vernetzung

Mit der Einführung der Modern Sites auf SharePoint Online hielt ein komplett neues Bedienungs-, Oberflächen- und Nutzungskonzept Einzug. Microsoft führt diese O...

Grundlagen der Gestaltung
Blog
Blog

Grundlagen der Gestaltung

Die Gestaltgesetze der Wahrnehmungspsychologie