類關係圖
java.net.URLConnection (abstract)
▲
│ extends
java.net.HttpURLConnection (concrete, package sun.net.www.protocol.http)
核心差異
| 特性 | URLConnection | HttpURLConnection |
| 協議 | 通用(HTTP、FTP、JAR、FILE…) | **僅 HTTP/HTTPS** |
| 請求方法 | 無 `setRequestMethod` | `setRequestMethod("GET"/"POST"/"PUT"…)` |
| 請求頭 | `setRequestProperty` 通用 | 繼承並新增 `setIfModifiedSince`、`setChunkedStreamingMode` 等 |
| 響應頭 | `getHeaderField` 通用 | 新增 `getResponseCode()`、`getResponseMessage()`、`getHeaderFieldDate()` 等 |
| 實例化 | `url.openConnection()` 返回具體子類 | HTTP URL 時自動返回此類型 |
實際使用模式
URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 強轉
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
os.write(jsonBytes);
}
int code = conn.getResponseCode(); // 僅 HttpURLConnection 有
if (code == 200) {
try (InputStream is = conn.getInputStream()) {
// 讀取響應
}
}
響應頭處理建議
- **業務需要時才解析**(如 `Set-Cookie`、`ETag`、`Last-Modified`、`Content-Disposition`)。
- 通用讀法:`conn.getHeaderField("Header-Name")` 或遍歷 `conn.getHeaderFields()`。