OkHttp 將 HTTP Header 視為 Map<String, List<String>>,提供鏈式 API:
header(name, value):設置單值(重複調用覆蓋)addHeader(name, value):追加多值(如多個 Set-Cookie)header(name):讀取最後一個值headers(name):讀取所有值列表Request request = new Request.Builder()
.url("https://www.baidu.com")
.header("User-Agent", "MyApp/1.0") // 設置單值
.addHeader("Accept", "application/json") // 追加值
.addHeader("Accept", "text/html") // 同名多值
.build();
Response response = client.newCall(request).execute();
System.out.println("Server: " + response.header("Server")); // 單值
System.out.println("Set-Cookie: " + response.headers("Set-Cookie")); // 列表
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://publicobject.com/helloworld.txt")
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("HTTP " + response.code());
// 打印 Header
Headers headers = response.headers();
for (int i = 0; i < headers.size(); i++) {
System.out.println(headers.name(i) + ": " + headers.value(i));
}
// 小文件直接讀字符串
System.out.println(response.body().string());
// 大文件必須用流處理!
// try (InputStream is = response.body().byteStream()) { ... }
}
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace(); // 網絡異常、DNS 失敗等
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("HTTP " + response.code());
}
// 注意:回調運行在工作線程,UI 更新需切主線程
System.out.println(response.body().string());
}
});
// 主線程繼續執行,不阻塞
OkHttpClient 線程安全、支持連接池,全局共享一個實例new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
response.body().string(),必須用 byteStream() 或 charStream().addInterceptor(chain -> {
Request req = chain.request().newBuilder()
.addHeader("Authorization", "Bearer " + token)
.build();
return chain.proceed(req);
})
call.cancel() 可取消進行中的請求| 問題 | 原因 | 解決 |
|---|---|---|
| 異步回調中更新 UI 崩潰 | 回調在工作線程 | Android: runOnUiThread / Handler / LiveData |
| 大文件 OOM | string() 全量加載內存 | 使用 byteStream() 分塊讀取 |
| 重定向循環 | 服務端誤配置 | 設置 .followRedirects(false) 或攔截器檢測 |
| 證書驗證失敗 | 自簽名/過期證書 | 配置自定義 SSLSocketFactory(僅測試環境) |