手动模拟Retrofit2 + OkHttp3的拦截器工作原理

模拟拦截器工作原理,加深对责任链模式的理解
Request.java
public class Request {
String RequestParams=””;
}
Response.java
public class Response {
String responseParams = “”;
}

定义拦截器的核心类Interceptor接口与RealInterceptorChain
Interceptor接口
Interceptor.java

public interface Interceptor {

    Response intercept(Chain chain);

    interface Chain {
        Request request();
        Response proceed(Request request);
    }

}

RealInterceptorChain.java

public class RealInterceptorChain implements Interceptor.Chain {

    private final List<Interceptor> interceptors;
    private final int index;
    private final Request request;

    public RealInterceptorChain(List<Interceptor> interceptors, int index, Request request) {
        this.interceptors = interceptors;
        this.index = index;
        this.request = request;
    }

    @Override
    public Request request() {
        return request;
    }

    @Override
    public Response proceed(Request request) {
        if (index >= interceptors.size()) throw new AssertionError();
        RealInterceptorChain next = new RealInterceptorChain(interceptors, index + 1, request);
        Interceptor interceptor = interceptors.get(index);
        Response response = interceptor.intercept(next);
        return response;
    }
}

接下来定义几个拦截器
AInterceptor.java

public class AInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        Request request = chain.request();
        request.RequestParams = request.RequestParams + "Arequest_";
        Response response = chain.proceed(request);
        response.responseParams = response.responseParams + "A_response";
        System.out.println("A请求结果:" + response.responseParams);
        return response;
    }
}

BInterceptor.java

public class BInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        Request request = chain.request();
        request.RequestParams = request.RequestParams + "Brequest_";
        Response response = chain.proceed(request);
        response.responseParams = response.responseParams + "B_response";
        System.out.println("B请求结果:" + response.responseParams);
        return response;
    }
}

CallServerInterceptor.java

public class CallServerInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        RealInterceptorChain realChain = (RealInterceptorChain) chain;
        Request request = realChain.request();
        System.out.println("最终的请求参数:" + request.RequestParams);
        //模拟获取response
        Response response = new Response();
        response.responseParams = "我是服务器的结果返回_";
        System.out.println("服务器的请求结果:" + response.responseParams);
        return response;
    }
}

测试

public class TestDemo {
    public static void main(String[] args) throws Exception {
        List<Interceptor> interceptors = new ArrayList<>();
        interceptors.add(new AInterceptor());
        interceptors.add(new BInterceptor());
        interceptors.add(new CallServerInterceptor());
        Interceptor.Chain chain = new RealInterceptorChain(interceptors,0,null);
        Request originalRequest = new Request();
        originalRequest.RequestParams="requestInit_";
        chain.proceed(originalRequest);
    }
}

测试结果:
最终的请求参数:requestInit_Arequest_Brequest_
服务器的请求结果:我是服务器的结果返回_
B请求结果:我是服务器的结果返回_B_response
A请求结果:我是服务器的结果返回_B_responseA_response

可以发现通过责任链模式完成了request的拦截 和response的拦截

点赞