【问题标题】:Accessing routing path string within request in Ktor在 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 并在函数体中使用它,但想知道是否有办法在不这样做的情况下获取路径的路径。

【问题讨论】:

    标签: kotlin ktor


    【解决方案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")
            }
            

            试试这个代码,它既简单又健壮

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-10
              • 1970-01-01
              • 1970-01-01
              • 2021-11-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多