okhttp 里面有一个类Interceptor主要负责 request的提交 获取response不知道这个是不是拦截器模式。先介绍一下思路:RealCall类里面的下面的方法
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());
interceptors.add(retryAndFollowUpInterceptor);
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));
Interceptor.Chain chain = new RealInterceptorChain(
interceptors, null, null, null, 0, originalRequest);
return chain.proceed(originalRequest);
}
}
Interceptor 里有一个chain的接口,chain接口里有 Response proceed(Request request);
RealInterceptorChain 构造方法里获取拦截器的集合,proceed 方法得到第一个拦截器,再调用interceptor.inercept(Chain chain)
如果intercept 具体的类里面例如 BrideInterceptor 继续调用 chain.proceed();这将陷入一个来回回调的过程,直到回调完所有的interceptor下面通过一个demo来说明这个过程
public class Request {
private String request;
public String getRequest() {
return request;
}
public void setRequest(String request) {
this.request = request;
}
}
public class Response {
String response;
public String getResponse() {
return response;
}
public void setResponse(String response) {
this.response = response;
}
}
public interface Interceptor {
Response intercept(Chain chain);
interface Chain{
Response proceed(Request request);
Request request();
}
}
//拦截器中处理集合中所有的拦截
public class InterceptorChainConcrete implements Interceptor.Chain {
List<Interceptor> interceptors;
int index;
int calls;
Request request;
public InterceptorChainConcrete(List<Interceptor> interceptors, int index,Request req) {
this.interceptors = interceptors;
this.index = index;
this.request = req;
}
@Override
public Response proceed(Request request) {
Response finish = new Response();
finish.setResponse("finish");
if (index >= interceptors.size()) return finish;
calls++;
InterceptorChainConcrete next = new InterceptorChainConcrete(
interceptors,index + 1,request);
Interceptor interceptor = interceptors.get(index);
Response res = interceptor.intercept(next);
res.setResponse(request.getRequest());
System.out.println("calls:"+calls+" "+request.getRequest()+" index:"+index);
return res;
}
@Override
public Request request() {
return request;
}
}
//拦截器的具体实现类
public class Interceptor1 implements Interceptor {
@Override
public Response intercept(Chain chain) {
InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
Request request = realChain.request;
return realChain.proceed(request);
}
}
public class Interceptor2 implements Interceptor {
@Override
public Response intercept(Chain chain) {
InterceptorChainConcrete realChain = (InterceptorChainConcrete) chain;
Request request = realChain.request;
return realChain.proceed(request);
}
}
//拦截器中最后一个类 终止 回调
public class InterceptorFinish implements Interceptor {
@Override
public Response intercept(Chain chain) {
Response response = new Response();
response.setResponse("finish");
return response;
}
}
测试方法:
public static com.example.Response Test(){
List<Interceptor> interceptors = new ArrayList<>();
interceptors.add(new Interceptor1());
interceptors.add(new Interceptor2());
interceptors.add(new InterceptorFinish());
com.example.Request request = new com.example.Request();
request.setRequest("request");
Interceptor.Chain chain = new InterceptorChainConcrete(
interceptors, 0, request);
return chain.proceed(request);
}