【问题标题】:Retrofit Interceptor not adding query param to URL改造拦截器未将查询参数添加到 URL
【发布时间】:2019-08-10 12:28:51
【问题描述】:

我正在尝试使用自定义 interceptor 在 URL 中添加 apikey,但它没有在 URL 中添加参数,因此响应正文为空。

自定义拦截器

class CustomInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {

        val url = chain.request().url().newBuilder()
            .addQueryParameter("apiKey", API_KEY)
            .build()

        val request = chain.request().newBuilder()
            .url(url)
            .build()

        return chain.proceed(request)
    }
}

客户

class Client {

    companion object {

        const val API_KEY = "123123"
        private const val apiUrl = "https://www.omdbapi.com/"

        fun <T> create(service: Class<T>): T {
            val client = OkHttpClient.Builder()
                .addInterceptor(CustomInterceptor())
                .build()

            return Retrofit.Builder()
                .baseUrl(apiUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build()
                .create(service)
        }
    }
}

IMovie

interface IMovie {

    @GET("/")
    fun searchMovie(@Query("s") query: String): Call<SearchResult>
}

发送请求后,响应正文为空,这是

实际网址:- https://www.omdbapi.com/?s=Man

预期网址:- https://www.omdbapi.com/?s=Man&apikey=123123

【问题讨论】:

  • 为什么不只是 val request = chain.request().newBuilder() .addQueryParameter("apiKey", API_KEY) .build() ?为什么是两个建造者?
  • 嗯.. 它没有按照你的建议工作。
  • 我只通过拦截器添加了标头,而不是查询参数。 Retrofit 可能会简单地忽略任何预先建立的查询参数。您可以查看改造问题跟踪器,看看是否有任何关于此类事情的讨论。
  • val request = chain.request().newBuilder() .addQueryParameter("apiKey", API_KEY) .build().addQueryParameter 上显示错误
  • 啊,我知道我哪里出错了——你的第一个构建器是HttpUrl.Builder,而不是Request.Builder。我为那个错误道歉。这加强了我的猜测,即 Retrofit 只是忽略了请求 URL 上提供的任何查询参数。

标签: android kotlin retrofit


【解决方案1】:

首先从现有请求创建一个新的 httpUrl 实例,添加您的查询参数和值:

var request = chain.request()

val httpUrl = request.url().newBuilder().addQueryParameter("token", authToken).build()

然后更新请求:

request = request.newBuilder().url(httpUrl).build()

然后继续:

return chain.proceed(request)

  • 当您从链中调用请求(您在操作后继续执行的请求)时,您将再次获得未修改的请求。

【讨论】:

  • 当我更新版本时它工作了。但是,当我注销 URL 时,它仍然显示相同的 URL。
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多