默認
true。表示意圖從 URL 連接讀取數據(即調用getInputStream())。設為false可節省資源,若僅發送數據不需響應體。
默認
false。表示意圖向 URL 連接寫入數據(即調用getOutputStream())。POST/PUT/PATCH 等需請求體的方法必須設為true。
| HTTP 方法 | 需請求體? | 需響應體? | setDoOutput | setDoInput |
|---|---|---|---|---|
| GET | 否 | 是 | false (默認) | true (默認) |
| POST | 是 | 通常是 | true | true (默認) |
| PUT | 是 | 通常是 | true | true (默認) |
| DELETE | 否/是 | 視情況 | 視情況 | 視情況 |
| HEAD | 否 | 否(僅頭) | false | false |
URL url = new URL("https://api.example.com/users");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true); // 必須!否則 getOutputStream() 拋異常
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
try (OutputStream os = conn.getOutputStream()) {
String json = "{\"name\":\"John\",\"age\":30}";
os.write(json.getBytes(StandardCharsets.UTF_8));
}
int code = conn.getResponseCode();
try (InputStream is = code >= 400 ? conn.getErrorStream() : conn.getInputStream()) {
String response = new String(is.readAllBytes(), StandardCharsets.UTF_8);
System.out.println(response);
}
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(false); // 節省輸入流資源
conn.getOutputStream().write(payload);
int code = conn.getResponseCode(); // 僅檢查狀態碼
// 不調用 getInputStream()/getErrorStream()
java.net.ProtocolException: Cannot write output after reading inputgetInputStream() 後再調用 getOutputStream()。setDoOutput(true) 導致 java.net.ProtocolException: DoOutput is falsesetDoOutput(true)setFixedLengthStreamingMode(len) 或 setChunkedStreamingMode(len) 可避免大請求體緩衝到堆內存http.keepAlive=true(默認),配合連接池(如 Apache HttpClient、OkHttp)更高效setConnectTimeout(5000)、setReadTimeout(10000) 必須設置,防止掛死核心口訣:要寫出流必開 DoOutput,要讀入流默認 DoInput,先出後入不倒序。