我有用于身份验证的自定义拦截器:

@Named("authInterceptor")
    @Provides
    @Singleton
    fun providesAuthInterceptor(preferencesManager: PreferencesManager): Interceptor {
        return Interceptor { chain ->
            val newBuilder = chain.request().newBuilder()
            newBuilder.addHeader("access-token", preferencesManager.getAccessToken())
            val request = newBuilder.build()
            return@Interceptor chain.proceed(request)
        }
    }

但是我有一些不需要auth header 的电话。

我想为我提供的服务是:
interface NetService {
    @NEEDAUTH
    @GET("users")
    fun getAllShops(key: String): Single<SomeResponse>

    @FormUrlEncoded
    @POST("users")
    fun register(@Field("nickname") nickname: String): Single<SomeResponse>
}

因此,第一个调用将使用authInterceptor,第二个调用将不使用它。

最佳答案

从Retrofit 2.6.0版本开始,您可以使用如下标记字段在OkHttp Interceptor中获取批注:

response.request.tag(Invocation::class.java)?.method()?.getAnnotation(YourAnnotation::class.java)

然后,在拦截器内部,您可以验证请求是否带有注释。

改造变更日志:



https://github.com/square/retrofit/pull/2899/files

09-25 21:29