okhttp基本使用及概要
特性:
- socket複用 (同一個主機共享一個socket)
- 結果緩存減少重複請求
- 支持透明的gzip壓縮
http/https協議棧
創建client
OkHttpClient httpsClient = new OkHttpClient.Builder()
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.connectTimeout(timeOut, TimeUnit.MILLISECONDS)
.readTimeout(timeOut, TimeUnit.MILLISECONDS)
.build();
上面爲基本的okhttp的創建方式,當然還有很多其它的高級點的設置,下面介紹幾個:
// 業務可以自己實現dns接口,okhttp內部有默認實現,無超時邏輯,可能出現dns解析幾十秒的問題(dns爲樹形結構如果查詢不到則會逐級查詢直到根域名服務器,整個過程非常耗時。出現過一個bug當解析ip+端口號的錯誤域名時耗時可以達幾十秒級別)
// 所以建議自己實現dns接口,設置一個超時時間
public Builder dns(Dns dns)
// 域名校驗接口(只有https需要設置,在ssl握手階段,如果url域名與服務器的域名不匹配時,會交給HostnameVerifier接口判斷是否進行連接)
public Builder hostnameVerifier(HostnameVerifier hostnameVerifier)
// 可以設置SocketFactory,用於創建Socket
public Builder socketFactory(SocketFactory socketFactory)
// 對於https的連接創建Factory可以用如下方法
public Builder sslSocketFactory(SSLSocketFactory sslSocketFactory)
// 是否支持重定向,默認爲支持
Builder followRedirects(boolean followRedirects)
// 連接失敗後是否重連: 默認在 特定場景下回重連(如一個host有多個ip,一個ip失敗會嘗試另一個)
public Builder retryOnConnectionFailure(boolean retryOnConnectionFailure)
// 添加網絡攔截器
Builder addNetworkInterceptor(Interceptor interceptor)
// 請求攔截器
Builder addInterceptor(Interceptor interceptor)
// 用於監控請求的每個階段,可以做 端到端監控,監控每個接口統計耗時
Builder eventListener(EventListener eventListener)
除以上接口外還可以設置 Dispatch(線程管理)、代理、自定義連接池等,功能很強大
構造請求
請求構造比較簡單,具體可參考如下:
Request request = new Request.Builder()
.url(url)
.post(data)
.headers(Headers.of(headerParams))
.build();
同步請求
Response response = client.newCall(request).execute()
異步請求
Response response = client.newCall(request).enqueue(Callback responseCallback)
請求流程
)
// https 中ssl過程
SSLSocketFactory