通過(guò)該篇文章大家可以了解到如下幾點(diǎn)
- 什么是OkHttp
- 為什么要用OkHttp
- OkHttp使用的基本要求
- 如何使用OkHttp
- OkHttp內(nèi)部是如何構(gòu)造請(qǐng)求和響應(yīng)的
- 專題的后續(xù)內(nèi)容
什么是OkHttp
HTTP協(xié)議拍摇,即超文本傳輸協(xié)議(Hypertext transfer protocol)杀糯。是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)(WWW = World Wide Web)服務(wù)器之間互相通信的規(guī)則嫂丙,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議鸭廷。
而OkHttp本質(zhì)是一個(gè)Http客戶端租副,我們可以通過(guò)OkHttp發(fā)送向服務(wù)方發(fā)送Http請(qǐng)求麸粮,然后獲取相應(yīng)的響應(yīng)內(nèi)容甘桑。
為什么要用OkHttp
在Java平臺(tái)上缩抡,我們一般會(huì)使用Apache HttpClient 作為 Http 客戶端去發(fā)送 Http 請(qǐng)求,然后再對(duì)響應(yīng)進(jìn)行處理哗讥,那為什么要使用OkHttp呢嚷那?
- 首先HttpClient API眾多,代碼復(fù)雜杆煞,而且需要用戶關(guān)心資源的回收
- 而OkHttp內(nèi)部結(jié)構(gòu)清晰魏宽,它的請(qǐng)求/響應(yīng)API 使用建造者模式來(lái)設(shè)計(jì)腐泻,API設(shè)計(jì)簡(jiǎn)單高效。
- 更重要的是它是一個(gè)高效的HTTP客戶端队询,允許所有同一個(gè)主機(jī)地址的請(qǐng)求共享同一個(gè)socket連接派桩,連接池減少請(qǐng)求延時(shí)
- 同時(shí)支持透明的GZIP壓縮減少響應(yīng)數(shù)據(jù)的大小
- 支持緩存響應(yīng)內(nèi)容,避免一些完全重復(fù)的請(qǐng)求
OkHttp使用的基本要求
OkHttp 適用于 Java 8+. 它有一個(gè)更加高效的I/O依賴包Okio蚌斩。【詳細(xì)版本要求傳送門】
如何使用OkHttp
下面給出兩個(gè)例子铆惑,一個(gè)是通過(guò)Get請(qǐng)求從一個(gè)URL中獲取內(nèi)容,并打印為字符串凳寺。完整代碼??
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
另一個(gè)是將數(shù)據(jù)推送到服務(wù)器端鸭津,完整代碼??
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
OkHttp內(nèi)部是如何構(gòu)造請(qǐng)求和響應(yīng)的
當(dāng)我們發(fā)送一個(gè)Http請(qǐng)求的時(shí)候,首先肯定是思考如何構(gòu)造一個(gè)請(qǐng)求肠缨,而在OkHttp內(nèi)部逆趋,我們只需要通過(guò)一個(gè)類Request就可以構(gòu)造出我們需要的任何類型的請(qǐng)求,同樣我們只需要通過(guò)一個(gè)類Response就可以讀取到任何類型的響應(yīng)。
下面是OkHttp的對(duì)請(qǐng)求封裝的實(shí)現(xiàn)類Request
下面這張圖第一眼看起來(lái)復(fù)雜晒奕, 其實(shí)大家只需要看最下面的Request類闻书,它非常簡(jiǎn)單,只包含我們上面提到的url脑慧、method魄眉、headers、body和tag闷袒、cacheControl坑律,剩下的只是該類的實(shí)例域名的實(shí)現(xiàn)類。
其中 RequestBody是一個(gè)抽象類囊骤,下圖是該類的Diagram圖晃择。
我們可以通過(guò)如下的建造者模式的方式構(gòu)建我們需要的請(qǐng)求。
Request request = new Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.method("GET",formBody)
.build();
下面是OkHttp的對(duì)請(qǐng)求封裝的實(shí)現(xiàn)類Response
到目前未知也物,我們已經(jīng)了解了OkHttp的request的內(nèi)容宫屠,下面給出response的Diagram圖,圖中沒(méi)有給出cacheControl滑蚯。
從上圖我們可以清楚地看到OkHttp的response是由哪些內(nèi)容組成的浪蹂,我們可以通過(guò)讀取相應(yīng)的實(shí)例域去獲取我們感興趣的響應(yīng)內(nèi)容。
專題的后續(xù)內(nèi)容
本專題的OkHttp大致分為如下幾個(gè)模塊.
- OkHttp——Calls
- Connections
- Interceptors
- HTTPS
- Event
-
Cache
后續(xù)連載的文章會(huì)依次介紹各個(gè)模塊 告材。