Sie sind hier: Wissen

Was ist GraphQL ?

GraphQL ist eine textbasierte Datenabfragesprache zur Verwendung in Webservices/WebAPIs. GraphQL wurde von Facebook entwickelt und 2015 erstmals veröffentlicht. 2016 erschien die erste stabile Version. [https://github.com/graphql/graphql-spec]
Alternative: Open Data Protocol (ODATA)

Beispiel für http://graphql.org/swapi-graphql

GraphQL-Abfrage für Personen mit den Filmen, in denen sie erscheinen

edges {
node {
id, name, filmConnection {
edges {
node {
id, title
}
}
}
}
}
}
}

Spezifikation

https://github.com/graphql/graphql-spec
https://medium.com/@marion.schleifer/einf%C3%Bchrung-in-graphql-88da668ee1

Details zu GraphQL von Jörg Krause

REST ist für kleine und mittlere Umgebungen perfekt. Es ist ausreichend, wenn die Komplexität der Abfragen überschaubar ist. Da jedoch alles eine Ressource ist, wird es unübersichtlich, wenn es sehr viele derartige Ressourcen gibt. An dieser Stelle sind komplexere Abfragesprachen gefragt, die Mehrfachzugriffe und Abhängigkeiten durch entsprechende Syntaxkonstrukte vereinfachen.
Etabliert haben sich hier zwei derartige Standards: GraphQL basiert auf JSON-Paketen, in denen einen Abfrage formuliert wird. Entsprechend muss fast immer mit POST gearbeitet werden, weil auch bei Abfragen Daten zum Server übermittelt werden. GraphQL erlaubt komplexe Konstrukte und erfordert eine explizite serverseitige Unterstützung. GraphQL ist sehr auf die Web-Welt zugeschnitten und hat in reinen Web-Applikationen Vorteile.

ODATA ist dagegen bei Abfragen URL-basiert und kann GET benutzen. Die Abfragen sind einfacher, vielfältige Filter sind aber auch hier möglich. ODATA ist breiter aufgestellt, wenn es um Umgebungen außerhalb der Web-Welt geht.

Detials zu GraphQL

GarphQL erschien 2015 und hatte von Beginn an starke Unterstützung, weil es eine echte Herausforderung beim Umgang mit REST-Diensten adressiert. Bei komplexeren Systemen, vor allem solchen, die mit Hilfsmitteln wie Swagger definiert werden, explodiert regelmäßig die Anzahl der Endpunkte. Der Dienst wird unübersichtlich und schwer wartbar. Darüber hinaus setzt der Dienst auf eine weitgehende Abstraktion von den Daten und überlässt es dem Client, die Daten zu filtern oder zu sortieren. In Anbetracht starker Datenbanken und großer Datenbestände eine eher schlechte Architektur, die regelmäßig zu Performance-Katastrophen führt.
Ursprünglich in Ruby und Skala geschrieben steht GraphQL als Abfragesprache praktisch auf allen Plattformen zur Verfügung. Immer wenn das führende Format JSON ist, hat GraphQL deutliche Vorzüge gegenüber ODATA, was sich eher im XML-Umfeld wohlfühlt. Die aktuelle Referenzimplementierung ist in JavaScript geschrieben und via npm verfügbar. Der Quellcode ist auf Github zu finden.

Implementierungen

Folgende Umgebungen werden explizit unterstützt:
 C# / .NET
 Clojure
 Elixir
 Erlang
 Go
Groovy
 Java
JavaScript
PHP
Python
Scala
Ruby

Abfragen

Die einfachste Abfrage bei GraphQL fragt nach Feldern eines Objekts. Dies könnte etwa folgendermaßen aussehen:
1 {
2 table_name {
3 field
4 }
5 }
Beachte dabei, dass dies kein gültiges JSON ist – GraphQL ist eine eigene Abfragesprache, die bei Abfragen simplifizierte Konstrukte nutzt. Die Antwort ist dagegen JSON und kann so einfach verarbeitet werden:
1 {
2 "data": {
3 "table_name": {
4 "field": 12345
5 }
6 }
7 }
Neben der vereinfachten Syntax hat GraphQL eine Eigenschaft, die JSON gänzlich fehlt: Kommentare sind erlaubt.
1 {
2 # Die Ressource
3 table_name {
4 # Das Feld
5 field
6 }
7 }

