【问题标题】:java.net.ProtocolException: where is input being read?java.net.ProtocolException:在哪里读取输入?
【发布时间】:2021-12-06 09:32:51
【问题描述】:

我查看了多个有关此问题的帖子,其中大多数/所有帖子都有尝试在输出流之前创建输入流的代码。我明白了。我不认为我在这里这样做。错误前我的输入流是在哪里创建的?

URL url = new URL(myURL);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "application/json");
conn.setDoOutput(true);

// Grab, configure json input as myInput
// ...
byte[] input = myInput.getBytes();

conn.connect();

// Write as post body
try(OutputStream os = conn.getOutputStream()) {
    os.write(input);    // <-- java.net.ProtocolException Error "Cannot write output after reading input" here
}

// Attempt to read response using InputStream
// ...

【问题讨论】:

标签: java http http-headers inputstream outputstream


【解决方案1】:

来自URLConnection::connect()的文档

如果尚未建立此 URL 引用的资源的通信链接,则打开此链接。

如果在连接已经打开时调用 connect 方法(由值为 true 的 connected 字段指示),则忽略该调用。

URLConnection 对象经历两个阶段:首先它们被创建,然后它们被连接。在创建之后和连接之前,可以指定各种选项(例如,doInput 和 UseCaches)。连接后,尝试设置它们是错误的。依赖于连接的操作,如 getContentLength,将在必要时隐式执行连接

所以基本上你需要写在OutputStream 之后你已经手动打开了与资源的连接,而不关心在该进程上设置了哪些标志或设置。那是行不通的。

实际上,您甚至不应该自己调用方法connect(),因为依赖于连接的方法,例如getInputStream()getOutputStream() 如果需要,已经会执行连接强>.

删除conn.connect()这一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2020-08-15
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多