目錄:andorid jar/庫源碼解析 Okhttp3: 作用: 用於網路編程(http,https)的快速開發。 慄子: // okHttpClient定義成全局靜態,或者單例,不然重覆new可能導致連接數耗盡 OkHttpClient okHttpClient = new OkHttpClie ...
Okhttp3:
作用:
用於網路編程(http,https)的快速開發。
慄子:
// okHttpClient定義成全局靜態,或者單例,不然重覆new可能導致連接數耗盡 OkHttpClient okHttpClient = new OkHttpClient(); String url = "https://www.test.com"; byte[] data = new byte[] { 1 }; okhttp3.RequestBody body = okhttp3.RequestBody.create(MediaType.parse("application/octet-stream"), data); // Request Request request = new Request.Builder().addHeader("Authorization", "Bearer XXXXXXXX").url(url).post(body).build(); // Response Response response = okHttpClient.newBuilder().build().newCall(request).execute(); // 註意:這裡是string不是toString final String msg = response.body().string();
源碼解讀:
①:創建OkHttpClient對象,同時賦值預設值
②:返回一個 RequestBody對象,該對象包含,類型,長度,和寫入數據的方法。
③:創建一個Request$Builder對象,預設使用GET請求,對addHeader進行添加到List<String>集合中,name,value.trim(),一個header用兩條。
④:賦值請求地址,同時特殊處理ws->http,wss->https。對url進行拆分解析,.得到url中的schema,host,port,name,password,path等
⑤:賦值RequestBody和method成POST
⑥:用所有的Request$Builder成員,初始化一個Request對象。
⑦:用OkHttpClient對象的預設值,初始化一個OkHttpClient$Builder對象
⑧:返回一個OkHttpClient對象,值來自OkHttpClient$Builder
⑨:通過OkHttpClient和Request構造一個,RealCall對象。
⑩:調用RealCall的execute方法。a>把RealCall對象添加到,運行Call的集合中。b>創建 RealInterceptorChain 對象進行通訊。 c> 調用 proceed 方法。。d> 創建 List<Interceptor> 集合。迴圈調用 Interceptor的intercept方法,進行處理請求。的細節。
順序: RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor、ConnectInterceptor、networkInterceptors、CallServerInterceptor
最後在CallServerInterceptor 中的intercept中。執行創建一個 RealBufferedSink 對象,用於寫入數據(post內容),然後調用finishRequest。
讀取readResponseHeaders ,得到 Response.Builder 對象,使用這個對象,構造一個Response對象,把request,超時等信息,賦值到response上,判斷response.code==100,重新readResponseHeaders,更新code的值。
調用responseHeadersEnd,完成讀取同步,然後讀取body:openResponseBody,得到 ResponseBody對象。賦值給Response對象,返回
⑪:得到ResponseBody對象而已,沒啥說的
⑫:使用Okio 讀取數據,並且返回(因為是流讀取,所以只能調用一次)
源碼:https://github.com/square/okhttp
引入:
implementation 'com.squareup.okhttp3:okhttp:3.12.1'