我有用于身份验证的自定义拦截器:
@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