Ktor自定义功能交换url



我正在尝试在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)
}
}

这样做对吗?

通常是的,这是正确的方法。我有几个建议:

  1. 拦截sendPipeline而不是requestPipeline

一个例子:

client.sendPipeline.intercept(HttpSendPipeline.State) {
context.url(url = newUrl)
}
  1. 取消proceedWith(subject)调用,因为它是多余的
  2. 尝试使用Url对象而不是字符串。通过克隆UrlBuilder并从中构建Url,可以在不影响上下文的情况下获得当前URL:context.url.clone().build()

最新更新