一、OkHttp3簡介
OkHttp3是一個開源的Java/Android網絡框架,由Square公司開發維護。它支持同步、異步請求和文件上傳下載,簡單易用,具有高效的速度和強大的擴展性。OkHttp3是網絡請求的首選框架之一,也是Retrofit2的底層網絡請求庫。
二、OkHttp3 Maven配置
在pom.xml文件中添加以下依賴項:
“`xml
com.squareup.okhttp3
okhttp
4.9.1
“`
OkHttp3是Square公司開發的,使用Maven管理依賴需要添加Square倉庫。如果沒有添加Square倉庫,則需要在pom.xml中添加以下內容:
“`xml
square
https://repo1.maven.org/maven2/com/squareup/
“`
三、OkHttp3發送HTTP請求
發送HTTP請求需要先創建OkHttpClient對象,然後創建請求對象Request和響應對象Response。發送請求可以使用同步或異步方式。
1、創建OkHttpClient對象:
“`java
OkHttpClient client = new OkHttpClient();
“`
2、創建請求對象Request:
“`java
Request request = new Request.Builder()
.url(“http://www.example.com”)
.build();
“`
3、同步發送請求並獲取響應對象Response:
“`java
Response response = client.newCall(request).execute();
“`
4、異步發送請求並獲取響應對象Response:
“`java
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 {
//處理響應
}
});
“`
使用異步方式發送請求可以避免阻塞主線程,提高應用的響應速度。
四、OkHttp3配置請求參數
OkHttpClient.Builder可以設置連接超時時間、讀取超時時間、寫入超時時間、重試次數、緩存等參數。Request.Builder可以設置請求頭、請求參數、請求方式等參數。
1、設置超時時間:
“`java
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
“`
2、設置請求頭:
“`java
Request request = new Request.Builder()
.url(“http://www.example.com”)
.addHeader(“User-Agent”, “Mozilla/5.0”)
.build();
“`
3、設置請求參數:
“`java
FormBody formBody = new FormBody.Builder()
.add(“username”, “admin”)
.add(“password”, “123456”)
.build();
Request request = new Request.Builder()
.url(“http://www.example.com”)
.post(formBody)
.build();
“`
4、設置請求方式:
“`java
Request request = new Request.Builder()
.url(“http://www.example.com”)
.get()
.build();
“`
五、OkHttp3處理響應
OkHttp3的響應對象Response包含響應頭、響應體和響應碼等信息。響應體是服務器返回的數據,可以是文本、圖片、音頻或視頻等。根據不同的數據類型可以使用不同的方式來處理響應。
1、獲取響應頭:
“`java
Response response = client.newCall(request).execute();
System.out.println(response.headers());
“`
2、獲取文本響應體:
“`java
Response response = client.newCall(request).execute();
String body = response.body().string();
System.out.println(body);
“`
3、獲取字節流響應體:
“`java
Response response = client.newCall(request).execute();
byte[] data = response.body().bytes();
“`
4、下載文件響應體:
“`java
Response response = client.newCall(request).execute();
ResponseBody body = response.body();
InputStream in = body.byteStream();
Files.copy(in, new File(“example.jpg”).toPath());
in.close();
“`
六、OkHttp3連接池管理
OkHttp3連接池管理可以提高應用的性能和穩定性,減少網絡請求的延遲和連接失敗率。默認情況下,OkHttp3會為每個主機創建一個連接池,最大連接數為5,每個連接的空閑時間為5分鐘。連接池管理可以根據實際情況進行調整。
1、設置連接池和連接數:
“`java
ConnectionPool pool = new ConnectionPool(5, 5, TimeUnit.MINUTES);
OkHttpClient client = new OkHttpClient.Builder()
.connectionPool(pool)
.build();
“`
2、關閉連接池:
“`java
client.connectionPool().evictAll();
“`
七、OkHttp3緩存管理
OkHttp3緩存管理可以減少網絡請求的次數和流量,在沒有網絡的情況下使用緩存可以提高應用的響應速度。默認情況下,OkHttp3不使用緩存。緩存管理需要兩個步驟:首先設置緩存目錄和緩存大小,然後將cache對象傳遞給Okhttpclient中。
1、設置緩存目錄和緩存大小:
“`java
Cache cache = new Cache(new File(“cache”), 10 * 1024 * 1024);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
“`
2、清空緩存:
“`java
client.cache().evictAll();
“`
八、OkHttp3日誌管理
OkHttp3提供了一個Interceptor用於捕獲請求和響應的日誌。開啟日誌需要添加以下依賴項:
“`xml
com.squareup.okhttp3
logging-interceptor
4.9.1
“`
在OkHttpClient.Builder中添加攔截器即可開啟日誌:
“`java
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
“`
九、OkHttp3異常處理
網絡請求過程中可能會出現各種異常,需要使用try-catch語句進行捕獲並處理。常見的異常有IOException、SocketTimeoutException、SSLHandshakeException等。
1、IOException異常:
“`java
try {
Response response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
“`
2、SocketTimeoutException異常:
“`java
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
try {
Response response = client.newCall(request).execute();
} catch (SocketTimeoutException e) {
e.printStackTrace();
}
“`
3、SSLHandshakeException異常:
“`java
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), trustManager)
.hostnameVerifier((hostname, session) -> true)
.build();
try {
Response response = client.newCall(request).execute();
} catch (SSLHandshakeException e) {
e.printStackTrace();
}
“`
十、完整例子
下面是一個完整的例子,用於發送POST請求,並處理響應的文本數據。
“`java
public static void main(String[] args) throws IOException {
System.out.println(doPost(“http://www.example.com/login”, “username=admin&password=123456”));
}
public static String doPost(String url, String requestBody) throws IOException {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
RequestBody body = RequestBody.create(requestBody, MediaType.parse(“application/x-www-form-urlencoded”));
Request request = new Request.Builder()
.url(url)
.addHeader(“User-Agent”, “Mozilla/5.0”)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException(“Unexpected code ” + response);
return response.body().string();
}
}
“`
十一、總結
本文從OkHttp3的簡介、Maven配置、HTTP請求、請求參數配置、處理響應、連接池管理、緩存管理、日誌管理、異常處理等多個方面對OkHttp3進行了詳細的介紹和演示。OkHttp3是一個高效、易用、可擴展的網絡框架,可以滿足大部分的HTTP請求和響應處理需求。在具體使用時,需要根據實際情況進行調整和優化,以滿足應用的性能和穩定性要求。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/302906.html