Java 檢測 URL 連通性實戰:HttpURLConnection 實現與超時控制
核心代碼實現
/**
* 測試 URL 連通性
* @param address 目標 URL 地址
* @return HTTP 狀態碼,200 表示連通成功
* @throws Exception 網路異常或超時
*/
public static int testWsdlConnection(String address) throws Exception {
int status = 404; // 預設失敗狀態碼
try {
URL urlObj = new URL(address);
HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
// 關鍵配置
conn.setUseCaches(false); // 禁用快取
conn.setConnectTimeout(3000); // 連線超時 3 秒
conn.setReadTimeout(3000); // 讀取超時 3 秒(建議額外設定)
conn.setRequestMethod("GET"); // 明確指定方法
// 發起請求並獲取狀態碼
status = conn.getResponseCode();
if (status == 200) {
return status; // 成功連通
}
} catch (Exception e) {
e.printStackTrace();
throw e; // 向上拋出,由調用方決定處理邏輯
}
return status; // 非 200 狀態碼或異常情況
}
關鍵參數說明
| 方法 | 作用 | 建議值 |
| setConnectTimeout(ms) | 建立 TCP 連線最大等待時間 | 3000-5000 |
| setReadTimeout(ms) | 讀取資料最大等待時間 | 3000-10000 |
| setUseCaches(false) | 禁用 HTTP 快取,確保即時檢測 | 必設 |
| setRequestMethod("HEAD") | 僅獲取頭部,不下載內容(更輕量) | 視需求 |
常見 HTTP 狀態碼含義
- 200:OK - 連通成功
- 301/302:重導向 - 目標 URL 已遷移
- 401:Unauthorized - 需認證
- 403:Forbidden - 無權限
- 404:Not Found - 資源不存在
- 500:Internal Server Error - 伺服器錯誤
- 503:Service Unavailable - 服務暫不可用
進階用法建議
- 使用 HEAD 方法:僅檢測存活時,`conn.setRequestMethod("HEAD")` 可減少頻寬
- 處理 HTTPS:需配置 SSLContext 信任所有憑證(僅測試環境)
- 非同步批量檢測:大量 URL 檢測時,使用 `CompletableFuture` 或線程池並行
- 重試機制:網路抖動時可實施指數退避重試(如 3 次)
替代方案對比
| 方案 | 優點 | 缺點 |
| HttpURLConnection | 零依賴、JDK 內建、輕量 | API 較繁瑣、不支援 HTTP/2 |
| Apache HttpClient | 功能豐富、連線池、重試、HTTP/2 | 需引入依賴、體積較大 |
| OkHttp | 現代化、連線池、HTTP/2、攔截器 | 需引入依賴、Kotlin 優先 |
| Spring RestTemplate/WebClient | 整合 Spring 生態、宣告式 | 需 Spring 環境 |
對於簡單的連通性檢測,JDK 內建的 `HttpURLConnection` 完全足夠,無需額外依賴。生產環境建議封裝為工具類,統一異常處理、日誌記錄與指標監控。