前言
OkHttp系列文章
OkHttp系列文章(一) - Java網(wǎng)絡(luò)編程基礎(chǔ)
OkHttp系列文章(二) - Http與Https
OkHttp系列文章(三) - OkHttp
OkHttp系列文章(四) - OkHttp攔截器原理
OkHttp系列文章(五) - OkHttp的5個(gè)攔截器作用
OkHttp系列文章(六) - OkHttp的5個(gè)攔截器圖解分析
OkHttp系列文章(七) - 文件更新下載
1. OkHttp攔截器圖解分析
分析上圖可知:
相關(guān)知識(shí):
1>:首先從最上邊發(fā)送Request請(qǐng)求薪捍,經(jīng)過5個(gè)攔截器花嘶,一直發(fā)到最下邊,然后從最下邊返回響應(yīng) Response鼎天,一直到最上邊邮偎;
2>:中間5個(gè)攔截器只做自己相關(guān)的事情;
1>:對(duì)于RetryAndFollowUpInterceptor重試攔截器:
a>:Retry重試機(jī)制應(yīng)用場(chǎng)景1 —— 返回307:
在Retry攔截器返回的Response數(shù)據(jù),如果是307(重定向)络它,就不要再給上邊發(fā)送了,而是在Retry攔截器中把 Location解析出來歪赢,拿到新的連接之后化戳,就封裝成一個(gè)新的請(qǐng)求,然后重新再往下邊發(fā)送 Request請(qǐng)求埋凯,再走一遍流程点楼,再一次返回到 Retry攔截器時(shí)候,判斷返回的Response是否是307白对,如果沒有307了掠廓,就把數(shù)據(jù)給客戶端返回回去,讓客戶端顯示躏结;
b>:Retry重試機(jī)制應(yīng)用場(chǎng)景2 —— 拋異常:
比如在向下邊發(fā)送 Request請(qǐng)求時(shí)却盘,在任何一個(gè)攔截器里邊發(fā)生異常,這個(gè)時(shí)候在 Retry攔截器中try...cache...媳拴,判斷如果這個(gè)異常不是致命的異常黄橘,比如只是 socket連接超時(shí),那么就不要拋異常給 Retry上邊的客戶端屈溉,讓其再執(zhí)行一遍所有攔截器流程塞关,如果是致命的異常,就拋給上邊子巾,讓其執(zhí)行異常的方法帆赢,就是聯(lián)網(wǎng)請(qǐng)求的 onFailure()方法;
2>:對(duì)于BridgeInterceptor基礎(chǔ)攔截器:
BridgeInterceptor攔截器就是添加一些通用的頭部信息线梗,比如Connection(保持連接)椰于、支持zip壓縮,如果返回的數(shù)據(jù)是 InputStream仪搔,就需要解壓數(shù)據(jù)瘾婿,就需要用GZipInputStream去讀數(shù)據(jù),否則全是亂碼烤咧;
3>:對(duì)于CacheInterceptor緩存攔截器:
從最上邊開始發(fā)起請(qǐng)求偏陪,到 CacheInterceptor時(shí)候,發(fā)現(xiàn)有緩存煮嫌,就不往下邊的攔截器走了笛谦,直接又返回 Response到客戶端并顯示數(shù)據(jù);如果沒有緩存昌阿,就還會(huì)往下邊的攔截器去跑饥脑,這個(gè)時(shí)候就需要給 CacheInterceptor添加一些字段恳邀,給頭部添加一個(gè) If - Modified - Since,然后繼續(xù)向下邊攔截器執(zhí)行好啰,當(dāng)返回到 CacheInterceptor時(shí)轩娶,對(duì)數(shù)據(jù)做一次緩存,最后把 Response返回給 客戶端框往;當(dāng)下一次再執(zhí)行到 CacheInterceptor時(shí)候發(fā)現(xiàn)有緩存鳄抒,就不會(huì)往下邊走了,直接讀緩存椰弊,然后返回?cái)?shù)據(jù)上去給客戶端就可以许溅;
4>:對(duì)于ConnectInterceptor連接攔截器:
從最上邊開始發(fā)起請(qǐng)求,找可用的連接秉版,如果有贤重,就不需要建立新的socket連接,直接從 ConnectInterceptor到CallServerInterceptor讀寫數(shù)據(jù)清焕,然后再把結(jié)果返回給最上邊的客戶端并蝗;
如果沒有新的連接,就與 Server建立新的連接秸妥,然后繼續(xù)從 ConnectInterceptor到CallServerInterceptor讀寫數(shù)據(jù)滚停,然后再把結(jié)果返回給最上邊的客戶端;