在 Ktor 中访问请求中的路由路径字符串
Posted
技术标签:
【中文标题】在 Ktor 中访问请求中的路由路径字符串【英文标题】:Accessing routing path string within request in Ktor 【发布时间】:2020-09-28 12:31:09 【问题描述】:Ktor 框架是否提供了在请求中访问路由路径字符串的方法?
例如,如果我设置了这样的路线:
routing
get("/user/user_id")
// possible to get the string "/user/user_id" here?
澄清一下,我正在寻找一种方法来访问未处理的路径字符串,即在这种情况下为"/user/user_id"
(通过call.request.path()
访问路径会给我在user_id
填写后的路径,例如"/user/123"
)。
我当然可以将路径分配给一个变量并将其传递给get
并在函数体中使用它,但想知道是否有办法在不这样做的情况下获取路径的路径。
【问题讨论】:
【参考方案1】:我认为这是不可能的。你可以做的是写这样一个类/对象
object UserRoutes
const val userDetails = "/users/user_id"
...
并从您的路由模块中引用该字段:
import package.UserRoutes
get(UserRoutes.userDetails) ...
通过这样做,您只需要从给定的单例中引用该字符串。也不需要object
包装器,但我认为您可以按有点它们的模块名称对路径进行分组
【讨论】:
【参考方案2】:我是这样解决的
// Application.kt
private object Paths
const val LOGIN = "/login"
...
fun Application.module(testing: Boolean = false)
...
routing
loginGet(Paths.LOGIN)
为了构建我的扩展函数,我把它们放在像这样的其他文件中
// Auth.kt
fun Route.loginGet(path: String) = get(path)
println("The path is: $path")
【讨论】:
【参考方案3】:确实可以,而且非常简单。
当您尝试访问/[GET] URL:/users/7
你应该得到完整的路径 -> "users/7"
routing
get("/users/user_id")
val userPath = call.request.path() // This should be your solution // Note: userPath holds "users/7"
call.respond(userPath)
【讨论】:
【参考方案4】:fun Route.fullPath(): String
val parentPath = parent?.fullPath()?.let if (it.endsWith("/")) it else "$it/" ?: "/"
return when (selector)
is TrailingSlashRouteSelector,
is AuthenticationRouteSelector -> parentPath
else -> parentPath + selector.toString()
【讨论】:
【参考方案5】:我找到了解决这个问题的方法
val uri = "foos/foo"
get("$uri/foo_id")
val path = call.request.path()
val firstPart = path.length
val secondPart = path.slice((firstPart+1) until path.length)
call.respondText("$secondPart")
试试这个代码,它既简单又健壮
【讨论】:
以上是关于在 Ktor 中访问请求中的路由路径字符串的主要内容,如果未能解决你的问题,请参考以下文章