特點:高性能,支持異步請求,連接池優化
官方文檔:提供快速入門指南和高級功能(如攔截器、連接池)的詳細說明,GitHub倉庫包含豐富示例。
社區資源:中文教程豐富,GitHub高星標(40k+),社區活躍度高,問題響應快。
維護狀態:由Square公司持續維護,更新頻繁,支持最新TLS和HTTP/2特性。
// 1. 添加 Maven 依賴
// <dependency>
// <groupId>com.squareup.okhttp3</groupId>
// <artifactId>okhttp</artifactId>
// <version>4.9.3</version>
// </dependency>import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class OkHttpExample {public static void main(String[] args) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://api.example.com/data").build();try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Response: " + result);}} catch (Exception e) {e.printStackTrace();}}
}
OkHttp 核心用法詳解(從基礎到實戰)
一、基礎用法
1. 創建 OkHttpClient 實例
// 基礎配置(可擴展代理、超時等)
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) // 連接超時.readTimeout(30, TimeUnit.SECONDS) // 讀取超時.writeTimeout(30, TimeUnit.SECONDS) // 寫入超時.retryOnConnectionFailure(true) // 連接失敗自動重試.build();
2. 構建請求(GET 示例)
Request request = new Request.Builder().url("https://api.example.com/data").header("User-Agent", "OkHttp Example") // 添加請求頭.get() // 默認是GET,可省略.build();
3. 發送請求
-
同步請求(阻塞當前線程):
try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Response: " + result);} else {System.out.println("Error: " + response.code());} } catch (IOException e) {e.printStackTrace(); }
-
異步請求(非阻塞,通過回調處理):
client.newCall(request).enqueue(new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Async Response: " + result);}}@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();} });
二、POST 請求與數據提交
1. 提交 JSON 數據
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");String jsonBody = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
RequestBody body = RequestBody.create(jsonBody, JSON);Request request = new Request.Builder().url("https://api.example.com/post").post(body).build();
2. 提交表單數據
RequestBody formBody = new FormBody.Builder().add("username", "user").add("password", "pass").build();Request request = new Request.Builder().url("https://api.example.com/login").post(formBody).build();
三、文件上傳與下載
1. 文件上傳(Multipart)
File file = new File("path/to/file.jpg");
RequestBody fileBody = RequestBody.create(file, MediaType.parse("image/jpeg"));RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), fileBody).addFormDataPart("description", "Test upload").build();Request request = new Request.Builder().url("https://api.example.com/upload").post(requestBody).build();
2. 文件下載
Request request = new Request.Builder().url("https://api.example.com/file.zip").build();try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {byte[] fileData = response.body().bytes();Files.write(Paths.get("downloaded.zip"), fileData);}
}
四、高級功能
1. 攔截器(Logging & Header 修改)
// 日志攔截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);// 自定義 Header 攔截器
Interceptor headerInterceptor = chain -> {Request originalRequest = chain.request();Request newRequest = originalRequest.newBuilder().header("Authorization", "Bearer token123").build();return chain.proceed(newRequest);
};OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).addInterceptor(headerInterceptor).build();
2. 連接池配置(優化性能)
ConnectionPool pool = new ConnectionPool(5, 5, TimeUnit.MINUTES); // 最大空閑連接5,保持5分鐘
OkHttpClient client = new OkHttpClient.Builder().connectionPool(pool).build();
五、最佳實踐
- 復用 OkHttpClient 實例:避免頻繁創建/銷毀,減少資源開銷。
- 異步請求優先:在 Android 等 UI 線程受限環境中,必須使用異步請求。
- 合理配置超時:根據業務場景調整?
connectTimeout
、readTimeout
。 - 使用攔截器統一處理:日志、錯誤重試、Header 添加等邏輯集中管理。
- 大文件下載用流式處理:避免?
response.body().string()
?導致內存溢出,改用?response.body().byteStream()
?逐塊讀取。
六、常見問題
-
Q:如何取消正在進行的請求?
A:調用?Call.cancel()
,需在回調中檢查?isCanceled()
。 -
Q:如何處理 HTTPS 證書問題?
A:通過?CertificatePinner
?配置證書固定,或自定義?X509TrustManager
(需謹慎)。 -
Q:OkHttp 與 Retrofit 的關系?
A:Retrofit 是基于 OkHttp 的 RESTful 客戶端封裝,提供更簡潔的 API 調用方式。
通過以上內容,您已掌握 OkHttp 的核心用法,可根據項目需求靈活選擇同步/異步請求、配置攔截器、優化連接池,實現高效穩定的網絡通信。