Argumente

Argumente werden direkt an die Namen gesetzt, ohne weitere geschweifte Klammern:
1 {
2 address(id: 1000) {
3 name,
4 city,
5 street
6 }
7 }
Argumente sind auf jeder Ebene möglich, was weitaus flexibler als bei REST ist.
1 {
2 address(id: 1000) {
3 name,
4 city,
5 street,
6 birthday(unit: datetime)
7 }
8 }

Aliase

Ein Feld kann immer nur mit einem Satz Argumente abgerufen werden. Soll dasselbe Feld in unterschiedlicher Weise abgerufen werden, so werden dafür Aliase eingesetzt. Folgende Abfrage bezieht sich auf das Feld hero:
1 {
2 empireHero: hero(episode: EMPIRE) {
3 name
4 }
5 jediHero: hero(episode: JEDI) {
6 name
7 }
8 }
Der Alias empireHero und der Alias jediHero dienen der Unterscheidung. In der Antwort werden die Aliase wiederholt, weil man so die Ergebnisse zuordnen kann:
1 {
2 "data": {
3 "empireHero": {
4 "name": "Luke Skywalker"
5 },
6 "jediHero": {
7 "name": "R2-D2"
8 }
9 }
10 }

Fragmente

Die beim Alias bereits angesprochene einfache Abfragestrategie mit eindeutigen Feldnamen kann bei komplexen Abfragen schnell dazu führen, dass umfangreiche Strukturen wiederholt werden. Dies lässt sich mit Fragmenten entschärfen. Fragmente sind vordefinierte Konstrukte, eingeleitet mit dem Operator … (drei Punkte).
1 {
2 leftComparison: hero(episode: EMPIRE) {
3 …comparisonFields
4 }
5 rightComparison: hero(episode: JEDI) {
6 …comparisonFields
7 }
8 }
9
10 fragment comparisonFields on Character {
11 name
12 appearsIn
13 friends {
14 name
15 }
16 }
comparisonFields ist hier das Fragment, das zweimal (Zeile 3 und Zeile 6) benutzt wird.

Operationen

Bislang wurde davon ausgegangen, dass alles Abfragen sind. Das ist jedoch nicht immer der Fall, denn dynamischere Konstrukte lassen sich mit Variablen bilden. Dazu muss der Dienst aber zwischen einer Definition und einer Abfrage unterscheiden können. Abfragen werden, außer in der bereits gezeigten vereinfachten Form, mit query erstellt.
1 query HeroNameAndFriends {
2 hero {
3 name
4 friends {
5 name
6 }
7 }
8 }
Zulässigen Operationen sind:
 query
 mutation
 subscription
Der Name ist zwingend erforderlich. Er wird jedoch nur zum Loggen auf der Serverseite benutzt, er erscheint nicht in der Antwort und kann deshalb auch nicht zur Referenzierung benutzt werden.

Variablen

Variablen erleichtern die Angabe von sich häufig wiederholenden Daten.
1 query HeroNameAndFriends($episode: Episode) {
2 hero(episode: $episode) {
3 name
4 friends {
5 name
6 }
7 }
8 }
$episode ist hier die Variable. Sie wird in einem separaten Verzeichnis definiert (dort ohne das $-Zeichen):
1 {
2 "episode": "JEDI"
3 }
Der Name für diesen Bereich ist variables:
1 "query": "query ($username: String!){
2 blog {
3 user(username: $username) {
4 username
5 comment
6 }
7 }
8 }",
9 "variables":"{
10 \"username\":\"Joerg\"
11 }"
Dies ist ein Beispiel für serialisiertes JSON, wie es ein Web-Client erzeugt. Die Variable liegt außerhalb der Query-Struktur, aber im selben Paket.
Variablen können Standardwerte haben, die bei fehlender Definition benutzt werden, sodass sich Abfragen allein mittels veränderlicher Variablen robust modifizieren lassen:
1 query HeroNameAndFriends($episode: Episode = "JEDI") {
2 hero(episode: $episode) {
3 name
4 friends {
5 name
6 }
7 }
8 }
Der Vorteil macht sich bemerkbar, wenn man im JavaScript GraphQL-Abfragen zusammenbaut. Dies geht mit Variablen deutlich einfacher als mit den komplexen Zeichenketten-Verknüpfungen, die sonst erforderlich wären.

