java改造2.0多拦截器
我正在进行改装,需要能够使用多个拦截器。目前,我正在使用一个自动附加身份验证令牌,但我需要能够在没有身份验证令牌的情况下进行调用。如果我添加了另一个头中没有auth令牌的拦截器,我如何使用该拦截器而不是auth令牌拦截器
val interceptor: Interceptor = Interceptor { chain ->
val newRequest = chain.request().newBuilder().
addHeader("Auth_Token", pref.getString(PSPreferences.prefAuthKey, "")).
cacheControl(CacheControl.FORCE_NETWORK).
build()
chain.proceed(newRequest)
}
okHttpClient = OkHttpClient.Builder().
readTimeout(1, TimeUnit.MINUTES).
connectTimeout(1, TimeUnit.MINUTES).
addInterceptor(interceptor).build()
val retrofitInstance = Retrofit.Builder()
.baseUrl(APIEndpointInterface.BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
apiInterface = retrofitInstance.create<APIEndpointInterface>(APIEndpointInterface::class.java)
# 1 楼答案
OkHttpClient
维护一个可以访问的拦截器列表,但它是一个不可修改的集合这给我们留下了三个选择,我相信:
创建两个OkHttpClient实例,并通过两个改进 实例,一个用于未经验证的请求,另一个用于 经过验证的请求
检查您是否应该使用拦截器,例如,在您的身份验证拦截器中,您可以首先检查您的令牌首选项中是否存在密钥,如果存在,请使用它;如果没有,您只需继续,而不需要修改任何内容。你这样做也是为了你的未经验证的拦截程序。我认为这是最简单的解决方案
创建一个拦截器,它将维护一个可修改的列表 你可以随意添加和删除的拦截器。你需要 要保留对该拦截器的引用,可以将其设置为Singleton
对于第三个选项,我提供了一个非常简单的示例:
在这种情况下,您需要实现定制接口
RequestInterceptor
和ResponseInterceptor
这些接口的实现是什么样子的示例:
然后,您需要将这个拦截器添加到我们的主拦截器中两次,一次添加到
requestInterceptors
,一次添加到responseInterceptors
(如果它只截取请求或响应,则只添加到其中一个)这个例子还远远不够完整。这个解决方案的好处是,它增加了添加和删除拦截器的能力,而无需重新创建
OkHttpClient
实例。例如,如果您想支持重试请求,则需要额外的工作