OkHttp原理
原文:https://www.songma.com/news/txtlist_i28215v.html
使用
OkHttpClient client = new OkHttpClient();//創(chuàng)建OkHttpClient對(duì)象
Request request = new Request.Builder()
.url(url)//請(qǐng)求鏈接
.build();//創(chuàng)建Request對(duì)象
Call call = client.newCall(request);//創(chuàng)建Call對(duì)象
Response response = call.execute();//獲取Response對(duì)象
1、okhttp工作的大致流程
1.1、整體流程
(1)、當(dāng)我們通過(guò)OkhttpClient創(chuàng)立一個(gè)okHttpClient 、Request 、Call,并發(fā)起同步或者異步請(qǐng)求時(shí);
(2)、okhttp會(huì)通過(guò)Dispatcher對(duì)我們所有的Call(RealCall實(shí)現(xiàn)類)進(jìn)行統(tǒng)一管理,并通過(guò)execute()及enqueue()方法對(duì)同步或者異步請(qǐng)求進(jìn)行執(zhí)行;
(3)、execute()及enqueue()這兩個(gè)方法會(huì)最終調(diào)用RealCall中的getResponseWithInterceptorChain()方法,從阻攔器鏈中獲取返回結(jié)果;
(4)、攔截器鏈中,依次通過(guò)ApplicationInterceptor(應(yīng)用攔截器)、RetryAndFollowUpInterceptor(重定向阻攔器)、BridgeInterceptor(橋接阻攔器)、CacheInterceptor(緩存阻攔器)、ConnectInterceptor(連接阻攔器)、NetwrokInterceptor(網(wǎng)絡(luò)攔截器)、CallServerInterceptor(請(qǐng)求阻攔器)對(duì)請(qǐng)求依次處理,與服務(wù)的建立連接后,獲取返回?cái)?shù)據(jù),再經(jīng)過(guò)上述阻攔器依次解決后,最后將結(jié)果返回給調(diào)用方。
提供兩張圖便于了解和記憶:
okhttp整體流程1
okhttp整體流程2
1.2、各大阻攔器
getResponseWithInterceptorChain方法,也是整個(gè)OkHttp實(shí)現(xiàn)責(zé)任鏈模式的核心。
#RealCall
fun getResponseWithInterceptorChain(): Response {
//創(chuàng)建攔截器數(shù)組
val interceptors = mutableListOf<Interceptor>()
//添加應(yīng)用攔截器
interceptors += client.interceptors
//添加重試和重定向攔截器
interceptors += RetryAndFollowUpInterceptor(client)
//添加橋接攔截器
interceptors += BridgeInterceptor(client.cookieJar)
//添加緩存攔截器
interceptors += CacheInterceptor(client.cache)
//添加連接攔截器
interceptors += ConnectInterceptor
if (!forWebSocket) {
//添加網(wǎng)絡(luò)攔截器
interceptors += client.networkInterceptors
}
//添加請(qǐng)求攔截器
interceptors += CallServerInterceptor(forWebSocket)
//創(chuàng)建責(zé)任鏈
val chain = RealInterceptorChain(interceptors, transmitter, null, 0, originalRequest, this,
client.connectTimeoutMillis, client.readTimeoutMillis, client.writeTimeoutMillis)
...
try {
//啟動(dòng)責(zé)任鏈
val response = chain.proceed(originalRequest)
...
return response
} catch (e: IOException) {
...
}
}
攔截器作用:
ApplicationInterceptor: 應(yīng)用攔截器,通過(guò)addInterceptor添加,拿到的是原始請(qǐng)求,可以添加一些自定義header、通用參數(shù)、參數(shù)加密、網(wǎng)關(guān)接入等等。
RetryAndFollowUpInterceptor:重試和重定向攔截器,處理錯(cuò)誤重試和重定向
BridgeInterceptor:橋接攔截器,主要工作是為請(qǐng)求添加cookie、添加固定的header,比如Host、Content-Length、Content-Type、User-Agent等等,然后保存響應(yīng)結(jié)果的cookie,如果響應(yīng)使用gzip壓縮過(guò),則還需要進(jìn)行解壓。
CacheInterceptor:緩存攔截器,如果命中緩存則不會(huì)發(fā)起網(wǎng)絡(luò)請(qǐng)求。
ConnectInterceptor:連接攔截器,內(nèi)部會(huì)維護(hù)一個(gè)連接池,負(fù)責(zé)連接復(fù)用、創(chuàng)建連接(三次握手等等)、釋放連接以及創(chuàng)建連接上的socket流。
NetworkInterceptors:網(wǎng)絡(luò)攔截器,用戶自定義,通常用于監(jiān)控網(wǎng)絡(luò)層的數(shù)據(jù)傳輸。
CallServerInterceptor:網(wǎng)絡(luò)請(qǐng)求攔截器,在前置準(zhǔn)備工作完成后,真正發(fā)起了網(wǎng)絡(luò)請(qǐng)求。
至此,OkHttp的核心執(zhí)行流程就結(jié)束了,是不是有種豁然開(kāi)朗的感覺(jué)?
OkHttp的內(nèi)部實(shí)現(xiàn)通過(guò)一個(gè)責(zé)任鏈模式完成,將網(wǎng)絡(luò)請(qǐng)求的各個(gè)階段封裝到各個(gè)鏈條中,實(shí)現(xiàn)了各層的解耦。
總結(jié)
- 上一篇: CANN 5.0黑科技解密 | 算力虚拟
- 下一篇: 义务兵军考体能77分算优秀吗