You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HttpURLConnection和OutputStreamWriter发起POST调用时请求体为空如何解决

问题原因分析

你的代码核心问题是请求触发和请求体写入的执行顺序错误,另外还有几个可优化的风险点:

  • 核心错误:HttpURLConnection 会在调用 getResponseCode()、getInputStream() 这类方法时正式发起网络请求。你在请求体还没写完、输出流还没刷新/关闭的情况下就先调用了getResponseCode(),等于空请求体已经发送到服务端,后续执行的flush()、close()完全不会生效。
  • 隐性风险:没有显式设置请求方法为POST,虽然setDoOutput(true)会默认将请求方法改为POST,但显式声明可以避免未知异常。
  • 兼容问题:没有设置Content-Length请求头,部分服务端对未指定长度的分块传输请求处理可能存在异常。
修正后的代码示例
String jsonstring = "{\"id\":\"1233\", \"userName\" : \"jump2\"}";
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonstring);
System.out.println(jsonObject.toJSONString());
Long currentTime = System.currentTimeMillis();
URL restUrl = new URL("http://myservers.com/v1/register");
HttpURLConnection urlConnection = (HttpURLConnection) restUrl.openConnection();
// 显式设置请求方法为POST
urlConnection.setRequestMethod("POST");
urlConnection.addRequestProperty("X-CORRELATION-ID", currentTime.toString());
urlConnection.addRequestProperty("X-AUTH-APIKEY", "dDEdfaeFFDdddDF");
urlConnection.addRequestProperty("Accept","application/json");
urlConnection.addRequestProperty("Content-Type","application/json");

urlConnection.setDoOutput(true);
// 先写请求体、刷新关闭输出流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(urlConnection.getOutputStream(), "UTF-8");
jsonObject.writeJSONString(outputStreamWriter);
outputStreamWriter.flush();
outputStreamWriter.close();
// 全部准备完成后再触发请求获取返回值
System.out.println(urlConnection.getResponseCode());
System.out.println(urlConnection.getRequestMethod());
System.out.println(urlConnection.getContentEncoding());
urlConnection.disconnect();

内容的提问来源于stack exchange,提问作者stuck99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:12:01