引言
Kotlin 是一种现代编程语言,在后端开发中迅速流行起来。凭借其简洁的语法、与 Java 的完全兼容性以及 Ktor 框架等强大工具,用 Kotlin 编写 REST API 只需 30 分钟。在本文中,我们将创建一个用于管理任务列表的完整 REST API(Todo API)。您将学习如何设置项目、创建端点、连接数据库以及测试 API。没有多余的理论——只有实践。
第一步:项目设置与依赖项
为了快速启动,我们使用 IntelliJ IDEA(社区版)或任何其他编辑器。让我们创建一个带有 Kotlin DSL 的新 Gradle 项目。
创建项目结构
在 build.gradle.kts 文件中添加以下依赖项:
plugins { kotlin("jvm") version "1.9.22" application}
repositories { mavenCentral()}
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") implementation("org.jetbrains.exposed:exposed-core:0.44.1") implementation("org.jetbrains.exposed:exposed-dao:0.44.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1") implementation("com.h2database:h2:2.2.224") implementation("ch.qos.logback:logback-classic:1.4.14")}
application { mainClass.set("ApplicationKt")}我们正在使用:
- Ktor — 一个轻量级的异步 HTTP 服务器框架。
- Exposed — 用于数据库操作的 ORM。
- H2 — 一个用于开发的嵌入式数据库。
- Kotlinx.serialization — 用于处理 JSON。
第二步:创建数据模型并连接数据库
让我们定义任务表的结构。创建文件 Database.kt:
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.insertimport org.jetbrains.exposed.sql.selectAllimport org.jetbrains.exposed.sql.transactions.transaction
object Tasks : Table() { val id = integer("id").autoIncrement() val title = varchar("title", 255) val completed = bool("completed").default(false)
override val primaryKey = PrimaryKey(id)}
data class Task(val id: Int, val title: String, val completed: Boolean)
fun initDatabase() { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { SchemaUtils.create(Tasks) }}这段代码创建了具有三个字段的 Tasks 表:id、title 和 completed。 initDatabase() 函数初始化内存数据库。
第三步:编写 REST API 控制器
现在让我们创建主应用程序文件 Application.kt。在这里,我们将定义所有端点。
基本服务器设置
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.server.request.*import io.ktor.serialization.kotlinx.json.*import io.ktor.server.plugins.contentnegotiation.*
fun main() { embeddedServer(Netty, port = 8080) { install(ContentNegotiation) { json() } initDatabase() configureRouting() }.start(wait = true)}实现 CRUD 端点
fun Application.configureRouting() { routing { // 获取所有任务 get("/tasks") { val tasks = transaction { Tasks.selectAll().map { row -> Task( id = row[Tasks.id],