1.将拦截器添加到ArrayList
final class RealCall implements Call {Response getResponseWithInterceptorChain() throws IOException {//将Interceptor添加到ArrayListList<Interceptor> interceptors = new ArrayList<>();interceptors.addAll(client.interceptors());interceptors.add(new RetryAndFollowUpInterceptor(client));interceptors.add(new BridgeInterceptor(client.cookieJar()));interceptors.add(new CacheInterceptor(client.internalCache()));interceptors.add(new ConnectInterceptor(client));if (!forWebSocket) {interceptors.addAll(client.networkInterceptors());}interceptors.add(new CallServerInterceptor(forWebSocket));//第一次的index为0Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0, originalRequest, this, client.connectTimeoutMillis(),client.readTimeoutMillis(), client.writeTimeoutMillis());//执行请求后,得到结果Response response = chain.proceed(originalRequest);return response;}
}
2.拦截器的执行-责任链模式
public final class RealInterceptorChain implements Interceptor.Chain {private final int index; //当前运行的Interceptor在ArrayList的索引public Response proceed(Request request, Transmitter transmitter, @Nullable Exchange exchange)throws IOException {//每次index都基于上次的index +1,这样每次取得的就是下一个拦截器RealInterceptorChain next = new RealInterceptorChain(interceptors, transmitter, exchange, index + 1, request, call, connectTimeout, readTimeout, writeTimeout);Interceptor interceptor = interceptors.get(index);//执行拦截器的方法的时候,携带了RealInterceptorChain作为参数,这样可以//调用这个chain的proceedResponse response = interceptor.intercept(next);return response;}
}
3.总结
按照责任链模式执行拦截器
拦截器的执行顺序:
RetryAndFollowUpInterceptor:执行下一个拦截器,针对结果或者处理过程中的异常来进行重试或者重定向;
BridgeInterceptor:补充headers;执行下一个拦截器;处理返回的response;
CacheInterceptor:结果缓存,如果能用就返回缓存;如果不能用就执行下一个拦截器;
ConnectInterceptor:
CallServerInterceptor