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中的一些設計模式的用法並舉一反三運用到自身項目當中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章