在 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 中访问请求中的路由路径字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ktor 框架中限制路由访问?

有没有办法在 Ktor 中指定通配符路由?

在 Ktor 客户端中编码 URL

如何使请求绑定的数据在 Ktor 中全局可用?

Ktor 中的特殊字符解析

KTOR - 在 POST 路由中解压缩文件