关于Kotlin的简介

132 阅读4分钟

Kotlin简介 Ktor

Kotlin被用来为不同的平台创建不同的应用程序。服务器端应用程序也不例外。就像Java一样,Kotlin可以用来设置和运行服务器端应用程序。有几个框架可以与Kotlin一起使用。例如,所有与Java一起使用的框架如SpringSpark都支持Kotlin。

还有一些是专门为Kotlin使用的。其中之一就是Ktor。Ktor是由Jetbrains创建的,该公司也是为我们带来Kotlin的开源公司😄。

Ktor用于创建服务器端应用程序,考虑到异步编程。Ktor是轻量级的,并且对轮候线有很好的支持。

它还支持Kotlin多平台;允许跨平台功能。

在这篇文章中,我们将快速了解如何设置一个可靠的Ktor服务。我们将探索使用该框架的应用程序的基本架构。

先决条件

你将需要。

  1. 对Kotlin编程语言的基本了解
  2. 对HTTP方法的基本了解
  3. IntelliJ IDE
  4. Postman或同等软件。

第1步:开始工作

首先要做的是检查IDE是否安装了Ktor插件。它将帮助我们创建一个新的ktor项目。

打开你的IDE,选择 "新项目"。然后转到Ktor部分,创建一个新的ktor项目。确保设置与下面的类似。

starter

我们正在使用GradleNetty引擎来实现我们的服务器功能。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方法。

  1. 添加以下方法来获取所有的记录。
// 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

  1. 要使用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)。然后我们用它来从我们的列表中获取任务。

测试GET http://0.0.0.0:8080/tasks/1的端点

  1. Task 对象添加到我们的列表中。
post {
    val task = call.receive<Task>()
    tasks.add(task)
    call.respondText("Task added successfully", status = HttpStatusCode.Accepted)
}

测试POST:http://0.0.0.0:8080/tasks上的端点。在请求体中传入符合数据类型的所需JSON。

  1. 要使用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)
}

在DELETE:http://0.0.0.0:8080/tasks/1上测试端点。

你可以继续测试Postman上的所有端点。

总结

这就是如何使用ktor创建一个restful服务。它非常容易设置和理解。你可以继续尝试在/tasks 路由中的其他HTTP方法。

注意:路由的路径对字符是敏感的。端点末尾的正斜杠不会被忽略,因此你在创建和测试端点的时候要小心。