譯文——OkHttp, 安卓和Java應用的HTTP&HTTP2.0客戶端
阿新 • • 發佈:2019-02-11
概述
HTTP是現代應用網路互動資料資訊和媒介影像的主要傳輸方式。更有效率的HTTP傳輸會使你的網際網路應用載入更快,同時節省頻寬。
OkHttp是一個HTTP的客戶端,能夠有效地完成:
- 使用HTTP 2.0協議傳輸,所有請求使用同一個域名,共享一個socket。
- 如果HTTP2.0 不可用,通過連線池可以減少請求延遲
- 透明的GZIP壓縮減少了包下載的大小
- 響應快取避免了網路重複請求
OkHttp堅持認為網路環境是複雜混亂且問題不斷的。因此,他充分考慮了高可用,能夠自發地從連線問題中恢復:
如果你的服務能夠提供多個IP地址,當第一次連線失敗後,OkHttp會嘗試連線備選IP地址,當服務端是多資料中心架構時,這種方式相當有用。
OkHttp初始化新連線時採用的是新的TLS協議,比如SNI、ALPN,如果握手失敗,會降級為採用TLS 1.0協議。
使用OkHttp很簡單,API設計合理且不會輕易改變。同時支援同步阻塞式呼叫和非同步回撥函式呼叫。
版本支援:OkHttp支援安卓2.3及以上版本,JDK要求1.7及以上
下載及引用
要使用OkHttp,你需要同時支援Okio,用於快速IO和可調整的緩衝區,最新Jar的下載地址這裡寫連結內容。
OkHttp程式碼,例項,文件都共享在Github上。
MAVEN地址
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId >
<version>3.4.1</version>
</dependency>
GRADLE地址
compile 'com.squareup.okhttp3:okhttp:3.4.1'
例項
Get請求
package com.suning.okhttpdemo;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class GetUrlDemo {
String run(String url) throws IOException {
//由於本機設定了上網代理,因此OkHttp請求需要繫結代理
InetSocketAddress addr =
new InetSocketAddress("10.19.110.55", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
OkHttpClient client = new OkHttpClient.
Builder().proxy(proxy).build();
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 {
GetUrlDemo demo = new GetUrlDemo();
String reponse = demo.run("http://www.jd.com/");
System.out.println(reponse);
}
}
Post請求
package okhttp3.guide;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
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);
}
}