Sie sind hier:
Lexikon/Glossar
Telefon (Mo-Fr 9-16 Uhr):
0201/649590-0
|
Kontaktformular
MENU
Start
Hauptseite
Angebote im Überblick
Kernkompetenzen
Softwareentwicklung
Beratung
Firmen-Schulungen
Offene Seminare
Online-Maßnahmen
Vorträge
Coaching
Support
Fachbücher
Fachartikel
Konditionen
Themen
Kernkompetenzen
Aktuelle Themen
Web & Cloud
Apps / Mobilplattformen
Benutzeroberflächen / User Experience
.NET
JavaScript / TypeScript
Java
Programmiersprachen
Entwicklungswerkzeuge
Scripting
Softwareengineering
Datenbanken / Reporting / BI
Betriebssysteme & Virtualisierung
Microsoft Server-Produkte
Windows & Office für Anwender
Soft Skills & IT-Recht
Beratung
Beratungsthemen
Coaching
Softwareentwicklung
Technischer Support
Unsere Top-Berater
Referenzkunden
Angebotsanfrage
Individuelle Schulungen
1026 Schulungsthemen
Agendakonfigurator
Weiterbildungsphilosophie
Didaktische Konzepte
Vor Ort oder online
Unsere Top-Trainer
Referenzkunden
Teilnehmerfeedback
Angebotsanfrage
Offene Seminare
.NET-Akademie
.NET/C#-Basisseminar
WPF
WinUI
.NET MAUI
Blazor
ASP.NET WebAPI & gRPC
Entity Framework Core
Unit Testing / TDD
PowerShell
Infotage
Wissen
Übersicht
Fachbücher
Fachartikel
Konferenzvorträge
Konferenzen/Events
Spickzettel
Lexikon/Glossar
Programmcodebibliothek
Versionshistorie
Weblog
Downloads
Newsletter
Community-/Leserportal
Registrierung
.NET/C#/Visual Studio
.NET 10.0
.NET 9.0
.NET 8.0
ASP.NET (Core)/Blazor
PowerShell
Über uns
Kontakt
Selbstdarstellung
Kernkompetenzen
Dr. Holger Schwichtenberg
Top-Experten
Leitung & Kundenteam
Referenzkunden
Kundenaussagen
Referenzprojekte
Partner
Konditionen
Stellenangebote
Weitere Websites
Impressum
Datenschutzerklärung, Haftung, Urheberrecht, Barrierefreiheit
Suche
Themenkatalog
Tag Cloud
Volltextsuche
Site Map
FAQs
Erklärung des Begriffs: GraphQL
Zur Stichwortliste unseres Lexikons
Was ist
GraphQL
?
GraphQL ist eine textbasierte Datenabfragesprache zur Verwendung in
Webservice
s/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 [
https://graphql.org
]
Open Data Protocol
(ODATA) [
http://www.odata.org
]
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
Datenbank
en 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
Objekt
s. 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 …comparison
Field
s
4 }
5 rightComparison: hero(episode: JEDI) {
6 …comparison
Field
s
7 }
8 }
9
10 fragment comparison
Field
s on Character {
11 name
12 appearsIn
13 friends {
14 name
15 }
16 }
comparison
Field
s 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
Variable
n 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.
Variable
n
Variable
n 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.
Variable
n können Standardwerte haben, die bei fehlender Definition benutzt werden, sodass sich Abfragen allein mittels veränderlicher
Variable
n 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
Variable
n deutlich einfacher als mit den komplexen Zeichenketten-Verknüpfungen, die sonst erforderlich wären.
Direktive
n
Direktive
n dienen ähnlich wie
Variable
n dazu, die Abfrage noch dynamischer zu machen und damit den Zusammenbau zu vereinfachen. Folgende
Direktive
n 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
Variable
n:
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 }
Enumeration
en (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
Querverweise zu anderen Begriffen im Lexikon
Open Data Protocol (ODATA)
Enumeration
JavaScript (JS)
TypeScript (TS)
Webservice
Direktive
Datenbank (DB)
Variable
Swagger
Objekt
Python
Groovy
Field
Scala
Liste
.NET (DOTNET)
Ruby
Representational State Transfer (REST)
node.js (node)
JavaScript Object Notation (JSON)
Uniform Resource Locator (URL)
Personal Home Page Tools (PHP)
UCS Transformation Format (UTF)
Extensible Markup Language (XML)
Beratung & Support
Anfrage für Beratung/Consulting zu GRAPHQL
Gesamter Beratungsthemenkatalog
Technischer Support zum GRAPHQL
Schulungen
GraphQL
GraphQL mit .NET
Hasura
Moderne Webservices/Anwendungskopplung/Verteilte Systeme mit WebAPIs (HTTP-APIs/REST/Microservices)
SOAP vs. REST
Vergleich von Angular, React und Vue.js
ASP.NET Core 8.0/9.0/10.0: komplettes Wissen - mit MVC, Razor Pages, Blazor, WebAPIs und gRPC
ASP.NET Core WebAPI 8.0/9.0/10.0: REST Services/HTTP Services/Microservices
Geschäftsanwendungen mit HTML 5.x und JavaScript (oder TypeScript): Moderne Web 2.0-/HTML5-Browser-Webanwendungen und Mobilanwendungen entwickeln
Microservices erstellen und betreiben (mit ASP.NET, ASP.NET Core, Java oder node.js)
React (Entwicklung von Single Page Web Applications mit React)
Serviceorientierte Architekturen (SOA)
Webservices/Verteilte Systeme, SOAP und REST mit .NET (ASP.NET Core WebAPI, SignalR, CoreWCF, gRPC)
Anfrage für eine individuelle Schulung zum Thema GRAPHQL
Gesamter Schulungsthemenkatalog
Fachbücher
Blazor 10.0: Moderne Webanwendungen und hybride Cross-Platform-Apps mit .NET 10.0, C# 14.0 und Visual Studio 2026
C# 14.0 Crashkurs
Moderne Datenzugriffslösungen mit Entity Framework Core 10.0
.NET 10.0 Update: Die Neuerungen in .NET 10.0 gegenüber .NET 9.0
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
Cross-Plattform-Apps mit .NET MAUI entwickeln
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
Concurrency with Modern C++: What every professional C++ programmer should know about concurrency
C++20: Get the Details
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
App-Entwicklung für Mobile und Desktop: Software Engineering mit .NET MAUI und Comet für iOS, Android, Windows und macOS
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
C++ Core Guidelines Explained: Best Practices for Modern C++
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
Alle unsere aktuellen Fachbücher
E-Book-Abo für ab 99 Euro im Jahr