一、簡介
OkHttp3是一個輕量級的HTTP客戶端程序庫,被廣泛應用於Android、Java和Kotlin語言的應用程序中。OkHttp3比傳統的HttpURLConnection更加高效、簡單易用、功能豐富,尤其適合於請求網絡資源,並且可以用於處理REST API的調用。
OkHttp3的主要特點:
- 使用流行的Okio庫來進行緩存和輸入/輸出
- 支持同步和異步請求
- 支持請求方式(GET、POST等)、請求頭、請求體、響應、攔截器、緩存等多個功能
- 支持連接池和GZIP等自動壓縮機制
在下面,我們將會通過多個方面來闡述OkHttp3的主要特點和使用方法。
二、網絡請求
OkHttp3支持同步和異步的網絡請求。其中同步請求在當前線程中進行網絡訪問,由於會阻塞當前線程,不推薦在Android的主線程中進行;而異步請求則是在新的線程中進行網絡訪問。在進行網絡請求時,通常需要手動編寫網絡請求參數、請求頭、請求體等信息。
1、同步請求
在進行同步請求時,需要獲取一個OkHttpClient對象和一個Request對象。OkHttpClient是發出HTTP請求的入口,而Request對象則封裝了HTTP請求的參數、請求頭、請求體等信息。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.example.com")
.build();
Response response = client.newCall(request).execute();
在上面的代碼中,我們首先創建了一個OkHttpClient對象,接着通過Request.Builder添加了url信息,最後使用client.newCall發起同步請求,獲取Response對象
2、異步請求
在進行異步請求時,也需要獲取一個OkHttpClient對象和一個Request對象。不同的是,異步請求需要註冊一個回調方法來接收響應結果。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.example.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body().string());
}
});
在上面的代碼中,我們同樣使用Request.Builder添加了url信息,接着使用client.newCall發起異步請求,並且在enqueue方法中註冊了一個回調函數,當異步請求完成後,會自動回調onResponse方法。
三、請求頭和請求體
OkHttp3支持設置請求頭和請求體,可以使用Request.Builder添加請求頭,使用RequestBody類來添加請求體。以下是添加請求頭和請求體的示例:
RequestBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "admin")
.build();
Request request = new Request.Builder()
.url("http://www.example.com")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("Accept", "application/json; q=0.5")
.addHeader("Accept", "application/vnd.github.v3+json")
.post(formBody)
.build();
在上面的代碼中,我們使用FormBody構建了一個請求體,並且通過header和addHeader方法添加了兩個請求頭。
四、響應
OkHttp3的響應類是Response,其中包含響應狀態碼、響應頭和響應體等信息。
以下是一個獲得響應體的示例:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.example.com")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (response != null) {
response.close();
}
}
在上面的代碼中,我們通過response.isSuccessful()方法判斷請求是否成功,並且通過response.body()獲得了響應體,最後需要手動關閉響應。
五、攔截器
攔截器是OkHttp3的重要特性之一,可以在請求和響應的過程中攔截、修改和處理請求頭、響應頭和響應體等信息。通過實現Interceptor接口,就可以自定義攔截器,可以添加多個攔截器。
以下是一個添加攔截器的示例:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
})
.build();
Request request = new Request.Builder()
.url("http://www.example.com")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("Accept", "application/json; q=0.5")
.addHeader("Accept", "application/vnd.github.v3+json")
.build();
try {
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
在上面的代碼中,我們添加了一個Interceptor攔截器,用於輸出請求和響應信息,在請求和響應完成後,都會在控制台輸出相應的信息。
六、緩存
OkHttp3支持緩存,可以快速讀取緩存中的響應,而不需要進行網絡請求。有兩種方式來設置緩存,一種是設置無網絡緩存,另一種是設置有網絡緩存。無網絡緩存是指在沒有網絡的情況下也可以從緩存中讀取數據,而有網絡緩存是指在有網絡的情況下,將響應數據保存到緩存中。
以下是添加網絡緩存的示例:
File cacheDir = new File(context.getExternalCacheDir(), "cache");
Cache cache = new Cache(cacheDir, CACHE_SIZE);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
Request request = new Request.Builder()
.url("http://www.example.com")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("Accept", "application/json; q=0.5")
.addHeader("Accept", "application/vnd.github.v3+json")
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println("Response from cache");
} else {
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
e.printStackTrace();
}
在上面的代碼中,我們首先創建了一個cache目錄用於存放緩存,然後通過Cache構造函數創建一個緩存對象,最後在OkHttpClient.Builder中添加緩存對象。在發起請求時,如果有緩存,則會從緩存中讀取數據。
七、總結
OkHttp3是一個高性能、輕量級、簡單易用的Http客戶端程序庫,被廣泛應用於Android、Java和Kotlin語言的應用程序中。OkHttp3具有很多好用的特性,如支持同步/異步請求、請求頭、請求體、響應、攔截器、緩存等功能,開發者可以根據需要自由配置。在實際開發中,OkHttp3可以用於請求網絡資源,也可以用於處理REST API的調用等,相對於傳統的HttpURLConnection等工具,使用OkHttp3可以更加輕鬆地完成網絡請求的任務。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157410.html