Android PUT请求报错java.net.ProtocolException问题求助
解决java.net.ProtocolException: cannot write request body after response has been read错误
这个错误我之前也踩过坑,核心原因就是调用顺序搞反了:用HttpURLConnection的时候,一旦你触发了读取服务器响应的操作(比如调用getResponseCode()、getInputStream()),连接就已经进入了接收响应的阶段,这时候再去写请求体,系统自然会抛出这个异常。
从你给出的代码片段来看,大概率是在写入请求体之前,不小心提前调用了获取响应的方法——比如先去检查响应码,再试图发送JSON数据,这绝对会触发这个问题。
修复步骤和注意事项
- 先搞定所有请求配置:设置请求方法(PUT)、开启输出流(
doOutput(true),默认是false,PUT/POST必须开启)、设置请求头(比如Content-Type),这些操作必须在写请求体之前完成。 - 优先写入请求体:通过
getOutputStream()拿到输出流,把你的JSON数据写进去,写完记得flush和关闭流。 - 最后再读取响应:这时候再调用
getResponseCode()或者getInputStream()就不会有问题了。
修正后的完整代码示例
class DoUpdateSlides extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { String JSONData = params[0]; try { URL url = new URL(API); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 第一步:配置请求参数,这部分必须在写请求体之前完成 httpURLConnection.setRequestMethod("PUT"); httpURLConnection.setDoOutput(true); // 关键:开启输出流才能发送请求体 httpURLConnection.setRequestProperty("Content-Type", "application/json"); // 适配JSON数据类型 // 第二步:写入请求体,这一步要先于任何读取响应的操作 OutputStream os = httpURLConnection.getOutputStream(); os.write(JSONData.getBytes(StandardCharsets.UTF_8)); // 指定UTF-8编码避免乱码 os.flush(); os.close(); // 第三步:现在才去获取并处理服务器响应 int responseCode = httpURLConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream is = httpURLConnection.getInputStream(); // 这里可以根据业务需求读取并处理响应内容 is.close(); } httpURLConnection.disconnect(); } catch (IOException e) { e.printStackTrace(); } return null; } }
额外提醒
- 绝对不要在写请求体之前调用任何和响应相关的方法,包括
getErrorStream(),只要触发了响应读取,连接状态就会锁定,无法再写入请求体。 - 请求头的设置必须在打开输出流前完成,一旦打开输出流,请求头就会被发送到服务器,之后再修改请求头就无效了。
内容的提问来源于stack exchange,提问作者raden vidi trysatria
相关产品推荐
相关产品推荐

