Redirect 如何在Ktor内部重定向?
我想知道是否有办法在Ktor内部进行内部重定向、重新路由或响应转发Redirect 如何在Ktor内部重定向?,redirect,response.redirect,ktor,Redirect,Response.redirect,Ktor,我想知道是否有办法在Ktor内部进行内部重定向、重新路由或响应转发 call.respondRedirect("relative/url") 根据permantent:Boolean标志发送HTTP 302或301。我正在寻找一些不使用HTTP也能做到这一点的东西,只是在Ktor内部。以下是我想要实现的一些伪路由: get("/foo") { if (call.parameters["something"] != null) { call.respondText("Ya
call.respondRedirect("relative/url")
根据permantent:Boolean
标志发送HTTP 302或301。我正在寻找一些不使用HTTP也能做到这一点的东西,只是在Ktor内部。以下是我想要实现的一些伪路由:
get("/foo") {
if (call.parameters["something"] != null) {
call.respondText("Yay, something!")
} else {
call.respondRedirect("/bar") // except without relying on client to handle HTTP redirects.
}
}
get("/bar") {
call.respondText("No thing :(")
}
目标是客户端不应该发出2个请求,并且不应该知道发生了重定向
NB:我知道我可以为/bar
的主体提取一个函数并调用它,而不是responsdRedirect
。然而,我想让Ktor处理它,使它通过所有必要的生命周期和所有拦截器的管道。这是为了确保将其作为外部请求处理,网络往返除外。
我正在寻找像Express.js'
req.app.handle(req,res)
这样的东西,如这个答案的前半部分所示:。我还不能理解的一个潜在解决方案是类似于TestApplicationEngine.handleRequest
(在io.ktor:ktor服务器测试主机
)正在使用管道执行。我想我可以调用call.application.execute()
,问题是如何构造ApplicationCall
对象。注意:这是为了生产使用,因此没有TestApplicationCall
您可以在Ktor中使用call.application执行类似的操作。使用克隆的call
对象执行函数。为了方便起见,让我们定义用于执行内部重定向的函数:
suspend fun ApplicationCall.redirectInternally(path: String) {
val cp = object: RequestConnectionPoint by this.request.local {
override val uri: String = path
}
val req = object: ApplicationRequest by this.request {
override val local: RequestConnectionPoint = cp
}
val call = object: ApplicationCall by this {
override val request: ApplicationRequest = req
}
this.application.execute(call)
}
在这里,它创建了一个ApplicationCall
对象的副本,其中包含请求的替换路径。我经常避免使用样板代码。您可以使用如下功能:
get("/foo") {
call.redirectInternally("/bar")
}
我喜欢!当我再次着手这个项目时,我会尝试一下。谢谢分享!我曾尝试过类似问题的解决方案,但得到了以下答案:500内部服务器错误,“请求正文已被使用(接收)”