【问题标题】:Ktor Routing: How to factorize the routing functionality in an application/api?Ktor 路由:如何在应用程序/api 中分解路由功能?
【发布时间】:2018-08-01 20:30:34
【问题描述】:

我的问题是关于 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()
}

如果我有一个路由数量较少的 api/应用程序,这没关系。但是,我应该以哪种风格扩展这种方法 大量路线(例如,30 条路线和控制器功能)。

我会有很多选择:

大型路由函数:我将有一个大型 Application.routingExample 函数来保存所有路由,因此我不需要更新 main。

大型主函数:会有一个大型函数来保存对不同较小函数的调用;但它会是重复的;至于我想要的 API 在同一个港口为他们服务。

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

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    首先,有一个复杂的 routing 功能,因此您无需比较请求 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)
    }
    

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

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

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

    【讨论】:

    • 感谢您的回答。
    • 正是我想要的。太棒了。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 2018-01-28
    • 2022-01-16
    • 2013-10-26
    • 2014-11-25
    • 1970-01-01
    • 2018-11-15
    • 2021-12-12
    相关资源
    最近更新 更多