OkHttp學(xué)習(xí)(一)-重要類解讀

OkHttpClient

對外提供的公開類,實現(xiàn)了Call.Factory接口

OkHttpClient.Builder

OkHttp內(nèi)部類,構(gòu)建OkHttpClient對象都是使用Builder類來創(chuàng)建

HttpUrl

封裝Http地址,提供了眾多操作http地址的方法, http請求地址實際上就是一個URL, 而URL的標(biāo)準(zhǔn)構(gòu)成是:

scheme://username:password@host:port/path/path?queryParameter#fragment;

其中我們最常用的是scheme://host:port/path?queryParameter這種形式

Headers

封裝Http請求的頭部信息,通過Headers類可以配置Http請求的頭部信息

RequestBody

抽象類,封裝Http請求體Body

FormBody

繼承自RequestBody,代表表單數(shù)據(jù)的請求體

MultipartBody

同樣繼承自RequestBody,multipart/form-data一般用于傳輸文件,在請求體中添加了分隔符

Request

封裝Http請求,內(nèi)部包含上述的HttpUrl, Headers, RequestBody

Response

表Http的響應(yīng)消息

ResponseBody

Http響應(yīng)正, 一般情況下是進(jìn)行http請求都是通過異步的形式,需要傳入一個回調(diào)接口Callback,請求結(jié)束后會回調(diào)onResponse(Call call, Response response)方法,然后通過response.body()獲取ResponseBody對象, 通過ResponseBody可以獲取對應(yīng)的輸入

Call

可以理解為任務(wù),每次要進(jìn)行Okhttp的網(wǎng)絡(luò)請求時,都需要通過創(chuàng)建Call對象,來完成實際的請求工作,Call是一個接口,主要提供了兩個方法:

  • Response execute() - 同步調(diào)用
  • void enqueue(Callback responseCallback) - 異步調(diào)用

RealCall

Call接口的唯一實現(xiàn)類,當(dāng)調(diào)用OkHttpClient.newCall時實際生成的就是RealCall

Dispatcher

顧名思義,調(diào)度器,內(nèi)部包含一個ExecutorService線程池,以及三個雙端隊列:

  • readyAsynCalls - 保存待運(yùn)行的請求(當(dāng)正在運(yùn)行的請求隊列已滿時,新放入的請求會放入待運(yùn)行隊列)
  • runningAsyncCalls - 保存正在運(yùn)行的異步請求
  • runningSynCalls - 保存正在運(yùn)行的同步請求

Interceptor

攔截器,可以通過攔截器重寫,監(jiān)聽請求,OkHttp內(nèi)部就是通過一層層的攔截器逐步完成, Interceptor使用的是責(zé)任鏈模式:"它包含了一些命令對象和一系列的處理對象,每一個處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法"(參考來自: 拆輪子系列: 拆OkHttp)

Okhttp內(nèi)部的Interceptor有以下幾種:

  1. RetryAndFollowUpInterceptor
  2. BridgeInterceptor
  3. CacheInterceptor
  4. ConnectInterceptor
  5. CallServerInterceptor

個人覺得, Interceptor是OkHttp中最牛掰的一個設(shè)計

RetryAndFollowUpInterceptor

主要創(chuàng)建StreamAllocation對象,處理重定向響應(yīng)以及進(jìn)行錯誤恢復(fù)

BridgeInterceptor

主要添加一些必要的Http請求頭部信息,獲取響應(yīng)后,會保存Cookie,如果響應(yīng)的內(nèi)容是以gzip壓縮的,還會進(jìn)行解壓縮

CacheInterceptor

主要從緩存中獲取相應(yīng),如果有對應(yīng)的響應(yīng),且響應(yīng)未過期的話,直接返回緩存中的響應(yīng),如果沒有緩存則調(diào)用下一步的Interceptor進(jìn)行請求,得到響應(yīng)后,檢查響應(yīng)是否需要緩存,若需要緩存,則直接緩存起來

ConnectInterceptor

主要是建立同服務(wù)器之間的連接

CallServerInterceptor

主要是處理相對應(yīng)的IO,發(fā)送請求,獲取響應(yīng)(OkHttp的I/O使用的Okio)

Protocol

協(xié)議類,定義了Okhttp所使用的網(wǎng)絡(luò)協(xié)議,目前okhttp支持以下幾種協(xié)議:

  • http/1.0
  • http/1.1
  • SPDY/3.1
  • http/2.0 - 即https協(xié)議

Dns

接口, 提供根據(jù)主機(jī)名查找ip地址的方法,默認(rèn)實現(xiàn)是內(nèi)部的SYSTEM變量,通過java.net.InextAddress.getAllByName查找ip

Cookie

用于表示Cookie信息

CookieJar

用來管理Cookie,可以從請求中提取Cookie,也可以從響應(yīng)中獲取Cookie, 內(nèi)部提供了一個的NO_COKKIE變量作為默認(rèn)的cookie管理類

MediaType

用于指定請求體的Content-Type的MIME類型,此外還能指定字符集,默認(rèn)為utf-8

RouteSelector

代理選擇器, 通過這個類來選擇使用哪個代理Proxy(Proxyjava.net包里面的代理,代理分為三種:DIRECT直連,即直接跟目標(biāo)服務(wù)器連接,HTTPhttp代理,SOCKS`socks代理)

Connection

接口,提供Socket連接的方法

RealConnection

實現(xiàn)了Connection接口,Socket的連接實際是通過這個類來完成,重要的方法有:

  • void connect() 進(jìn)行網(wǎng)絡(luò)連接,創(chuàng)建Socket連接,如果是https協(xié)議,還要進(jìn)行TLS的握手,證書校驗等操作

ConnectionPool

連接池,用來管理HTTP和SPDY連接的復(fù)用, HTTP請求相同的Address可以共享同一個連接

ConnectionSpec

連接規(guī)范,用于配Socket連接層,還可配置HTTPS相關(guān)的配置

HttpCodec

接口,提供了創(chuàng)建http request和解析http response的方法, 重要方法有:

  • Sink createRequestBody 創(chuàng)建一個Request body的輸出
  • Response.Builder readResponseHeaders 從流中解析出Response
  • ResponseBody openResponseBody 從Response中解析出REsponseBody

StreamAllocation

用于協(xié)調(diào)連接,流和請求. 比較重要的方法有:

  • HttpCodec newStream() - 找到一個可以使用的Connection, 之后生成一個新的HttpCodec

CipherSuite

密碼套件,提供了眾多算法供TLS連接使用

CertificatePinner

證書鎖,HTTPS相關(guān),用于約束那些證書可以被信任

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于okhttp是一款優(yōu)秀的網(wǎng)絡(luò)請求框架,關(guān)于它的源碼分析文章有很多,這里分享我在學(xué)習(xí)過程中讀到的感覺比較好的文章...
    蕉下孤客閱讀 3,724評論 2 38
  • OkHttp解析系列 OkHttp解析(一)從用法看清原理OkHttp解析(二)網(wǎng)絡(luò)連接OkHttp解析(三)關(guān)于...
    Hohohong閱讀 21,121評論 4 58
  • 參考Android網(wǎng)絡(luò)請求心路歷程Android Http接地氣網(wǎng)絡(luò)請求(HttpURLConnection) 一...
    合肥黑閱讀 21,697評論 7 63
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 半夜醒來,每天所經(jīng)歷的事情,如果還有殘留,夜里會醒來,對于人性,有個部分不接納,信任,關(guān)于信任,不想去深究是什...
    Monaa閱讀 206評論 0 0

友情鏈接更多精彩內(nèi)容