拦截器简介
- okhttp通过拦截器链实现对请求响应的校验及封装,满足定制化需求
- okhttp拦截器链使用了责任链模式,每个拦截器可以选择将请求处理,或者将请求传给下个拦截器
- okhttp常见的拦截器有:BridgeInterceptor、CacheInterceptor、ConnectInterceptor、CallServerInterceptor
okhttp拦截器
实现原理
- 顺序将拦截器加入到一个集合,创建一个拦截器链,将拦截器集合作为参数传入调用拦截器proceed方法
- proceed方法内部通过index控制每个拦截器按序调用,内部调用拦截器的intercept方法
- 执行完一个拦截器后,再创建一个新的拦截器链,继续调用其proceed方法
- 当index的size大于拦截器集合大小了,说明拦截器调用结束
源码分析
- 入口类:RealCall,执行方法:execute,同步/异步调用中都会执行拦截器链
RealCall调用
- 同步请求方法调用:
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
captureCallStackTrace();
try {
client.dispatcher().executed(this);
// 执行拦截器链得到resonse结果
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} finally {
client.dispatcher().finished(this);
}
}
- 异步请求方法调用
protected void execute() {
boolean signalledCallback = false;
try {
// 执行拦截器链,得到response结果
Response response = getResponseWithInterceptorChain();
if (retryAndFollowUpInterceptor.isCanceled()) {
signalledCallback = true;
responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
} else {
signalledCallback = true;
responseCallback.onRespons