Tamic /
http://blog.csdn.net/sk719887916/article/details/74308343
#OkHttp拦截器原理解析
拦截器
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
过滤器
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
- 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
- 2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
- 3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
- 4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
- 5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
Android里面过滤器大家用的已经无法再陌生了,Filter就是一个很好的列子,在清单文件注册Filter就可以过滤启动摸某个组件的Action.
Okhttp拦截器因此应运而生,处理一次网络调用的Action拦截,做修改操作。
OKHTTP INTERCEPTOR
使用
okhttp拦截器用法很简单,构建OkHttpClient时候通过.addInterceptor()就可以将拦截器加入到一次会话中。
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
拦截器
拦截器是Okhttp一种强大的机制,可以监视,重写和重试每一次请求。下面示列了一个简单的拦截器,用于记录传出的请求和传入的响应。
class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
logger.info(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
logger.info(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
呼叫chain.proceed(request)是每个拦截器实现的关键部分。这个简单的方法是所有HTTP工作发生的地方,产生满足请求的响应。
拦截器可以链接。假设您同时拥有一个压缩拦截器和一个校验和拦截器:您需要确定数据是否已压缩,然后进行校验和,或校验和然后压缩。OkHttp使用列表来跟踪拦截器,拦截器按顺序调用。
应用拦截器
拦截器被注册为应用程序或网络拦截器。我们将使用LoggingInterceptor
上面定义来显示差异。
注册一个应用程序通过调用拦截器addInterceptor()
上OkHttpClient.Builder
:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
Request request = new Request.Builder()
.url("http://www.publicobject.com/helloworld.txt")
.header("User-Agent", "OkHttp Example")
.build();
Response response = client.newCall(request).execute();
response.body().close();
URLhttp://www.publicobject.com/helloworld.txt
重定向到https://publicobject.com/helloworld.txt
,OkHttp自动跟随此重定向。我们的应用拦截器被调用一次,返回的响应chain.proceed()
具有重定向的响应:
INFO: Sending request http://www.publicobject.com/helloworld.txt on null
User-Agent: OkHttp ExampleINFO: Received response for https://publicobject.com/helloworld.txt in 1179.7ms
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/plain
Con