Direktiven

Direktiven dienen ähnlich wie Variablen dazu, die Abfrage noch dynamischer zu machen und damit den Zusammenbau zu vereinfachen. Folgende Direktiven gibt es:
 @include(if: Boolean)
 @skip(if: Boolean)
Es handelt sich also quasi um Bedingungen. In der folgenden Abfrage bestimmt die Variable withFriends, ob die Eigenschaft friends überhaupt in die Abfrage mit einbezogen wird.
1 query Hero($episode: Episode, $withFriends: Boolean!) {
2 hero(episode: $episode) {
3 name
4 friends @include(if: $withFriends) {
5 name
6 }
7 }
8 }

Mutationen

Mutationen dienen dem Ändern von Daten. Die grundlegende Syntax sieht folgendermaßen aus:
1 mutation CreateReviewForEpisode($ep: Episode!,
2 $review: ReviewInput!) {
3 createReview(episode: $ep, review: $review) {
4 stars
5 commentary
6 }
7 }
Diese Abfrage benötigt folgende Variablen:
1 {
2 "ep": "JEDI",
3 "review": {
4 "stars": 5,
5 "commentary": "This is a great movie!"
6 }
7 }
Hier wird also ein neuer Datensatz erzeugt. Im Ergebnis wird der neue Datensatz zurückgegeben.

Schematas und Typen

Die vorhergehenden Beispiele haben bereits Typen benutzt – sowohl skalare als auch komplexe Typen. Folgende Skalare werden unterstützt:
 Int: Ganzzahl 32 Bit.
 Float: Einfache Gleitkommazahl.
 String: Eine UTF‐8-Zeichenkette.
 Boolean: True oder False.
 ID: Schlüsselwert, wird als Zeichenkette serialisiert
Eigene einfache Typen werden mit scalar erstellt:
scalar Date
Wie ein derartiger Typ behandelt wird, muss in der Implementierung selbst entschieden werden. Ohne weitere Maßnahmen sind dies alles Zeichenketten.
Eigene komplexe Typen können mit type erstellt werden:
1 type Character {
2 name: String!
3 appearsIn: [Episode]!
4 }
Enumerationen (Aufzählungen) sind ebenso möglich, um Wertemengen zu begrenzen:
1 enum Episode {
2 NEWHOPE
3 EMPIRE
4 JEDI
5 }
Um anzuzeigen, dass eine Liste erwartet wird, kann die von JavaScript bekannte Array-Syntax benutzt werden:
field: [String!]
Wird erlaubt, nichts zu übertragen, steht der spezielle Typ null zur Verfügung.
Typen lassen sich von Schnittstellen mit interface ableiten, um die Wartbarkeit komplexer Typsysteme zu erhöhen.
1 interface Character {
2 id: ID!
3 name: String!
4 friends: [Character]
5 appearsIn: [Episode]!
6 }
7
8 type Human implements Character {
9 id: ID!
10 name: String!
11 friends: [Character]
12 appearsIn: [Episode]!
13 starships: [Starship]
14 totalCredits: Int
15 }
16
17 type Droid implements Character {
18 id: ID!
19 name: String!
20 friends: [Character]
21 appearsIn: [Episode]!
22 primaryFunction: String
23 }
Ähnlich wie bei TypeScript lassen sich Typen zu Unions kombinieren. Ein Feld kann dann mehrere Typen aufnehmen, aber keine beliebigen Werte.
1 union SearchResult = Human | Droid | Starship

Beratung & Support

