Einführung in GraphQL und Kotlin
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, nur die Daten zu erhalten, die sie wirklich benötigen. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Struktur zurückgibt, bietet GraphQL Flexibilität: Eine einzige Abfrage kann Daten aus verschiedenen Quellen kombinieren. Kotlin wiederum ist eine moderne Sprache für die JVM, die Prägnanz und Typsicherheit vereint. In diesem Tutorial erstellen wir eine vollständige GraphQL-API mit Kotlin und der Bibliothek graphql-kotlin-spring-server.
Sie erfahren, wie Sie das Projekt einrichten, das Schema definieren, Resolver schreiben und die API über GraphiQL testen. Bereit? Los geht's!
1. Projekteinrichtung
1.1. Erstellen einer Spring Boot-Anwendung
Erstellen Sie zunächst ein neues Projekt auf Spring Initializr. Wählen Sie:
- Project: Gradle (Kotlin)
- Language: Kotlin
- Spring Boot: 3.2+
- Dependencies: Spring Web, Spring Boot DevTools
Fügen Sie nach dem Herunterladen die GraphQL-Abhängigkeit in build.gradle.kts hinzu:
dependencies { implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.0") implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") testImplementation("org.springframework.boot:spring-boot-starter-test")}1.2. Anwendungskonfiguration
Erstellen Sie die Datei application.yml in src/main/resources:
server: port: 8080
graphql: packages: - "com.example.graphql.demo"Dies weist Spring Boot an, das Paket com.example.graphql.demo nach Resolvern und Typen zu durchsuchen.
2. Definition des GraphQL-Schemas
2.1. Erstellen des Datenmodells
Erstellen wir ein einfaches Modell für ein Buch und einen Autor. In Kotlin verwenden wir data class:
// src/main/kotlin/com/example/graphql/demo/model/Book.ktpackage com.example.graphql.demo.model
data class Book( val id: String, val title: String, val author: Author, val year: Int)
data class Author( val id: String, val name: String, val books: List<Book> = emptyList())2.2. Schema-Definition über Code (SDL)
Anstatt eine schema.graphqls-Datei zu schreiben, verwenden wir die Annotationen @GraphQLDescription und @GraphQLIgnore. Die Bibliothek graphql-kotlin generiert das Schema automatisch basierend auf den Klassen. Zur Verdeutlichung erstellen wir jedoch eine Datei schema.graphqls in src/main/resources:
type Query { books: [Book!]! book(id: String!): Book authors: [Author!]!}
type Mutation { addBook(title: String!, authorId: String!, year: Int!): Book!}
type Book { id: String! title: String! author: Author! year: Int!}
type Author { id: String! name: String! books: [Book!]!}3. Implementierung der Resolver
3.1. Service für die Datenspeicherung
Der Einfachheit halber verwenden wir einen In-Memory-Speicher:
// src/main/kotlin/com/example/graphql/demo/service/LibraryService.ktpackage com.example.graphql.demo.service
import com.example.graphql.demo.model.Authorimport com.example.graphql.demo.model.Bookimport org.springframework.stereotype.Serviceimport java.util.UUID
@Serviceclass LibraryService { private val authors = mutableListOf( Author(id = "1", name = "George Orwell"), Author(id = "2", name = "Ray Bradbury") )
private val books = mutableListOf( Book(id = "1", title = "1984", author = authors[0], year = 1949), Book(id = "2", title = "Fahrenheit 451", author = authors[1], year = 1953) )
fun getBooks(): List<Book> = books