Redirect 如何在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

我想知道是否有办法在Ktor内部进行内部重定向、重新路由或响应转发

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内部服务器错误,“请求正文已被使用(接收)”