Schulungen zu diesem Thema

 Anfrage für eine individuelle Schulung zum Thema GraphQL  Gesamter Schulungsthemenkatalog

Bücher zu diesem Thema

  Blazor 9.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 9.0, C# 13.0 und Visual Studio 2022
  C# 13.0 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 9.0
  .NET 9.0 Update: Die Neuerungen in .NET 9.0 gegenüber .NET 8.0
  PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
  .NET 8.0 Update: Die Neuerungen in .NET 8.0 gegenüber .NET 7.0
  Blazor 8.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 8.0, C# 12.0 und Visual Studio 2022
  Moderne Datenzugriffslösungen mit Entity Framework Core 8.0
  C# 12.0 Crashkurs
  Cross-Plattform-Apps mit .NET MAUI entwickeln
  Blazor 7.0: Blazor WebAssembly, Blazor Server und Blazor Hybrid
  C# 11.0 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 7.0
  PowerShell 7 und Windows PowerShell 5 – das Praxishandbuch
  App Engineering: SwiftUI, Jetpack Compose, .NET MAUI und Flutter
  Vue.js 3 Crashkurs
  Moderne Datenzugriffslösungen mit Entity Framework Core 6.0
  Blazor 6.0: Blazor WebAssembly, Blazor Server und Blazor Desktop
  C# 10.0 Crashkurs
  Cross-Plattform-Apps mit Xamarin.Forms entwickeln
  Developing Web Components with TypeScript: Native Web Development Using Thin Libraries
  PowerShell – kurz & gut
  C# 9.0 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET 5.0, .NET Core und Xamarin
  ASP.NET Core Blazor 5.0: Blazor WebAssembly und Blazor Server - Moderne Single-Page-Web-Applications
  Windows PowerShell 5 und PowerShell 7: Das Praxisbuch
  Moderne Datenzugriffslösungen mit Entity Framework Core 5.0
  ASP.NET Core Blazor 3.1/3.2: Blazor Server und Blazor Webassembly - Moderne Single-Page-Web-Applications mit .NET, C# und Visual Studio
  ASP.NET Core Blazor 3.0/3.1: Blazor Server und Blazor Webassembly - Moderne Single-Page-Web-Applications mit .NET, C# und Visual Studio
  Moderne Datenzugriffslösungen mit Entity Framework Core 3.1
  C# 8.0 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 3.0
  Windows PowerShell 5.1 und PowerShell Core 6.1 - Das Praxishandbuch
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.1/2.2
  Moderne Webanwendungen für .NET-Entwickler: Server-Anwendungen, Web APIs, SPAs & HTML-Cross-Platform-Anwendungen mit ASP.NET, ASP.NET Core, JavaScript
  C# 7.3 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Modern Data Access with Entity Framework Core: Database Programming Using .NET, .NET Core, UWP, and Xamarin with C#
  Windows PowerShell und PowerShell Core - Der schnelle Einstieg: Skriptbasierte Systemadministration für Windows, Linux und macOS
  Programmierung in Python
  C# 7.2 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.0/2.1
  Effizienter Datenzugriff mit Entity Framework Core: Datenbankprogrammierung mit C# für .NET Framework, .NET Core und Xamarin
  Moderne Datenzugriffslösungen mit Entity Framework Core 2.0
  Windows PowerShell 5 und PowerShell Core 6 - Das Praxishandbuch
  Angular - Das Praxisbuch zu Grundlagen und Best Practices
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.0, 1,1 und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.0, 1,1 und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.1 und 2.0-Preview2
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.x und 2.0
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.x und 2.0
  Introducing Regular Expressions: JavaScript and TypeScript
  Introducing Web Development
  Introducing Bootstrap 4
  Programming Web Applications with Node, Express and Pug
  Einführung in TypeScript: Grundlagen der Sprache TypeScript 2
  Pug – Die Template-Engine für node.js
  Web-Programmierung mit Node, Express und Pug
  Windows PowerShell 5 – kurz & gut
  Moderne Datenzugriffslösungen mit Entity Framework Core 1.1
  Windows PowerShell 5.0 - Das Praxishandbuch
  PHP 7 und MySQL: Von den Grundlagen bis zur professionellen Programmierung
  Windows Scripting Lernen
  .NET Praxis - Tipps und Tricks für .NET und Visual Studio
  Grundlagen für Web-Entwickler: Protokolle, HTML und CSS
  Bootstrap 3 - Stile und Komponenten
  Bootstrap 4 - Stile und Komponenten
  Einführung in JavaScript: ECMAScript 5
  Einführung in node.js
  express – Middleware für node.js
  JADE – Die Template Engine für node.js
  Reguläre Ausdrücke in JavaScript
  Moderne Datenzugriffslösungen mit Entity Framework 6
  C++ Standardbibliothek
  AngularJS: Moderne Webanwendungen und Single Page Applications mit JavaScript
  Microsoft SharePoint Server 2013 und SharePoint Foundation: Das umfassende Handbuch
  SQL Server 2014 für Professionals: Hochverfügbarkeit, Cloud-Szenarien, Backup/Restore, Monitoring & Performance
  Moderne Webanwendungen mit ASP.NET MVC und JavaScript
  Windows PowerShell 4.0 - Das Praxishandbuch
  JavaScript: Das umfassende Handbuch, inkl. HTML5, JavaScript-Frameworks, jQuery, OOP
  C++11 für Programmierer
  C++ kurz und gut
  Microsoft ASP.NET 4.5 - Entwicklerbuch
  Moderne Webanwendungen mit ASP.NET MVC
  Verteilte Systeme und Services mit .NET 4.5
  Scripting mit Windows PowerShell 3.0 - Der Workshop: Skript-Programmierung mit Windows PowerShell 3.0 vom Einsteiger bis zum Profi
  Windows 8 für Administratoren
  Windows 8.1 - Das Handbuch (27. November 2013)
  Windows Store Apps entwickeln mit C# und XAML - Crashkurs
  .NET 4.5 Update
  Windows Scripting Lernen
  WPF 4.5 und XAML
  Datenbankprogrammierung mit .NET 4.5
  C++11: Der Leitfaden für Programmierer zum neuen Standard
  Verteilte Systeme und Services mit .NET 4.0
  Microsoft ASP.NET 4.0 mit C# 2010 - Entwicklerbuch
  Agile Software Engineering with Visual Studio
  Datenbankprogrammierung mit .NET 4.0. Mit Visual Studio 2010 und SQL Server 2008 R2
  Microsoft SharePoint Server 2010 und SharePoint Foundation 2010
  Microsoft SQL Server 2008 R2 - Das Entwicklerbuch
  Microsoft Viusal C# 2010
  Office 2010 Programmierung mit VSTO und .NET 4.0: Word, Excel und Outlook erweitern und anpassen
  Programmieren mit dem ADO.NET Entity Framework
  .NET 4.0 Crashkurs
  Visual Basic 2010: Grundlagen, ADO.NET, Windows Presentation Foundation
  .NET 4.0 Update
  Windows PowerShell 2.0 - Das Praxishandbuch
  Windows 7 im Unternehmen
  Agile Muster und Methoden
  Ajax
  ASP.NET 4.0
  ASP.NET 4.0 mit Visual C# 2010
  JavaScript
  PHP 5-Migration
  Scripting mit Windows PowerShell 2.0 - Der Einsteiger-Workshop
  SQL Server 2008 R2: Das Programmierhandbuch. Inkl. ADO.NET 3.5, LINQ to Entities und LINQ to SQL
  Visual Basic 2010
  Windows PowerShell 2.0 - Crashkurs
  Windows Server 2008 R2
  Windows Scripting
  Windows Scripting Lernen
  Data Mining mit Microsoft SQL Server
  Windows 7 für Administratoren
  Microsoft ASP.NET 3.5 mit Visual Basic 2008 - Entwicklerbuch
  .NET 3.5
  Essential PowerShell
  .NET 3.5 Crashkurs
  Webanwendungen mit ASP.NET 3.5 und AJAX Crashkurs
 Alle unsere aktuellen Fachbücher  E-Book-Abo für ab 99 Euro im Jahr