【问题标题】: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)) 

【问题讨论】:

    标签: android retrofit okhttp interceptor


    【解决方案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 的末尾,当我在路径参数之前需要它时
      猜你喜欢
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多