前言
OkHttp簡單易用狭握,它又非常的流行闪金。我們?yōu)槭裁床话情_她的外衣,看看她美妙的身材呢(小邪惡论颅,嘿嘿)哎垦?看看人家的編碼藝術(shù),從而提高自己的技術(shù)水平恃疯。
在okhttp中攔截器(interceptor)扮演者重要的角色漏设,我們今天就來happy的分析它。
數(shù)據(jù)的加工藝術(shù)
先舉個小例子:方便面
我們經(jīng)常吃方便面今妄,可是你知道方便面是如何生產(chǎn)出來的嗎郑口?
由上圖知:我們吃的方便面,由面粉經(jīng)過一道道工序最終加工成了油炸方便面蛙奖。
數(shù)據(jù)的加工
類比方便面的加工流程潘酗,在我們的編程中,我們時常會遇到這種情況:
在網(wǎng)絡(luò)數(shù)據(jù)交換中雁仲,我們經(jīng)常這樣做:發(fā)送數(shù)據(jù)給服務(wù)器仔夺,接收服務(wù)器返回的數(shù)據(jù)。但是需要注意的是攒砖,我們發(fā)送和接收的數(shù)據(jù)也是經(jīng)過多道工序加工過的缸兔。
- 發(fā)送的數(shù)據(jù):原始數(shù)據(jù)-->添加頭部信息-->打印數(shù)據(jù)的日志信息-->數(shù)據(jù)加密-->等等
- 接收的數(shù)據(jù):原始數(shù)據(jù)-->數(shù)據(jù)解密-->數(shù)據(jù)流的觀察(下載進度條)-->打印數(shù)據(jù)相關(guān)的日志-->等等
在okhttp中:
Request
這個類封裝了你的請求數(shù)據(jù)
Response
這個類封裝了服務(wù)器返回的數(shù)據(jù)
一般日裙,我們先構(gòu)造一個原始的Request
,交給Call
去發(fā)送這個請求惰蜜,
這個請求經(jīng)過多次加工昂拂,被送往服務(wù)器。然后服務(wù)器返回數(shù)據(jù)抛猖,返回的數(shù)據(jù)被層層加工格侯,最終回到了我們的手里Response
。
以上說的流程用下圖來簡單的表示:
針對這個數(shù)據(jù)加工流程财著,okhttp是如何編碼設(shè)計的呢联四?
攔截器 Interceptor
在一個攔截器中,你可以自由的加工Request和Response撑教。
如下圖:
由上圖可以看出每個攔截器是互相獨立的朝墩,但是他們是如何鏈接到一起呢?
關(guān)于鏈接伟姐,okhttp就抽象了Chain這個接口收苏。
鏈條 Chain
okhttp用鏈條chain來鏈接攔截器
如下圖:
上面每個小圓圈代表一個chain,每個小圓圈環(huán)環(huán)相扣愤兵,形成一條長鏈子鹿霸。
代碼在這里
攔截器 和 鏈子的定義如下:
我們看一個鏈子的具體實現(xiàn):
鏈子的核心:proceed
代碼說明:
- 當前鏈子在
proceed
方法中,主動構(gòu)造了下一個鏈子(將request流出)恐似。 -
下一個鏈子被傳入到下一個攔截器中杜跷,攔截器處理完畢(將response流入)。
我們看一個攔截器的實現(xiàn):日志攔截器
攔截器的核心