轉(zhuǎn)載請(qǐng)注明出處 http://www.reibang.com/p/7919cd2685d3 (作者:韓棟)
本文為譯文,由于譯者水平有限憔儿,歡迎拍磚忆植,讀者也可以閱讀原文
【OkHttp3-基本用法,OkHttp3-使用進(jìn)階(Recipes)谒臼,OkHttp3-請(qǐng)求器(Calls)朝刊,OkHttp3-連接(Connections),OkHttp3-攔截器(Interceptor)】
OkHttp
一個(gè)支持Http和Http/2蜈缤,可適用于Android以及Java應(yīng)用的網(wǎng)絡(luò)請(qǐng)求客戶端拾氓。
概述
Http是現(xiàn)代網(wǎng)絡(luò)應(yīng)用的所常用的協(xié)議,它是一種數(shù)據(jù)傳輸?shù)拿浇榈赘纭?zhí)行高效的Http代碼可以讓應(yīng)用程序以更快的加載速度以及更少的帶寬去請(qǐng)求數(shù)據(jù)咙鞍。
OkHttp是一種高效的Http請(qǐng)求客戶端,通常情況下它擁有以下特點(diǎn):
- 當(dāng)同時(shí)向同一個(gè)主機(jī)發(fā)送大量請(qǐng)求時(shí)趾徽,Http/2允許并支持共用一個(gè)Socket。
- 連接池的存在可以有效減少請(qǐng)求的所需的準(zhǔn)備工作
- 可自動(dòng)壓縮下載數(shù)據(jù),降低下載數(shù)據(jù)的大小
- 自動(dòng)緩存響應(yīng)數(shù)據(jù)事示,可以避免每次都通過(guò)網(wǎng)絡(luò)去請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)
OkHttp可以在請(qǐng)求出現(xiàn)問(wèn)題時(shí) 堅(jiān)守 靈活處理:針對(duì)于常見(jiàn)的連接問(wèn)題臀脏,OkHttp會(huì)默認(rèn)自動(dòng)幫應(yīng)用做修復(fù)處理。如果你的服務(wù)器有多個(gè)IP地址,OkHttp將會(huì)在請(qǐng)求失敗時(shí)芳来,不斷嘗試連接另外的IP地址挎袜。當(dāng)服務(wù)器同時(shí)支持IPv4
+IPv6
,或者主機(jī)服務(wù)器出現(xiàn)數(shù)據(jù)故障時(shí)嗦明,這是非常有用的诗良。如果握手失敗,OkHttp會(huì)自動(dòng)初始化一個(gè)帶有TLS(SNI, ALPN)
協(xié)議的新連接向支持TLS 1.0
的服務(wù)器再次發(fā)起請(qǐng)求总处。
OkHttp的用法是非常簡(jiǎn)單的。OkHttp的請(qǐng)求/響應(yīng)的Api被設(shè)計(jì)成建造者模式 菱肖,并且它擁有不變性遇绞。它既可以在主線程中調(diào)用相應(yīng)的閉包,也可以在子線程中去回調(diào)相應(yīng)方法蚜迅。
OkHttp支持Android 2.3以上的版本刹帕。對(duì)于Java 應(yīng)用,最小版本需要JDK 1.7以上。
下載
okhttp-3.8.0.jar包下載鏈接
如果你通過(guò)向應(yīng)用導(dǎo)入Jar包的方式集成,你必須同時(shí)集成Okio,Okio為OkHttp提供了快速的I/O操作以及可調(diào)整大小的緩存區(qū)。
MAVEN
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.0</version>
</dependency>
GRADLE
compile 'com.squareup.okhttp3:okhttp:3.8.0'
范例
通過(guò)Get方法去請(qǐng)求一個(gè)URL
下面的代碼通過(guò)一個(gè)URL去下載一個(gè)文本熊镣,并且打印出文本內(nèi)容鬼吵。
public class GetExample {
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();
}
}
public static void main(String[] args) throws IOException {
GetExample example = new GetExample();
String response = example.run("https://raw.github.com/square/okhttp/master/README.md");
System.out.println(response);
}
}
通過(guò)Post方法向服務(wù)器傳遞數(shù)據(jù)
下面代碼展示了向服務(wù)器上傳數(shù)據(jù)的操作。
public class PostExample {
public static final MediaType JSON
= MediaType.parse("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();
}
}
String bowlingJson(String player1, String player2) {
return "{'winCondition':'HIGH_SCORE',"
+ "'name':'Bowling',"
+ "'round':4,"
+ "'lastSaved':1367702411696,"
+ "'dateStarted':1367702378785,"
+ "'players':["
+ "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39},"
+ "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}"
+ "]}";
}
public static void main(String[] args) throws IOException {
PostExample example = new PostExample();
String json = example.bowlingJson("Jesse", "Jake");
String response = example.post("http://www.roundsapp.com/post", json);
System.out.println(response);
}
}