Einleitung: Warum GraphQL und Kotlin?
\nIn der modernen Webentwicklung kann die Wahl des richtigen Ansatzes zur Erstellung einer API über den Erfolg des gesamten Projekts entscheiden. GraphQL, entwickelt von Facebook, bietet eine flexible Alternative zu REST, indem es Clients ermöglicht, nur die Daten anzufragen, die sie wirklich benötigen. Und Kotlin, eine moderne Programmiersprache für die JVM, fügt dem Ganzen Prägnanz, Null-Sicherheit und leistungsstarke Unterstützung für Coroutinen hinzu.
\nIn diesem Tutorial erstellen wir praktisch eine vollwertige GraphQL-API mit Kotlin und dem Framework graphql-kotlin-spring-server. Sie erfahren, wie Sie den Server konfigurieren, das Datenschema definieren, Resolver schreiben und die API testen. Am Ende des Artikels können Sie GraphQL eigenständig in Ihre Kotlin-Projekte integrieren.
1. Projekteinrichtung und Abhängigkeiten
\nZunächst erstellen wir ein neues Projekt mit Spring Boot und GraphQL-Unterstützung. Wir verwenden Gradle als Build-System.
\n\n1.1. Erstellung der grundlegenden Struktur
\nErstellen Sie ein neues Projekt in IntelliJ IDEA oder über Spring Initializr. Fügen Sie die folgenden Abhängigkeiten in build.gradle.kts hinzu:
plugins {\n id("org.springframework.boot") version "3.2.0"\n id("io.spring.dependency-management") version "1.1.4"\n kotlin("jvm") version "1.9.21"\n kotlin("plugin.spring") version "1.9.21"\n}\n\ndependencies {\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.1")\n implementation("org.jetbrains.kotlin:kotlin-reflect")\n implementation("org.jetbrains.kotlin:kotlin-stdlib")\n testImplementation("org.springframework.boot:spring-boot-starter-test")\n}\n\n1.2. Anwendungskonfiguration
\nErstellen Sie die Datei application.yml in src/main/resources:
server:\n port: 8080\n\ngraphql:\n packages:\n - "com.example.graphqldemo"\n schema:\n introspection-enabled: true\n exception-handlers-enabled: true\nDies ist die Basiskonfiguration. Der Parameter introspection-enabled: true ermöglicht die Verwendung von GraphiQL zum Testen.
2. Definition des GraphQL-Schemas
\nIn graphql-kotlin wird das Schema automatisch auf Basis Ihrer Datenklassen (data classes) erstellt. Dies ist einer der Hauptvorteile – Sie müssen keine separate SDL-Datei schreiben.
2.1. Erstellung des Datenmodells
\nAngenommen, wir erstellen eine API für eine Bibliothek von Büchern. Definieren wir die Modelle:
\npackage com.example.graphqldemo.model\n\ndata class Book(\n val id: String,\n val title: String,\n val author: Author,\n val year: Int,\n val genre: String\n)\n\ndata class Author(\n val id: String,\n val name: String,\n val books: List<Book> = emptyList()\n)\n\n// Input-Typen für Mutationen\ndata class BookInput(\n val title: String,\n val authorId: String,\n val year: Int,\n val genre: String\n)\n\n2.2. Service für die Datenverarbeitung
\nErstellen wir einen einfachen In-Memory-Service, der die Daten speichert:
\npackage com.example.graphqldemo.service\n\nimport com.example.graphqldemo.model.Author\nimport com.example.graphqldemo.model.Book\nimport com.example.graphqldemo.model.BookInput\nimport org.springframework.stereotype.Service\nimport java.util.UUID\n\n@Service\nclass LibraryService {\n private val authors = mutableListOf(\n Author("1", "Joanne K. Rowling"),\n Author("2", "George Orwell")\n )\n private val books = mutableListOf(\n Book("1", "Harry Potter und der Stein der Weisen", authors[0], 1997, "Fantasy"),\n Book("2", "1984", authors[1], 1949, "Dystopie")\n )\n\n fun getBooks(): List<Book> = books\n fun getBookById(id: String): Book? = books.find { it.id == id }\n fun getAuthors(): List<Author> = authors\n fun addBook(input: BookInput): Book {\n val author = authors.fin