Kotlin简介 Ktor
Kotlin被用来为不同的平台创建不同的应用程序。服务器端应用程序也不例外。就像Java一样,Kotlin可以用来设置和运行服务器端应用程序。有几个框架可以与Kotlin一起使用。例如,所有与Java一起使用的框架如Spring和Spark都支持Kotlin。
还有一些是专门为Kotlin使用的。其中之一就是Ktor。Ktor是由Jetbrains创建的,该公司也是为我们带来Kotlin的开源公司😄。
Ktor用于创建服务器端应用程序,考虑到异步编程。Ktor是轻量级的,并且对轮候线有很好的支持。
它还支持Kotlin多平台;允许跨平台功能。
在这篇文章中,我们将快速了解如何设置一个可靠的Ktor服务。我们将探索使用该框架的应用程序的基本架构。
先决条件
你将需要。
- 对Kotlin编程语言的基本了解
- 对HTTP方法的基本了解
- IntelliJ IDE
- Postman或同等软件。
第1步:开始工作
首先要做的是检查IDE是否安装了Ktor插件。它将帮助我们创建一个新的ktor项目。
打开你的IDE,选择 "新项目"。然后转到Ktor部分,创建一个新的ktor项目。确保设置与下面的类似。

我们正在使用Gradle 和 Netty引擎来实现我们的服务器功能。Gradle将处理我们的第三方依赖。
一旦gradle构建完成,打开项目的build.gradle 文件,添加Kotlin序列化插件。这个库是用来将Java对象转换为JSON,反之亦然。你也可以使用Gson或Moshi,但在本文中,我们将使用序列化库。
plugins {
...
id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
}
dependencies {
// Ktor core
implementation "io.ktor:ktor-server-core:$ktor_version"
// Netty
implementation "io.ktor:ktor-server-netty:$ktor_version"
// Ktor serialization support
implementation "io.ktor:ktor-serialization:$ktor_version"
// Serialization
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
}
然后打开application.conf 文件。这个文件配置了我们应用程序的端口和入口点。现在我们只有在Application.kt 文件中找到一个模块。
第2步:设置数据
我们可以使用kotlindata class 来定义我们的数据模型。继续创建一个名为task的文件并添加以下代码。
@Serializable
data class Task(val id: Int, val name: String, val description: String)
Serializable 注解允许序列化库将这个数据类转换为Json,反之亦然。
现在我们将使用一个in-memory 数据库。这意味着,一旦应用程序关闭,我们的数据就会丢失。在Application.kt 文件中加入以下代码。
private val tasks = mutableListOf<Task>()
我们将对这个列表中的数据进行CRUD操作。
第3步:定义路由
路由被添加到模块内的routing lambda。在Application.module 函数中添加以下代码。
fun Application.module(testing: Boolean = false) {
install(ContentNegotiation){json()}
routing {
tasks()
}
// Bootstrap our application
for (i in 0..5)
tasks.add(Task(i, "Task $i", "Work on task $i"))
}
由于我们将以JSON的形式发布数据,我们添加内容协商功能并启用JSON支持。内容协商会检查我们请求中的Accept 头,看服务器是否能处理所使用的数据类型。
一旦服务器启动,我们还在我们的列表中添加一些假记录。
为了解决路由对象中的错误,为Route 对象创建一个扩展函数。这将使我们能够为一个特定的路由创建端点。
fun Route.tasks() {
route("/tasks"){
}
}
在这里,我们创建一个端点/tasks 。然后我们可以在这个路由中传入所需的HTTP方法。
第4步:路径和HTTP方法
你可以将一个端点的路径定义为路由lambda里面的函数,并加上相应的HTTP方法。
- 添加以下方法来获取所有的记录。
// Get all Tasks
get {
if (tasks.isNotEmpty())
call.respond(tasks)
else
call.respondText("No Tasks available", status = HttpStatusCode.NotFound)
}
我们首先检查列表是否为空,以便返回数据,否则,返回错误。call ,它的类型是 ApplicationCall让我们可以访问客户端的请求和响应。
在GET上测试端点:http://0.0.0.0:8080/tasks
- 要使用id获得一个
Task。
// Get one Task
get ("{id}"){
val id = call.parameters["id"]?.toInt()
val task = tasks.find { it.id == id }
if (task == null)
call.respondText("No task with that id exists", status = HttpStatusCode.NotFound)
else
call.respond(task)
}
在这个路径中,我们得到url中传递的id参数。它是以字符串形式接收的,所以我们把它转换成所需的数据类型(Int)。然后我们用它来从我们的列表中获取任务。
- 将
Task对象添加到我们的列表中。
post {
val task = call.receive<Task>()
tasks.add(task)
call.respondText("Task added successfully", status = HttpStatusCode.Accepted)
}
- 要使用id删除一个
Task
delete ("{id}"){
val id = call.parameters["id"]?.toInt()
if (tasks.removeIf{it.id == id})
call.respondText("Task deleted successfully", status = HttpStatusCode.Accepted)
else
call.respondText("No task with that id exists", status = HttpStatusCode.NotFound)
}
你可以继续测试Postman上的所有端点。
总结
这就是如何使用ktor创建一个restful服务。它非常容易设置和理解。你可以继续尝试在/tasks 路由中的其他HTTP方法。
注意:路由的路径对字符是敏感的。端点末尾的正斜杠不会被忽略,因此你在创建和测试端点的时候要小心。