早期瀏覽器(如 Navigator 3.0)的 URLConnection 不支援 POST 方法。Acme 套件提供 PostURLConnection 作為替代方案,雖現代環境已無此需求,但其源碼展示了 HTTP/1.0 協議底層交互細節,是理解 Socket 程式設計、HTTP 協議構造的優秀教材。
public class PostURLConnection {
private URL url;
private boolean doInput = false;
private boolean doOutput = true; // 預設支援輸出(POST)
private boolean useCaches = false;
private Vector reqHeaderNames = new Vector();
private Vector reqHeaderValues = new Vector();
private Vector resHeaderNames, resHeaderValues;
private Socket socket;
private OutputStream out;
private InputStream in;
private boolean connected = false;
private boolean inputStarted = false;
}
類實作 URLConnection 核心契約方法:
| 亮點 | 說明 |
|---|---|
| 純 Socket 實作 | 無依賴高層抽象,展示 HTTP 協議原貌 |
| 向量存儲頭部 | 支援多值頭部,大小寫不敏感查詢 |
| 狀態機設計 | connected/inputStarted 旗標防止重複操作 |
| 異常轉換 | ParseException 包裝為 IOException 統一拋出 |
| 局限 | 說明 |
|---|---|
| 僅支援 HTTP/1.0 | 無 Keep-Alive、Chunked Encoding、壓縮等現代特性 |
| 無連線池 | 每次請求新建 Socket,高併發效能差 |
| 同步阻塞 | 無非同步/回調機制 |
| 未處理重導向 | 3xx 狀態碼需上層自行處理 |
生產環境建議使用:
PostURLConnection 是 HTTP 協議手工構建的經典範例。研讀其源碼能深入理解:請求/回應格式、頭部解析、流雙向通訊、資源生命週期管理。雖已過時,但作為「拆解 HTTP 黑盒」的教具價值永存。