Ktor Routing:如何在 application/api 中分解路由功能?
Ktor Routing: How to factorize the routing functionality in an application/api?
我的问题是关于 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 条路线和控制器功能)。
我会有很多选择:
一个大的路由函数:我会有一个大的Application.routingExample
函数来保存所有的路由,所以我不需要更新主函数。
一个大的主函数:会有一个大的函数来保存对不同的小函数的调用;但它会重复;至于 API 我想
在同一个港口为他们服务。
所以我的问题是关于编码风格:有没有办法分解路由控制器关系?
首先,有一个复杂的 routing 功能,因此您不需要比较请求 URI。
其次,由于路由是 DSL,因此只是代码,您可以提取函数并以您喜欢的任何方式组织代码。一个例子是 KotlinConf backend application. Source code is available here: 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 { … }
}
}
您可以将它们与业务逻辑、支持系统等放在不同的文件、文件夹或包中。
我的问题是关于 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 条路线和控制器功能)。
我会有很多选择:
一个大的路由函数:我会有一个大的Application.routingExample
函数来保存所有的路由,所以我不需要更新主函数。
一个大的主函数:会有一个大的函数来保存对不同的小函数的调用;但它会重复;至于 API 我想 在同一个港口为他们服务。
所以我的问题是关于编码风格:有没有办法分解路由控制器关系?
首先,有一个复杂的 routing 功能,因此您不需要比较请求 URI。
其次,由于路由是 DSL,因此只是代码,您可以提取函数并以您喜欢的任何方式组织代码。一个例子是 KotlinConf backend application. Source code is available here: 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 { … }
}
}
您可以将它们与业务逻辑、支持系统等放在不同的文件、文件夹或包中。