URL 物件HttpURLConnectionsetDoOutput(true)、setRequestMethod("POST")、setRequestProperty 等OutputStream 寫入請求體getInputStream() 觸發真正送出並讀取回應public String postRequest(String urlString, String jsonBody) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 設定請求參數
conn.setDoOutput(true); // 允許輸出流(POST 必須)
conn.setDoInput(true); // 允許輸入流(預設 true)
conn.setUseCaches(false); // POST 不使用快取
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
conn.setConnectTimeout(10000); // 連線逾時 10 秒
conn.setReadTimeout(10000); // 讀取逾時 10 秒
// 寫入請求體
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonBody.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
// 讀取回應
int responseCode = conn.getResponseCode();
InputStream is = (responseCode >= 200 && responseCode < 300)
? conn.getInputStream()
: conn.getErrorStream();
try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) sb.append(line);
return sb.toString();
} finally {
conn.disconnect();
}
}
connect() 或 getOutputStream() 前設定所有屬性,否則會拋出 IllegalStateException。OutputStream 後不可再寫;若需重送必須重新建立連線。getErrorStream(),否則會丟失錯誤訊息。AndroidManifest.xml 設定 android:usesCleartextTraffic="true" 或改用 HTTPS。現代 Android 開發建議直接使用 OkHttp,程式碼更簡潔且支援連線池、自動重試、攔截器等功能:
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json; charset=utf-8"));
Request request = new Request.Builder()
.url(urlString)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
掌握 HttpURLConnection 底層運作有助於除錯,但實務上強烈建議採用成熟的網路庫(OkHttp、Retrofit)以提升開發效率與穩定性。