通过拦截器在查询参数之前添加值

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 的末尾,当我在路径参数之前需要它时

以上是关于通过拦截器在查询参数之前添加值的主要内容,如果未能解决你的问题,请参考以下文章

vue:axios拦截器

Mybatis的sql注入拦截

Spring boot 2 在安全拦截器之前添加拦截器

RTK查询拦截器循环依赖

Vue实现登录拦截

MybatisPlusMP的分页查询多条件查询以及查询过程中解决null的空值判定