我试图在 Ktor 中添加自定义功能。它基本上是一个 url 交换器(我们有一个场景,域可能随时更改,并且无法每次都更新客户端)。
我们获得了可用的交换器列表,并且需要 Ktor 中的 CustomFeature 来根据列表交换 url。但是, context.request 或 request.url - 一切都是 val 并且我无法为请求分配新的 url。
在改造中,它曾经像这样工作
if (currentUrl.contains(urlSwapper.oldUrl)) {
val newUrl = currentUrl.replace(urlSwapper.oldUrl, urlSwapper.newUrl)
val newHttpUrl = request.url.newBuilder(newUrl)!!.build()
// build a new request with the new url. replace it
request = request.newBuilder().url(newHttpUrl).build()
break
}
}
在 Ktor 功能中,我正在尝试这样的事情
scope.requestPipeline.intercept(HttpRequestPipeline.Transform) {
val currentUrl =
context.url.protocol.name + "://" + context.url.host + context.url.encodedPath
for (urlSwapper in feature.urlSwappers) {
if (currentUrl.contains(urlSwapper.oldUrl)) {
val newUrl = currentUrl.replace(urlSwapper.oldUrl, urlSwapper.newUrl)
val newHttpUrl = Url(newUrl)
context.url(url = newHttpUrl)
break
}
}
proceedWith(subject)
}
}
这是正确的方法吗?