gpt4 book ai didi

kotlin - Ktor路由: How to factorize the routing functionality in an application/api?

转载 作者:行者123 更新时间:2023-12-02 02:16:50 24 4
gpt4 key购买 nike

我的问题是关于 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/app,那没问题。但是我应该以什么方式扩展这种方法大量路由(例如 30 条路由和 Controller 功能)。

我有多种选择:

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

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

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

最佳答案

首先,有一个复杂的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 { … }
}
}

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

关于kotlin - Ktor路由: How to factorize the routing functionality in an application/api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48919809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com