1. 程式人生 > >OkHttp原始碼徹底解析(一)OkHttp請求流程

OkHttp原始碼徹底解析(一)OkHttp請求流程

前言

OkHttp是一個處理網路請求的開源專案,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso)

用於替代HttpUrlConnection和Apache HttpClient(android API23 6.0裡已移除HttpClient,現在已經打不出來),這是現在非常主流的一個網路請求框架了。

可能有人會說Retrofit+RxJava才是最主流的,好吧,其實Retrofit的強大也是基於OkHttp,其是在OkHttp的基礎上進一步封裝,所以OkHttp也是切入Retrofit原始碼學習的入口。

博主對Retrofit2.x和OkHttp3.0也是比較熟悉的,剛好最近比較有空,接著週末時間總結了OkHttp。

本系列將帶領大家從原始碼的出發,做到儘可能詳細地剖析OkHttp的每一個知識點。

作為本系列的第一篇,也算是個序篇,不打算過多深入,僅僅帶過一下網路請求的整個流程。

 

 

正文

 

OkHttp整體流程圖

OkHttp請求的大致流程圖如下

 

 

其中,省略號部分是OkHttp的攔截器

 

 

最後一個攔截器CallServerInterceptor實現了網路請求,,將HTTP請求寫入網路IO流,從IO流讀取網路資料,並獲取返回的資料

 

 

OkHttp文字流程

整個OkHttp的使用流程,就是從客戶端往指定伺服器傳送一個Request到伺服器返回一個Response

可以粗略地將這個流程分為四部分


1.生成請求(封裝生成Call):將外觀類(OkHttpClient)和資料請求類(Request)封裝生成同步請求類(RealCall):
若是同步請求,則直接呼叫的同步請求類(RealCall)同步(execute)方法;
若是非同步請求,則封裝成非同步請求類(RealCall的內部類AsyncCall),再呼叫它的非同步(enqueue)方法。


2.管理請求(Dispatcher排程請求)

:把生成的請求扔給排程器(Dispatcher)進行管理


3.執行請求(攔截器):也就是圖中Dispatcher往下的部分:
這個部分是 OkHttp 的核心,使用了 分層設計 + 鏈式呼叫 思想,使用了責任鏈模式。
這裡使用責任鏈設計模式是考慮到網路請求操作是一個很複雜的操作(我們必須考慮多種情況,如重定向、Socket連線、TLS安全、Cache複用、連線池複用等等)
為了使複雜操作的邏輯相對清晰,OkHttp採用了分層設計的思想,使用多層攔截器,每個攔截器解決一個問題。

4.真正實現網路通訊 :最後的攔截器(CallServerInterceptors)才 真正的進行了網路請求,將HTTP請求寫入網路IO流,從IO流讀取網路資料(OKIO)          OKHttp的網路請求的實現是socket(應用程式與網路層進行互動的API)。socket發起網路請求的流程一般是:
(1). 建立socket物件;
(2). 連線到目標網路;
(3). 進行輸入輸出流操作。 (okio)

其中,前兩步由攔截器中建立的RealConnection來實現,第三步是通過stream介面來實現(IO操作底層由okio實現),根據不同的網路協議,有Http1xStream和Http2xStream兩個實現類。

 

 

看完了本篇部落格,相信你對OkHttp的整個流程已經有了一個大致的瞭解。

最後說一下,如果想真正掌握網路請求的具體流程,單單本文是遠不夠的,所以我會寫一個系列,

涉及了OkHttp3.0工具類原始碼及一些邏輯流程,攔截器,連線池,Socket與okio。

旨在瞭解OkHttp的實現流程,學習其內部的一些執行機制,學習OkHttp中的一些設計模式的用法並舉一反三運用到自身專案當中。