【发布时间】: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>
}
发送请求后,响应正文为空,这是
【问题讨论】:
-
为什么不只是
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 上提供的任何查询参数。