Ktor上手篇

文章目录

最近在 github 上看到了一个不错的库—— setu,寻思正好可以用这个库里面的数据搭配 ktor 做一个随机的色图 api,帮助上手并了解 ktor

一、准备工作

首先,我们要从数据源下载最新的 json 文件,并将里面的数据导入到数据库中。

由于这个库用来保存色图数据的文件并不符合 json 格式的规范,所以不能直接用工具将整个文件直接导入到数据库中。这里我写了个简单的工具用来解析这个文件并且将文件数据导入到目的数据库,可以到这里查看具体源码。

二、开始

使用 ideaktor 插件可以很方便地创建一个 ktor 项目。来看看 ktor 插件自动给我们生成的代码都是甚摸意思。

build.gradle 文件里,ktor 插件在不勾选其它功能的情况下自动帮我们导入了以下这些依赖,

1
2
3
4
implementation("io.ktor:ktor-server-cio:$ktor_version")
implementation("ch.qos.logback:logback-classic:$logback_version")
implementation("io.ktor:ktor-server-core:$ktor_version")
testImplementation("io.ktor:ktor-server-tests:$ktor_version")

打开配置文件 application.conf

可以看到插件自动帮我们配置了端口号和初始模块。端口号配置的优先级是 命令行参数( java -jar xxx.jar -port=6666 )> 系统环境变量 > 默认端口号。

然后在 application.kt 文件里,

1
fun main(args: Array<String>): Unit = io.ktor.server.cio.EngineMain.main(args)

通过 CIO Enginemain 方法来启动程序。这样,一个最简单的 ktor application 就搭起来了。

当然,我们可以通过 install 方法给这个应用安装一些常用的 feature

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//添加记录日志功能
install(CallLogging) {
    level = Level.DEBUG
    filter { call -> call.request.path().startsWith("/") }
}

//添加默认header
install(DefaultHeaders) {
    header("X-Engine", "NM\$L") // will send this header with each response
}

//添加默认json解析器
install(ContentNegotiation) {
    gson { }
}

然后添加路由,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
routing {
    route("/api") {
        get("setu") {
            val setu = fetchSeTuFromDatabase()
            if (setu != null) {
                call.respond(setu)
            } else {
                call.respondText("Something went wrong.")
            }
        }
    }
}

const val count = 10000//replace with your count here
fun fetchSeTuFromDatabase(): SeTu? {
    var resultRow: ResultRow? = null
    transaction {
        val randomId = Random().nextInt(count) + 1
        resultRow = SeTuTable.select { SeTuTable.id eq randomId }.firstOrNull()
    }
    return if (resultRow == null) {
        null
    } else {
        SeTu().saveBy(resultRow!!)
    }
}

至此,一个可以获取随机色图的 api 就完成了! 完整代码已放在 gtihub 上。

测试一下

打开浏览器,访问 localhost:8080/api/setu ,看能否正常输出 json 格式的 response 即可。

评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue