Ktor 自定义功能交换网址
Posted
技术标签:
【中文标题】Ktor 自定义功能交换网址【英文标题】:Ktor custom feature swap url 【发布时间】:2021-04-26 11:19:39 【问题描述】:我正在尝试在 Ktor 中添加自定义功能。它基本上是一个 url 交换器(我们有一个场景,域可能随时更改并且无法每次都更新客户端)。
我们获得了可用的交换器列表,并且需要 Ktor 中的 CustomFeature 来根据列表交换 url。但是,context.request 或 request.url - 一切都是 val,我无法为请求分配新的 url。
在 Retrofit 中,它曾经是这样工作的
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)
-
去掉
proceedWith(subject)
调用,因为它是多余的。
尝试使用Url
对象而不是字符串。您可以通过克隆 UrlBuilder
并从中构建 Url
来获取当前 URL 而不会影响上下文:context.url.clone().build()
【讨论】:
以上是关于Ktor 自定义功能交换网址的主要内容,如果未能解决你的问题,请参考以下文章