通过拦截器在查询参数之前添加值
Posted
技术标签:
【中文标题】通过拦截器在查询参数之前添加值【英文标题】:Add value before query params via interceptor 【发布时间】:2021-08-19 07:29:22 【问题描述】:我有一个 id,我应该将它添加到每个 url 的路径中,这是我通过拦截器完成的。
val newRequest = chain.request().newBuilder()
newRequest.url(chain.request().url.toString() + "/" + id)
return chain.proceed(newRequest.build())
带有查询参数的第一个端点出现问题。所以有了这段代码,我得到了
MY_BASE_URL?query_param_1=value1&query_param_2=value2/ID
但应该是的
MY_BASE_URL/ID?query_param_1=value1&query_param_2=value2
有什么好办法解决这个问题吗?
附言
有一个 hacky 解决方案,但希望有更好的解决方案。
newRequest.url(chain.request().url.toString().replace("?", "/" + userId.toString() + "?", true))
【问题讨论】:
【参考方案1】:HttpUrl 有几种获取 URL 特定部分的方法,例如主机、路径和查询。你可以做类似的事情
val url = chain.request().url
val newUrl = url.scheme()+"://"+url.host()+url.encodedPath()+"/"+userId.toString()
如果有,则将 url.query() 附加到末尾。如果需要,还可以考虑添加 url.port() 和 url.encodedFragment()。
【讨论】:
【参考方案2】:尝试将 HttpUrl 转换为可以操作的 Builder。
val newUrl = chain.request().url
.newBuilder()
.addPathSegment("ID")
.build()
val newRequest = chain.request()
.newBuilder()
.url(newUrl)
.build()
chain.proceed(newRequest)
【讨论】:
这是个好主意,但当我有路径参数时将无法使用。我的 id 将出现在 url 的末尾,当我在路径参数之前需要它时以上是关于通过拦截器在查询参数之前添加值的主要内容,如果未能解决你的问题,请参考以下文章