gpt4 book ai didi

redirect - 如何在 Ktor 内部重定向?

转载 作者:行者123 更新时间:2023-12-03 20:57:05 24 4
gpt4 key购买 nike

我想知道是否有办法在 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 个请求,并且不应该意识到重定向的发生。

注意:我知道我可以为 /bar 提取一个函数的主体并调用它,而不是 responsdRedirect .但是,我想让 Ktor 处理它,以便它通过所有拦截器完成所有必要的生命周期和管道。这是为了确保将其作为外部请求处理,网络往返除外。

我正在寻找类似 Express.js 的东西 req.app.handle(req, res)如本回答前半部分所示: https://stackoverflow.com/a/48790319/253468 .我还无法理解的潜在解决方案是类似 TestApplicationEngine.handleRequest 的内容。 (在 io.ktor:ktor-server-test-host 中)正在处理 pipeline.execute .我想我可以调用 call.application.execute() ,问题是如何构造 ApplicationCall那么反对。请注意,这是用于生产用途,所以没有 TestApplicationCall .

最佳答案

你可以在 Ktor 中使用 call.application.execute 做类似的事情。克隆函数 call目的。为方便起见,我们定义 extension进行内部重定向的功能:

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 的副本。具有请求的替换路径的对象。我用 delegates避免样板代码。您可以使用 redirectInternally像这样的功能:
get("/foo") {
call.redirectInternally("/bar")
}

关于redirect - 如何在 Ktor 内部重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60443412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com