wiki翻譯
Calls
HTTP客戶端的工作是接收你的request然后返回response倡勇。理論雖然簡單的但是在實際應(yīng)用中卻很困難。
請求(Request)
每一個HTTP請求都包含一個URL迈着,一個請求方法(例如GET,POST),和多個的請求頭潘靖∶⒒可能包含一個請求體(一個特殊組織形式的數(shù)據(jù)流)冬竟。
應(yīng)答(Response)
請求的應(yīng)答包含響應(yīng)碼(例如:200代表成功,404代表資源未找到)民逼,響應(yīng)頭和響應(yīng)體(可選)泵殴。
重寫Request
當用OkHttp發(fā)送一個HTTP請求時,你會在更高的層面描述Request:“用這些請求頭去抓取這個URL”拼苍。為了高效且精確笑诅,OkHttp會在發(fā)送前重寫你的Request。
OkHttp會添加原始Request中沒有的請求頭疮鲫,這些請求頭包括:<code>Content-Length</code>,<code>Transfer-Encoding</code>,<code>User-Agent</code>,<code>Host</code>,<code>Connection</code>吆你,和<code>Content-Type</code>。為了透明的Response它將添加<code>Accept-Encoding</code>除非它(<code>Accept-Encoding</code>)已經(jīng)包含在請求頭里面了俊犯。OkHttp還會添加<code>Cookie</code>請求頭妇多。
一些request包含一個緩存的Response,當這個緩存的Response過期時OkHttp發(fā)送一次有條件的GET請求,如果它是新的那么舊的緩存將被替換燕侠,這些需要添加類似<code>If-Modified</code>或<code>If-None-Match</code>的請求頭者祖。
重寫Response
如果透明壓縮被使用,OkHttp將丟棄<code>Content-Encoding</code>或者<code>Content-Length</code>響應(yīng)頭绢彤,因為它們不適用于解壓縮的請求體咸包。
如果一個有條件的GET請求成功了,從網(wǎng)絡(luò)獲取的響應(yīng)和緩存將會按照指示的規(guī)范合并杖虾。
Follow-up Requests
當你請求的URL改動時烂瘫,服務(wù)器將會返回一個響應(yīng)碼(302)來重定向這個文件的新URL。OkHttp將會根據(jù)重定向的URL取回最終的Response。
如果Response返回授權(quán)改變坟比,OkHttp將會查詢 Authenticator
來滿足這個改變(如果配置)芦鳍。如果Authenticator制訂了一個憑證,那么這個憑證也會包含在請求中葛账。
Request 重試
不管是連接池過時導致的連接失敗還是服務(wù)器本身不能訪問導致的失敗柠衅。OkHttp都會從另一個地址重新請求(當前地址不可達)。
Calls
在rewrites, redirects, Follow-up和retries之后籍琳,你的request可能已經(jīng)產(chǎn)生了大量的request和response菲宴。OkHttp 通過<code>Call</code>模塊化任務(wù)來滿足你的請求,這可能會產(chǎn)生必要的中間request和response趋急。一般來講不會很多喝峦。但欣慰的是它使你的代碼正常工作即使你的URL被重定向或者IP地址故障需要轉(zhuǎn)移到另外一個。
Calls有兩種執(zhí)行模式:
- 同步:在請求響應(yīng)之前會阻塞線程
- 異步:在任意線程將request入隊呜达,請求響應(yīng)時在其他線程執(zhí)行回調(diào)
Calls 也可以從任意線程被取消谣蠢,這將取消還沒完成的Call。當Call被取消時查近,向請求體寫內(nèi)容的代碼和從響應(yīng)體讀內(nèi)容的代碼會報<code>IOException</code>
調(diào)度
對于同步執(zhí)行的Call眉踱,使用自定義的線程你就要管理這些同步請求。同步連接越多使用資源也越多霜威,網(wǎng)絡(luò)延時越低谈喳。
對于異步執(zhí)行的Call,調(diào)度器的實現(xiàn)了最大同步請求的策略戈泼,你可以設(shè)置每個IP的最大請求(默認是5)和所有請求的最大數(shù)(默認是64)叁执。