我查看了多篇有關此問題的帖子,并且大多數/所有帖子都有嘗試在輸出流之前創建輸入流的代碼。我明白了。我沒想到我在這里這樣做。在錯誤之前我的輸入流在哪里創建?
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
// ...
uj5u.com熱心網友回復:
從檔案 URLConnection::connect()
如果尚未建立此類連接,則打開指向此 URL 參考的資源的通信鏈接。
如果在連接已經打開時呼叫 connect 方法(由值為 true 的 connected 欄位指示),則該呼叫將被忽略。
URLConnection 物件經歷兩個階段:首先創建它們,然后連接它們。在創建之后和連接之前,可以指定各種選項(例如,doInput 和 UseCaches)。連接后,嘗試設定它們是錯誤的。依賴于被連接的操作,如 getContentLength,將在必要時隱式執行連接
因此,基本上您需要在手動打開與資源的連接OutputStream 后寫入,而無需考慮在該行程上設定了哪些標志或設定。那行不通。
實際上,您甚至不應該connect()自己呼叫該方法,因為依賴于連接的方法,例如getInputStream()并且getOutputStream() 已經將在需要時執行連接。
洗掉該行conn.connect()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/330778.html
標籤:爪哇 http http-headers 输入流 输出流
