kotlin - 改造为所有端点插入相同的查询参数

标签 kotlin retrofit2 okhttp query-string

我有 token 参数要插入到所有 Retrofit 服务中。 目前,所有每个请求,我都插入一个 @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 注入(inject)

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()
}


然后连接依赖注入(inject) Retrofit 和服务

// 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)
}

关于kotlin - 改造为所有端点插入相同的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65940930/

相关文章:

java - Kotlin 的 Flyway 迁移失败

kotlin - 在 kotlin 中可变的列表类型可以在 java 中使用吗?

android - 使用 RxJava2 改造响应代码

android - 使用 Retrofit 2.0 发布二进制数据的正确方法

android - 取消或覆盖在 Espresso 测试下的 Activity 中进行的 API 调用

certificate - 如何使用 OkHttp 启用证书固定

java - 测试时如何从 MockWebServer 中提取参数?

extension-methods - 使扩展方法/属性全局可用

java - 将 Java 泛型转换为 Kotlin 泛型

android - Retrofit响应是一个html代码