Was ist GraphQL?
GraphQL ist eine Open-Source-Abfragesprache für APIs, die ursprünglich von Facebook im Jahr 2012 entwickelt und 2015 der Öffentlichkeit zugänglich gemacht wurde. Es bietet eine flexible und effiziente Alternative zu traditionellen REST APIs, indem es Clients ermöglicht, nur die spezifischen Daten anzufordern, die sie benötigen. Dies löst Probleme des Überladens und des Unterladens, die oft bei REST APIs auftreten.
Einer der Gründe für die wachsende Beliebtheit von GraphQL ist seine klientgesteuerte Natur. Dies macht es besonders gut geeignet für moderne Anwendungen, bei denen Leistung, Skalierbarkeit und nahtlose Benutzererfahrungen entscheidend sind. GraphQL ermöglicht es Clients, mehrere Ressourcen in einer einzigen Anfrage zu kombinieren, was den Netzwerkverkehr reduziert und es zu einer ausgezeichneten Lösung für mobile Apps mit begrenzter Bandbreite oder komplexen Front-End-Anforderungen macht.
Wichtige Unternehmen wie GitHub, Twitter, Indeed und Shopify haben GraphQL übernommen und heben sein Potenzial zur Optimierung der API-Entwicklung und Verbesserung der Client-Server-Interaktionen hervor.
GraphQL-Schnittstelle
In GraphQL funktioniert eine Schnittstelle ähnlich wie Schnittstellen in der objektorientierten Programmierung. Es handelt sich um einen abstrakten Typ, der eine Reihe von gemeinsamen Feldern definiert, die von mehreren Objekttypen implementiert werden können. Dies stellt sicher, dass der Client diese gemeinsamen Felder über verschiedene Typen hinweg sicher abfragen kann.
type Query {
findVehicles(): [Vehicle!]!
}
interface Vehicle {
id: ID!
name: String!
model: String
}
type Car implements Vehicle {
id: ID!
name: String!
model: String
# Specific to Car
fuelType: String!
}
type Bicycle implements Vehicle {
id: ID!
name: String!
model: String
# Specific to Bicycle
gearCount: Int!
isElectric: Boolean!
}
GraphQL-Clientabfrage:
query findVehicles() {
findVehicles() {
vehicle {
id,
name,
model,
... on Car {
fuelType
}
... on Bicycle {
gearCount,
isElectric
}
}
}
}
In diesem Beispiel sind die gemeinsamen Felder wie id
, name
und model
in allen Objekttypen verfügbar, die das Vehicle
-Interface implementieren. Die typspezifischen Felder wie fuelType
für Car
und gearCount
und isElectric
für Bicycle
können jedoch mithilfe von Fragmenten abgefragt werden.
Wenn der Client nur gemeinsame Felder benötigt, können die Fragmente ausgelassen werden:
query findCars() {
findCars() {
car {
id,
name,
model
}
}
}
Vorteile der Verwendung von Schnittstellen
- Code-Wiederverwendbarkeit: Gemeinsame Felder können im Interface definiert und über mehrere Typen hinweg gemeinsam genutzt werden, was Redundanzen reduziert.
- Vereinfachte Client-seitige Logik: Clients benötigen keine bedingten Prüfungen für Objekttypen. Sie können exakte Typen anfordern und Antworten sicher verarbeiten.
- Schema-Erweiterbarkeit: Das Hinzufügen eines neuen gemeinsamen Feldes wird einfacher, da es nur im Interface definiert werden muss.
- Durchgesetzte Struktur: Schnittstellen erzwingen eine gemeinsame Struktur über alle implementierenden Typen hinweg und gewährleisten so Konsistenz (z.B. müssen alle Fahrzeuge eine
id
,name
undmodel
haben). - Vereinheitlichte Abfrage: Anstatt verschiedene Typen einzeln abzufragen, können Clients über eine einzige Schnittstelle Daten aus allen implementierenden Typen abfragen.
- Verbesserte Dokumentation: Durch die Definition gemeinsamer Verhaltensweisen über Schnittstellen wird es für API-Verbraucher einfacher, verwandte Typen zu verstehen und damit zu arbeiten.
GraphQL Union
Eine Union in GraphQL ist ein abstrakter Typ, der es Clients ermöglicht, mehrere Objekttypen abzufragen, die in irgendeinem Aspekt miteinander verbunden sind, über ein einziges Feld. Im Gegensatz zu Schnittstellen erfordern Unions nicht, dass die Mitgliedstypen gemeinsame Felder teilen. Dies macht Unions ideal für den Umgang mit Fällen, in denen verwandte Typen unterschiedliche Strukturen aufweisen, aber zusammen abgefragt werden müssen.
type Query {
getPurchaseItems(): [PurchaseItem!]!
}
union PurchaseItem = Product | Service | Subscription
type Product {
id: ID!
productName: String!
price: Float!
}
type Service {
id: ID!
serviceName: String
duration: Float
}
type Subscription {
id: ID!
planName: String
billingCycle: String
}
GraphQL-Clientabfrage:
query getPurchaseItems() {
getPurchaseItems() {
purchaseItems {
... on Product {
id
productName
price
}
... on Service {
id
serviceName
duration
}
... on Subscription {
id
planName
billingCycle
}
}
}
}
In diesem Beispiel sind Produkt, Dienstleistung und Abonnement allesamt unterschiedliche Typen, die zur Union PurchaseItem gehören. Der Client kann alle drei Typen mithilfe von Fragmenten in einer einzigen Abfrage abfragen, obwohl sie keine Felder teilen.
Wichtiger Hinweis zu Unions: Die Mitgliedstypen eines Union-Typs müssen alle Objekt-Basistypen sein; Skalar-, Schnittstellen- und Union-Typen dürfen keine Mitgliedstypen einer Union sein. Ebenso dürfen Umhüllungstypen keine Mitgliedstypen einer Union sein.
Vorteile der Verwendung von Unions
- Flexibles Gruppieren: Unions ermöglichen die Abfrage von verwandten Typen, die keine gemeinsamen Felder teilen, was sonst umständlich zu handhaben wäre.
- Vereinfachte Fehlerbehandlung: Clients können Fragmente verwenden, um spezifische Typen abzufragen und so die Notwendigkeit für komplexe bedingte Logik auf der Clientseite zu reduzieren.
- Behandlung heterogener Daten: Eine einzige Abfrage kann Daten von mehreren Typen abrufen und so die Handhabung unterschiedlicher Datenstrukturen vereinfachen.
- Nützlich für Fehlerantworten: Unions sind besonders nützlich, wenn Sie Erfolgsantworten und Fehlerdetails in einem einzelnen Antworttyp kombinieren möchten, sodass Clients sie effizient verarbeiten können.
Zusammenfassend
GraphQL-Schnittstellen und Unions bieten leistungsstarke Möglichkeiten zur Strukturierung Ihres GraphQL-Schemas, die Flexibilität ermöglichen und die Client-Server-Interaktionen vereinfachen. Schnittstellen ermöglichen gemeinsame Felder über Typen hinweg und fördern die Code-Wiederverwendbarkeit sowie einfachere Schema-Erweiterungen. Unions bieten hingegen die Möglichkeit, unterschiedliche Typen abzufragen, ohne gemeinsame Felder zu benötigen.
Source:
https://dzone.com/articles/a-beginners-guide-to-graphql-interfaces-and-unions