GraphQL API 与 Kotlin 简介
GraphQL 是由 Facebook 开发的一种 API 查询语言,它允许客户端仅请求他们真正需要的数据。与每个端点返回固定数据结构的 REST 不同,GraphQL 提供了灵活性和控制力。Kotlin 作为一种现代的 JVM 静态类型语言,凭借其简洁性和安全性,非常适合构建此类 API。在本教程中,我们将使用 graphql-kotlin 库和 Spring Boot,逐步创建一个简单的基于 Kotlin 的 GraphQL 服务器。
到本文结束时,您将学会:
- 使用 Gradle 配置 Kotlin 项目
- 定义 GraphQL 模式(类型、查询、变更)
- 实现用于处理查询的解析器
- 通过 GraphQL Playground 测试 API
步骤 1:配置项目与依赖项
首先,我们将使用 Gradle 创建一个新的 Kotlin 项目。我们将使用 Spring Boot 来简化配置,并使用 graphql-kotlin-spring-server 来集成 GraphQL。
创建基础项目
创建项目目录和 build.gradle.kts 文件:
plugins { id("org.springframework.boot") version "3.2.0" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.21" kotlin("plugin.spring") version "1.9.21"}
group = "com.example"version = "0.0.1-SNAPSHOT"
java { sourceCompatibility = JavaVersion.VERSION_17}
repositories { mavenCentral()}
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.1") implementation("com.expediagroup:graphql-kotlin-schema-generator:7.0.1") testImplementation("org.springframework.boot:spring-boot-starter-test")}
tasks.withType { kotlinOptions { freeCompilerArgs += "-Xjsr305=strict" jvmTarget = "17" }} 然后,在 src/main/kotlin/com/example/Application.kt 中创建主应用程序类:
package com.example
import org.springframework.boot.autoconfigure.SpringBootApplicationimport org.springframework.boot.runApplication
@SpringBootApplicationclass Application
fun main(args: Array<String>) { runApplication<Application>(*args)}步骤 2:定义数据模型与 GraphQL 模式
GraphQL 使用强类型。让我们定义一个简单的数据模型——书籍(Book)和作者(Author)。
创建数据类
创建文件 src/main/kotlin/com/example/model/Book.kt:
package com.example.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 nationality: String)graphql-kotlin 库将基于这些 data 类自动生成 GraphQL 类型。每个字段都将成为模式中的一个字段。
查询解析器
现在,创建一个提供数据的服务。创建 src/main/kotlin/com/example/service/BookService.kt:
package com.example.service
import com.example.model.Authorimport com.example.model.Bookimport org.springframework.stereotype.Service
@Serviceclass BookService { private val books = mutableListOf( Book("1", "战争与和平", Author("a1", "列夫·托尔斯泰", "俄罗斯"), 1869), Book("2", "罪与罚", Author("a2", "费奥多尔·陀思妥耶夫斯基", "俄罗斯"), 1866), Book("3", "1984", Author("a3", "乔治·奥威尔", "英国"), 1949) )
fun getAllBooks(): List<Book> = books fun getBookById(id: String): Book? = books.find { it