kotlin - 改造为所有端点插入相同的查询参数
问题描述
我有要在所有改造服务中插入的令牌参数。目前所有每个请求,我插入一个@QueryMap
@GET("resources/{resourceId}")
suspend fun request(
@Path("resourceId") resId: Int,
@QueryMap tokens: Map<String, String>
): Response
这样https://baseurl.com/resources?key1=value1&key2=value2
Map 值是常量 () 例如:key1=value1&key2=value2
现在我有多个端点(和多个服务),如何在所有端点中插入查询参数?(不传入方法)。
OkHttp 似乎可以插入拦截器。
解决方案
感谢@rahat 的链接
OkHttpClient
因此,您可以按照此代码段进行注入
import okhttp3.*
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
fun provideOkHttpClient(): OkHttpClient {
val httpClient = OkHttpClient.Builder()
httpClient.addInterceptor(object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val original: Request = chain.request()
val originalHttpUrl: HttpUrl = original.url
// INTERESTING PART to inject query parameters
val url = originalHttpUrl.newBuilder()
.addQueryParameter("query_key1", "query_value1")
.addQueryParameter("query_key2", "query_value2")
.build()
// INTERESTING PART to inject query parameters
// Request customization: add request headers
val requestBuilder: Request.Builder = original.newBuilder()
.url(url)
val request: Request = requestBuilder.build()
return chain.proceed(request)
}
})
return httpClient.build()
}
然后你连接依赖注入改造和服务
// provide your OkHttpClient
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}
fun provideTrackService(retrofit: Retrofit): YourService {
return retrofit.create(YourService::class.java)
}
推荐阅读
- javascript - HTML 表格导出到 JavaScript 数组
- r - 参考每月退款数据框在交易数据框中查找最终价格
- javascript - 连接对象数组中的字符串
- laravel-livewire - Livewire @entangle
- laravel - 如何使用 laravel 关系从 3 个表中获取值?
- python - 如何获取事件处理函数(tkinter)中的值?
- crystal-reports - ExportToDisk 抛出错误“缺少参数值”
- python - 向所有用户添加onetoone字段,django
- php - MySQL 数据完整性检查。如何在 Laravel 上解码或取消散列 MySQL 密码?
- python - Python按月份将文件名排序为字符串