OkHttp之Call

HTTP客戶端的職責是接收請求產出響應,理論上簡單但實踐中卻棘手。

Request

每個HTTP請求包含一個URL,一個方法(像GET或POST),以及請求頭列表。Request也可能包含主體:一個特定內容類型的數(shù)據(jù)流。

Response

Response使用一個code(像200代表成功或404代表沒有找到),響應頭頭列表以及一個可選的主體應答請求。

重寫Request

當你提供給OkHttp一個HTTP請求時,你會深度描述這個請求:“fetch me this URL with these headers”。為了正確性和效率,OkHttp會在請求發(fā)送前進行重寫。

OkHttp可能添加原始請求缺省的頭,包括Content-Length,Transfer-Encoding,User-Agent,Host,Connection和Content-Type。除非Accept-Encoding頭已經存在,否則它會添加一個支持透明壓縮。如果你已得到cookies,OkHttp也會使用它們添加一個Cookie頭。

有些請求將會有一個緩存的響應。當緩存的響應不新鮮時,OkHttp可以執(zhí)行一個有條件的GET來下載一個更新后的響應(如果這個響應比緩存的新鮮)。這個需要添加像If-Modified-Since和If-None-Match這樣的請求頭。

重寫Response

如果使用了透明壓縮,OkHttp會丟棄相應的響應頭Content-Encoding和Content-Length,因為它們不適用于解壓后的響應body。

如果一個有條件的GET執(zhí)行成功,從網絡獲取的響應和緩存會按規(guī)則進行合并。

跟進Request

當你請求的URL被移動了,服務器會返回一個像302這樣的響應碼來指出文檔的新URL。OkHttp會跟進這個重定向來獲取最終的響應。

如果響應發(fā)出了授權挑戰(zhàn),OkHttp會詢問Authenticator(如果配置了一個)來滿足這個挑戰(zhàn)。如果authenticator提供了一個證書,請求會帶著這個證書重試。

Request重試

有時連接會失?。哼B接池過期并且失去連接,或者服務器本身不能訪問到。如果有一個可用的不同的路由,OkHttp會重試這個請求。

Calls

有了重寫,重定向,跟進和重試,你簡單的請求可能產生多個請求和響應。OkHttp會使用Call來模化滿足請求的任務,然而中間的請求和響應是必要的。通常它們不是很多。但是,知道你的代碼在URL重定向后可以繼續(xù)工作或你可以使用備用IP地址容錯是令人欣慰的。

Call執(zhí)行有兩種方式:

  • Synchronous:線程會阻塞直到響應可讀。
  • Asynchronous:在一個線程中入隊請求,當你的響應可讀時在另外一個線程獲取回調。

請求可以從任何線程取消。如果請求還沒完成,會使請求失敗。當請求取消了,寫請求主體和讀響應主體的代碼會遇到IOException。

請求分發(fā)

對于同步調用,你使用的是自己的線程并對管理你同時創(chuàng)建多少請求負責。太多的并發(fā)連接浪費資源,太少會造成延遲。

對于異步調用,Dispatcher實現(xiàn)了最大并發(fā)請求的策略。你可以設置每個服務器最大值(默認是5)和所有最大值(默認是64)。

原文鏈接:
https://github.com/square/okhttp/wiki/Calls

OkHttp官方文檔系列文章:

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容