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官方文檔系列文章: