kotlin 访问Ktor中请求内的路由路径字符串

oymdgrw7  于 2023-03-03  发布在  Kotlin
关注(0)|答案(5)|浏览(119)

Ktor框架是否提供了在请求中访问路由的路径字符串的方法?
例如,如果我设置了如下路由:

routing {
    get("/user/{user_id}") {
        // possible to get the string "/user/{user_id}" here?
        val path = someFunction()
        assert(path == "/user/{user_id}")
    } 
}

为了说明问题,我正在寻找一种方法来访问未处理的路径字符串,即本例中的"/user/{user_id}"(通过call.request.path()访问路径会得到{user_id}填充后的路径,例如"/user/123")。
当然,我可以将路径赋给一个变量,并将其传递给get,然后在函数体中使用它,但我想知道是否有一种方法可以不这样做就获得路由的路径。

ajsxfq5m

ajsxfq5m1#

我认为这是不可能的。你可以写这样一个类/对象

object UserRoutes {

    const val userDetails = "/users/{user_id}"
    ...

}

并从路由模块中引用该字段:

import package.UserRoutes

get(UserRoutes.userDetails) {...}

通过这样做,你只需要从给定的单例中引用那个字符串,也不需要object Package 器,但是我认为它看起来很整洁,你可以通过它们的模块名来分组路径

uajslkp6

uajslkp62#

我是这样解决的

// 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")
}
w3nuxt5m

w3nuxt5m3#

fun Route.fullPath(): String {
    val parentPath = parent?.fullPath() ?: "/"

    return when (selector) {
        is TrailingSlashRouteSelector,
        is AuthenticationRouteSelector,
        is HttpMethodRouteSelector,
        is HttpHeaderRouteSelector,
        is HttpAcceptRouteSelector -> parentPath
        else -> parentPath.let { if (it.endsWith("/")) it else "$it/" } + selector.toString()
    }
}

route("/user/{id}", HttpMethod.Get) {
    handle {
        val path = this@route.fullPath()
        println(path)
    }
}
xvw2m8pv

xvw2m8pv4#

我找到了解决这个问题的办法

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")
}

试试这个代码,它简单而健壮

ma8fv8wu

ma8fv8wu5#

因此,到目前为止,所有的解决方案都忽略了提取路径变量的最明显(依我拙见--正确)的方法:

routing {
   get("/user/{user_id}") {
       val userId = call.parameters["user_id"]
   } 
}

**call.parameters[“user_id”]将返回类型为String?**的值

您可以有多个路径变量,并通过此方法将它们取出。

相关问题