改造默认查询参数

Retrofit default query parameter

我有一个 apikey“令牌”,必须在每个请求中作为查询参数提供。 我如何设置改造以始终在请求中包含此查询参数?

我目前提供令牌作为默认参数:

interface CompanyService {

    @GET("accounts/{id}")
    fun getCompany(
            @Path("id") id: Number,
            @Query("token") token: String = Constants.TOKEN) <---- here
            : Call<CompanyResponse>

    @GET("accounts/")
    fun getCompanies(
        @Query("id") page: String,
        @Query("limit") limit: Int,
        @Query("sort") sort: String = "id",
        @Query("token") token: String = Constants.TOKEN) <---- here
            : Call<CompanyListResponse>
}

但是因为我知道每个请求都需要相同的令牌,所以在我创建的每个请求函数中必须将它作为默认参数提供是多余的。我如何设置改造以使用默认查询参数装饰每个传出请求?

这就是我构建 retrofit2 实例的方式:

class CompanyAPI {
    companion object {
        private var retrofit: Retrofit? = null
        val client:Retrofit get() {
            if (retrofit == null) {
                retrofit=Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl(Constants.BASE_URL)
                    .build()
            }
            return retrofit!!
        }
    }
}

我认为您会在调用 .build() 之前在调用链中添加一些额外的函数调用,但是查看可用函数我不能说我看到任何可以提供此功能的东西。

您需要向其添加一个拦截器并在您的 Builder 中传递客户端,如下所示:

retrofit=Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl(Constants.BASE_URL)
    .client(
        OkHttpClient.Builder()
            .addInterceptor { chain ->
                val url = chain
                    .request()
                    .url()
                    .newBuilder()
                    .addQueryParameter("token", Constants.TOKEN)
                    .build()
                chain.proceed(chain.request().newBuilder().url(url).build())
            }
            .build()
    )
    .build()

使用您的默认参数将拦截器添加到您的 http 客户端或 headers 这里是如何添加它的示例 :-

OkHttpClient.Builder httpClient =  
new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {  
@Override
public Response intercept(Chain chain)
throws IOException {
    Request original = chain.request();
    HttpUrl originalHttpUrl = original.url();

    HttpUrl url = originalHttpUrl.newBuilder()
            .addQueryParameter("apikey", "your-actual-api-key")
            .build();

    // Request customization: add request headers
    Request.Builder requestBuilder = original.newBuilder()
            .url(url);

    Request request = requestBuilder.build();
    return chain.proceed(request);
}
});

refrence