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有以下幾種:
RetryAndFollowUpInterceptorBridgeInterceptorCacheInterceptorConnectInterceptorCallServerInterceptor
個人覺得, 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(Proxy是java.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),用于約束那些證書可以被信任