簡體   English   中英

為什么閱讀 HTTP 請求的響應正文很重要?

[英]Why is it important to read the response body of an HTTP request?

了解 Java 中的 HTTP 請求。 我想知道閱讀響應正文是否對於保持連接活躍至關重要。

這是一個示例代碼塊(將消息發布到某個 URL):

private void writeToConnection(String url, String msg) throws IOException {
    try {
        HttpURLConnection connection = open(url);
        // "Try with resources" 
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(connection.getOutputStream()))) {
            writer.write(msg);
        }
        // Why do I need this line? 
        IOUtils.readStringFromStream(connection.getInputStream());
        int code = connection.getResponseCode(); 
        System.out.println(String.format("Returned response code %d.", code));
    } catch (IOException e) { 
        e.printStackTrace();
    }
}

為什么需要讀取輸入 stream? 方法readStringFromStream返回一個字符串,但該字符串沒有被分配給任何東西。 這是否確保連接保持活動狀態? 如果是這樣,當方法中的第一行打開一個新連接時,連接如何保持活動狀態? 如果下一批要寫入的數據調用這個方法,那不就是丟棄舊的連接並打開一個新的連接嗎?

我相信這段代碼的意圖確實是消耗響應體,以便可以重用連接。 但是,我不確定這種方法是否正確; 它也可能取決於您使用的 Java 的版本。

首先,獲取連接的InputStream並關閉它就足夠了; 在幕后,仍然需要讀取主體,但關閉 stream 會向連接處理程序發出信號,表明應用程序要跳過主體,處理程序可以在將連接放入緩存之前讀取並丟棄內容以供重用.

但是,根據狀態,可能會出現錯誤 stream 而不是輸入 stream。 即使在這種情況下,也需要在重新使用連接之前消耗主體,但是許多應用程序(例如這個)不會費心閱讀錯誤消息的主體。 然而,從 Java 7 開始,如果錯誤體足夠小,它會被自動消耗和緩沖。

在幕后,連接緩存用於保留打開的連接。 盡管方法名稱表明每次都會打開一個新連接,但實際上首先會檢查緩存是否有打開的連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM