Мне интересно, есть ли способ сделать внутреннее перенаправление, перенаправить или переадресацию ответа внутри Ktor.
call.respondRedirect("relative/url")
отправляет HTTP 302 или 301 в зависимости от флага permantent: Boolean
. Я ищу что-то, что сделало бы то же самое без использования 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)
как показано в первой половине этого ответа: { ссылка }. Потенциальное решение, которое я пока не мог понять, - это то, что TestApplicationEngine.handleRequest
(в io.ktor:ktor-server-test-host
) делает с pipeline.execute
. Я думаю, я мог бы вызвать call.application.execute()
, вопрос в том, как тогда построить объект ApplicationCall
. Обратите внимание, что это для производственного использования, поэтому нет TestApplicationCall
.