使用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
相关产品推荐
相关产品推荐

