拦截器是一种强大的机制,可以监视、重写和重试调用,拦截器可以是链式的,假设你有一个压缩拦截器和一个校验拦截器,那么需要决定数据是否被压缩后进行校验,或者是先校验后压缩。OkHttp采用列表的形式追踪拦截器,拦截器会被有序调用。
在注册拦截器时,可以注册成两类拦截器,分别为应用拦截器(Application Interceptors)和网络拦截器(Network Interceptors),如下图:
1、应用拦截器(ApplicationInterceptors)
下面是一个简单例子,自定义一个LoggingInterceptor,拦截发出的请求和传入的响应的日志.
在拦截器的实现中,对chain.proceed(request)的一次调用时是关键的一步。这个看起来简单的方法是HTTP工作实际发生的地方,产生一个满足请求的响应。import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* 日志拦截器
*/
public class LoggingInterceptor implements Interceptor {
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
logger.info(String.format("发送请求 %s on %s%n请求头%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
logger.info(String.format("收到响应 for %s %.1fms%n响应头%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
注册一个应用拦截器通过调用OkHttpClient.interceptors().add()方法完成。OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingI