Java 改装2.0多拦截器
我正在进行改装,需要能够使用多个拦截器。目前,我正在使用一个自动附加身份验证令牌,但我需要能够在没有身份验证令牌的情况下进行调用。如果我添加了另一个头中没有auth令牌的拦截器,我如何使用该拦截器而不是auth令牌拦截器Java 改装2.0多拦截器,java,request,retrofit,okhttp3,Java,Request,Retrofit,Okhttp3,我正在进行改装,需要能够使用多个拦截器。目前,我正在使用一个自动附加身份验证令牌,但我需要能够在没有身份验证令牌的情况下进行调用。如果我添加了另一个头中没有auth令牌的拦截器,我如何使用该拦截器而不是auth令牌拦截器 val interceptor: Interceptor = Interceptor { chain -> val newRequest = chain.request().newBuilder(). addHeader("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)
val拦截器:拦截器=拦截器{chain->
val newRequest=chain.request().newBuilder()。
addHeader(“Auth_标记”,pref.getString(PSPreferences.prefAuthKey,”)。
cacheControl(cacheControl.FORCE_网络)。
构建()
链。继续(新请求)
}
okHttpClient=okHttpClient.Builder()。
readTimeout(1,时间单位为分钟)。
连接超时(1,时间单位为分钟)。
addInterceptor(拦截器).build()
val reformationInstance=reformation.Builder()
.baseUrl(APINDPOInterface.BASE_URL)
.客户(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
apiInterface=instance.create(APIEndpointInterface::class.java)
OkHttpClient
维护一个您可以访问的拦截器列表,但它是一个不可修改的集合
我认为这给我们留下了三个选择:
public class HttpRequestResponseInterceptor implements Interceptor {
public final List<RequestInterceptor> requestInterceptors = new ArrayList<>();
public final List<ResponseInterceptor> responseInterceptors = new ArrayList<>();
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
for (RequestInterceptor interceptor : requestInterceptors) {
request = interceptor.intercept(request);
}
Response response = chain.proceed(request);
for (ResponseInterceptor interceptor : responseInterceptors) {
response = interceptor.intercept(response);
}
return response;
}
public interface RequestInterceptor {
Request intercept(Request request) throws IOException;
}
public interface ResponseInterceptor {
Response intercept(Response response) throws IOException;
}
}
然后,您需要将此拦截器添加到主拦截器两次,一次添加到请求拦截器
,一次添加到响应拦截器
(或者仅添加到其中一个,如果它只截获请求或响应)
这个例子还远远不够完整。此解决方案的好处是,它增加了添加和删除拦截器的能力,而无需重新创建
OkHttpClient
实例。例如,如果您想支持重试请求,则需要额外的工作。嘿,您最终是否解决了这个问题?我在找完全一样的东西。
public class ExampleInterceptor implements HttpRequestResponseInterceptor.RequestInterceptor,
HttpRequestResponseInterceptor.ResponseInterceptor {
@Override
public Request intercept(Request request) throws IOException {
return request.newBuilder().addHeader("REQUEST_HEADER", "EXAMPLE").build();
}
@Override
public Response intercept(Response response) throws IOException {
return response.newBuilder().addHeader("RESPONSE_HEADER", "EXAMPLE").build();
}
}