OKHTTP结合官网示例分析两种自定义拦截器的区别

分析的很全面,推荐给大家

OKHTTP异步和同步请求简单分析

OKHTTP拦截器缓存策略CacheInterceptor的简单分析

OKHTTP拦截器ConnectInterceptor的简单分析

OKHTTP拦截器CallServerInterceptor的简单分析

OKHTTP拦截器BridgeInterceptor的简单分析

OKHTTP拦截器RetryAndFollowUpInterceptor的简单分析

OKHTTP结合官网示例分析两种自定义拦截器的区别

1、LoggingInterceptor示例代码

通过下面的代码可以看出,它就是用于在请求发送前和网络响应后的打印日志信息的拦截器。具体打印的内容很简单,就不解释了,重点是 Application Intercetor 和 NetworkInterceptor 的区别,继续往下看。

class LoggingInterceptor implements Interceptor{

@Override 

public Responseintercept(Interceptor.Chain chain)

throws IOException{    

Request request = chain.request();

//请求前--打印请求信息

longt1 = System.nanoTime();    

logger.info(String.format("Sending request %s on %s%n%s",        request.url(), chain.connection(), request.headers()));

//网络请求Response response = chain.proceed(request);

//网络响应后--打印响应信息longt2 = System.nanoTime();   

 logger.info(String.format("Received response for %s in %.1fms%n%s",        response.request().url(), (t2 - t1) /1e6d, response.headers()));returnresponse;  }}

2、Application Intercetor和NetworkInterceptor的区别

在官方文档中用 LoggingInterceptor 作为示例,解释了 Application Intercetor 和 NetworkInterceptor 的区别。

OKHTTP官网示例在看两种拦截器的区别之前,还是要点击这个链接去看看,之后再看这个博客的总结会好点。

到这里,默认就是已经看过了官网的示例了,那我们就使用一个图来看看拦截器的调用过程:

拦截器的执行过程.png

从上面的调用关系可以看出除了红色圈出的拦截器之外都是系统提供的拦截器,这整个过程是递归的执行过程,在 CallServerInterceptor 中得到最终的 Response 之后,将 response 按递归逐级进行返回,期间会经过 NetworkInterceptor 最后到达自定义的 Interceptor 。

在官网给出的 NetworkInterceptor 和 Application Interceptor 的区别在上面的图中就可以看出:

1.自定义 Interceptor 是第一个 Interceptor 因此它会被第一个执行,因此这里的 request 还是最原始的,并没有经过 BridgeInterceptor 进行加工过,因此他只有一个自定义的 User-Agent 请求头。而对于 response 而言呢,因为整个过程是递归的调用过程,因此它会在 CallServerInterceptor 执行完毕之后才会将 Response 进行返回,因此这里得到的 response 就是最终的响应,虽然中间有重定向,但是这里只关心最终的 response 。

2.NetwrokInterceptor 处于第 6 个拦截器中,它会经过 RetryAndFollowIntercptor 进行重定向并且也会通过 BridgeInterceptor 进行 request 请求头和 响应 resposne 的处理,因此这里可以得到的是更多的信息。在打印结果可以看到它内部是发生了一次重定向操作,在上图可以看出,为什么 NetworkInterceptor 可以比 Application Interceptor 得到更多的信息了。

3、两种拦截器的区别

下面是官网给出的区别,根据我自己的理解,使用中文标出了自己的解释。

Application interceptors

Don't need to worry about intermediate responses like redirects and retries.不需要去关心中发生的重定向和重试操作。

Are always invoked once, even if the HTTP response is served from the cache.只会被调用一次,即使这个响应是从缓存中获取的。

Observe the application's original intent. Unconcerned with -OkHttp-injected headers like If-None-Match.只关注最原始的请求,不去关系请求的资源是否发生了改变,我只关注最后的 response 结果而已。

Permitted to short-circuit and not call Chain.proceed().因为是第一个被执行的拦截器,因此它有权决定了是否要调用其他拦截,也就是 Chain.proceed() 方法是否要被执行。

Permitted to retry and make multiple calls to Chain.proceed()

.因为是第一个被执行的拦截器,因此它有可以多次调用 Chain.proceed() 方法,其实也就是相当与重新请求的作用了。

Network Interceptors

Able to operate on intermediate responses like redirects and retries.因为 NetworkInterceptor 是排在第 6 个拦截器中,因此会经过 RetryAndFollowup 进行失败重试或者重定向,因此可以操作中间的 resposne。

Not invoked for cached responses that short-circuit the network.这个我不知道是什么意思,望大神指点。TODO

Observe the data just as it will be transmitted over the network.观察数据在网络中的传输,具体我也不太清除是干嘛的。TODO

Access to the Connection that carries the request.因为它排在 ConnectInterceptor 后执行,因此返回执行这个 request 请求的 Connection 连接。

在上面还有几个 TODO 没有解决,希望懂的同学指点一下...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容