Ktor路由:如何在应用程序/ api中分解路由功能?

o-0*_*o-0 4 kotlin ktor

我的问题是关于Ktor中路由功能背后的全局情况;设计具有大量路由的API时具有很高的可扩展性。

如果我创建这样的应用程序:

import io.ktor.application.*
import io.ktor.response.*
import io.ktor.request.*
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty

fun Application.routingExample() {
 intercept(ApplicationCallPipeline.Call){
   if (call.request.uri == "/") call.respondText("User call for /")
 }
}

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080, watchPaths = listOf("Routing"), module = Application::routingExample).start()
}
Run Code Online (Sandbox Code Playgroud)

如果我的api / app路由数量少,那没关系。但是,我应该以哪种样式将这种方法扩展到大量路由(例如30条路由和控制器功能)。

我将有多种选择:

大型路由功能:我将拥有一个Application.routingExample可以容纳所有路由的大型功能,因此无需更新主路由。

一个大型的主要功能:将有一个大型功能,可以容纳对其他较小功能的调用;但这将是重复的;至于API,我想在同一端口中提供它们。

所以我的问题是关于编码风格的:有没有一种方法可以分解路由控制器的关系?

Ily*_*kov 5

首先,它具有完善的路由功能,因此您无需比较请求URI。

其次,由于路由是DSL,因此仅是代码,因此您可以提取功能并以自己喜欢的任何方式组织代码。一个示例是KotlinConf后端应用程序。源代码可在此处获取:https : //github.com/JetBrains/kotlinconf-app/blob/master/backend/src/org/jetbrains/kotlinconf/backend/Api.kt

看起来像这样:

fun Routing.api(database: Database, production: Boolean) {
    apiKeynote(database, production)
    apiRegister(database, production)
    apiAll(database, production)
    apiSession(database, production)
    apiVote(database, production)
    apiFavorite(database, production)
    wsVotes(database, production)
}
Run Code Online (Sandbox Code Playgroud)

每个函数都是Routing对API端点的扩展并定义了自己的API端点集,如下所示:

fun Routing.apiFavorite(database: Database, production: Boolean) {
    route("favorites") {
        get { … }
        post { … }
        delete { … }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将它们与业务逻辑,支持系统等一起放在不同的文件,文件夹或包中。