HttpURLConnection使用及優化

文章目錄

  • 簡介
  • 使用示例
    • GET請求
    • POST請求
  • HttpURLConnection優化
    • 1. 設置合適的超時時間
    • 2. 指定字符編碼
    • 3. 正確處理響應編碼
    • 4. 使用壓縮傳輸(如果適用)
    • 5. 關閉連接釋放資源
    • 6. 啟用持久連接(Keep-Alive),減少握手開銷

簡介

HttpURLConnection是Java標準庫中的抽象子類,專門用于處理HTTP協議通信。通過URL對象的方法可獲取其實例,支持配置請求方法、超時設置、請求頭管理及響應處理。該抽象類提供對GET、POST等HTTP方法的實現,涵蓋表單提交、輸入輸出流操作及狀態碼判斷等核心功能,廣泛應用于Java應用程序的網絡通信模塊。

使用示例

GET請求

import java.net.*;
import java.io.*;public class HttpExample {public static void main(String[] args) throws IOException {// 創建URL對象URL url = new URL("https://api.example.com/data");// 打開連接(返回URLConnection,需強制轉換為HttpURLConnection)HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 設置請求方法(默認為GET)connection.setRequestMethod("GET");// 配置連接參數(可選)connection.setConnectTimeout(5000);  // 連接超時5秒connection.setReadTimeout(5000);     // 讀取超時5秒// 發送請求并獲取響應碼int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 處理響應if (responseCode == HttpURLConnection.HTTP_OK) {// 讀取響應數據BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}reader.close();System.out.println("Response: " + response.toString());}// 斷開連接(釋放資源)connection.disconnect();}
}

POST請求

import java.io.*;
import java.net.*;
import java.util.zip.GZIPInputStream;public class HttpJsonExample {public static void main(String[] args) {try {// 創建URLURL url = new URL("https://api.example.com/users");HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 配置請求connection.setRequestMethod("POST");connection.setDoOutput(true);connection.setConnectTimeout(5000);connection.setReadTimeout(5000);// 設置請求頭connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("Accept", "application/json");connection.setRequestProperty("Accept-Encoding", "gzip");// 寫入請求體String requestBody = "{\"name\":\"Alice\",\"email\":\"alice@example.com\"}";try (OutputStream os = connection.getOutputStream()) {byte[] input = requestBody.getBytes("utf-8");os.write(input, 0, input.length);}// 獲取響應int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 讀取響應內容InputStream inputStream;if (responseCode >= 200 && responseCode < 300) {inputStream = connection.getInputStream();} else {inputStream = connection.getErrorStream();}// 處理壓縮if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) {inputStream = new GZIPInputStream(inputStream);}// 讀取響應文本try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {String line;StringBuilder response = new StringBuilder();while ((line = reader.readLine()) != null) {response.append(line);}System.out.println("Response: " + response.toString());}} catch (IOException e) {e.printStackTrace();}}
}

HttpURLConnection優化

在使用 HttpURLConnection 進行 HTTP 請求時,為了提高請求效率并確保無亂碼,你可以采取以下幾個步驟:

1. 設置合適的超時時間

連接超時 (setConnectTimeout): 設置建立連接的最長時間。

讀取超時 (setReadTimeout): 設置從服務器讀取數據的最長時間。

例如,設置連接超時和讀取超時為5秒和10秒:

HttpURLConnection connection = (HttpURLConnection) new URL("http://example.com").openConnection();
connection.setConnectTimeout(5000); // 5秒
connection.setReadTimeout(10000); // 10秒

2. 指定字符編碼

確保在發送請求和接收響應時使用正確的字符編碼。對于 GET 和 POST 請求,通常在 URL 中或者在請求頭中指定編碼。

對于 GET 請求,URL 應該已經編碼好。

對于 POST 請求,可以在請求頭中設置 Content-Type 并指定字符集,例如:

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

3. 正確處理響應編碼

在讀取響應時,確保使用了正確的字符編碼來解析響應體。通常,響應的編碼可以在響應頭中找到,例如 Content-Type 中的 charset 參數。

InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {response.append(line);
}
reader.close();

輔助方法 getCharsetFromContentType 可以從 Content-Type 頭中提取字符集:

private static String getCharsetFromContentType(String contentType) {String charset = null;if (contentType != null && contentType.contains("charset=")) {charset = contentType.substring(contentType.indexOf("charset=") + 8);} else {charset = "UTF-8"; // 默認字符集}return charset;
}

4. 使用壓縮傳輸(如果適用)

如果服務器支持 gzip 壓縮,可以在請求頭中添加 Accept-Encoding 來請求壓縮的響應:

connection.setRequestProperty("Accept-Encoding", "gzip");

5. 關閉連接釋放資源

確保在完成請求后關閉連接,釋放網絡資源。可以使用 try-with-resources 語句來自動管理資源:

try (HttpURLConnection connection = (HttpURLConnection) new URL("http://example.com").openConnection()) {// 設置連接和讀取超時等操作// 獲取響應等操作
} catch (IOException e) {e.printStackTrace();
} // try-with-resources 會自動關閉連接

6. 啟用持久連接(Keep-Alive),減少握手開銷

HTTP/1.1 默認啟用持久連接(Keep-Alive),可復用 TCP 連接處理多次請求(避免重復三次握手),但需正確配置請求頭并合理管理連接生命周期。

// 顯式聲明持久連接(HTTP/1.1默認支持,此配置可增強兼容性)
connection.setRequestProperty("Connection", "keep-alive");// 復用連接:若多次請求同一服務器,可復用當前連接(無需每次調用disconnect())
// 注意:僅在多次請求且服務器支持持久連接時生效

注意:若不再使用連接,需在finally中調用connection.disconnect()釋放資源;但多次請求同一服務器時,可延遲調用以復用連接。
通過上述步驟,你可以提高 HTTP 請求的效率并確保無亂碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Springai】項目實戰進度和規劃

項目概述 新開一個用于學習實踐springai的項目&#xff0c;springai-novel是一個基于前后端分離的現代化AI實踐應用 前端技術棧 Vue 3 TypeScriptVite Naive UI vicons/ionicons5 后端技術棧 JDK17Spring AI MySQL milvus ollama 已實現功能 (?) ? springaimysql后…

知微傳感Lkam系列線掃輪廓儀SDK例程篇:SDK安裝及VS工程配置

寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有&#xff1a; 1、便利他人應用3D相機&#xff0c;本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋&#xff1b;2、促進行業發展及交流。 歡迎與我深入交流&#xff1a;微信號&#xff1a;liu_zhi…

機器學習4——參數估計之貝葉斯估計

貝葉斯估計 問題建模&#xff1a; 后驗概率公式&#xff1a; P ( ω i ∣ x , D ) P ( x ∣ ω i , D i ) P ( ω i ) ∑ j 1 c P ( x ∣ ω j , D j ) P ( ω j ) P\left(\omega_i \mid \mathbf{x}, \mathcal{D}\right)\frac{P\left(\mathbf{x} \mid \omega_i, \mathcal{D…

【C++】命令模式

目錄 一、模式核心概念與結構二、C 實現示例&#xff1a;遙控器與家電控制三、命令模式的關鍵特性四、應用場景五、命令模式與其他設計模式的關系六、C 標準庫中的命令模式應用七、優缺點分析八、實戰案例&#xff1a;數據庫事務命令九、實現注意事項如果這篇文章對你有所幫助&…

基于librdkafka開發的C++客戶端,生產者生產發送數據失敗問題處理

我們的項目使用了開源的librdkafka庫&#xff0c;實現向kafka服務器生產發送數據的功能。使用的librdkafka的版本是1.9.0。 作為客戶端程序&#xff0c;在開發時和客戶協商確認后&#xff0c;支持了SASL_PLAINTEXT認證。以下概念解釋引用自通義千問AI SASL (Simple Authentic…

OpenGL之yaw、pitch、fov 和 lookAt

在 3D 圖形學中&#xff0c;yaw、pitch、fov 和 lookAt 都是控制攝像機&#xff08;Camera&#xff09;行為的關鍵參數&#xff0c;但它們的 作用層級 和 使用場景 不同。 1. yaw、pitch、fov 的作用 (1) yaw&#xff08;偏航角&#xff09; 作用&#xff1a;控制攝像機 左右…

STM32-第一節-新建工程,GPIO,點亮LED,蜂鳴器

一、新建工程&#xff1a; 1.Keil中新建工程&#xff0c;選擇開發板型號。 2.工程文件夾建立Start&#xff0c;Library等分類&#xff0c;復制模版工程中的文件到工程文件夾中。 3.在Keil中添加分組&#xff0c;添加文件。 4.工程選項設置&#xff1a; c/c中&#xff1a;Inc…

Rust標量、復合類型與自定義類型、第三方并發結構

以下是 Rust 中標量類型、對象類型&#xff08;含結構體、復合類型、堆分配類型&#xff09;以及常用第三方并發數據結構的完整分類、示例和區別對比&#xff0c;幫助你系統掌握它們的本質異同&#xff1a; &#x1f7e2; 一、標量類型&#xff08;Scalar Types&#xff0c;存儲…

基于STM32溫濕度檢測—串口顯示

基于STM32溫濕度檢測 &#xff08;仿真&#xff0b;程序&#xff09; 功能介紹 具體功能&#xff1a; 1.使用DHT11檢測溫濕度&#xff1b; 2.單片機處理完控制LCD1602顯示溫濕度&#xff1b; 3.單片機也通過串口顯示檢測到的溫濕度&#xff1b; 添加圖片注釋&#xff0c;不…

Windows 10 查詢 Nginx 進程教程

1. 打開命令提示符&#xff08;CMD&#xff09; 按 Win R&#xff0c;輸入 cmd&#xff0c;回車。或者在開始菜單搜索欄輸入“cmd”&#xff0c;選擇“命令提示符”。 2. 查看是否有正在運行的 Nginx 進程 輸入命令&#xff1a; tasklist | findstr nginx這個命令會列出所有…

使用 Kafka 優化物流系統的實踐與思考

使用 Kafka 優化物流系統的實踐與思考 在現代物流系統中&#xff0c;訂單處理、倉儲管理、運輸調度等環節復雜且實時性要求高。為了滿足異步解耦、高吞吐、高可用、事件驅動和數據可靠性等需求&#xff0c;Kafka 作為分布式消息隊列和流處理平臺&#xff0c;成為了我們的首選。…

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你問得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一種模式匹配寫法&#xff0c;它用于從 Option 類型中提取值。 ? 背景知識&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一個值可能存在也可能不存在&#xff0c;就會用 Option…

什么是LLM大語言模型

什么是LLM大語言模型 LLM的全稱是&#xff0c;Large Language Model&#xff0c;簡稱LLM&#xff0c;翻譯為大語言模型&#xff0c;其核心是模擬人類語言的復雜規律&#xff0c;實現語義理解、推理分析、文本生成等任務&#xff0c;主要目的是實現能讀懂和說出人類語言的模型。…

雜談-架構時代演進

關于未來 5-10 年軟件系統演化方向 1. 云原生 ? 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平臺自治化&#xff1a; K8s Operator 日益強大&#xff0c;逐步具備自愈、自動擴縮容、自動調優能力。 云廠商與企業私有云逐步融合為一體…

如何查看服務器的運行日志?

&#x1f7e2; 一、Linux服務器 Linux日志都在**/var/log**目錄下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件內容/var/log/messages大部分系統日志&#xff08;CentOS常見&#xff09;/var/log/syslog系統消息日志&#xff08;Ubuntu/Debian常見&a…

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫 編譯環境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go語言中map[string]interface{} 和 map[string]string的區別

在 Go 語言中&#xff0c;map[string]interface{} 和 map[string]string 是兩種不同類型的 map&#xff0c;它們的主要區別在于值的類型以及這種差異帶來的使用場景和靈活性的不同。 1. 值的類型 map[string]interface{}&#xff1a;這里的 interface{} 表示 Go 中的空接口類型…

AdGuard Home 安裝及使用

AdGuard Home 是 AdGuard 開源的一個私人 DNS 服務端,只需在網關部署,即可實現全局域網的廣告攔截與隱私反追蹤。在 DNS 解析的過程中,匹配規則庫內的 URL 進行攔截,同時在客戶端中,還可以通過自定義過濾規則實現網頁 DOM 的攔截。 基于 Golang 編寫的 AdGuard Home,官方…

繞過 GraphQL 暴力破解保護

題目要求&#xff1a; 本實驗的用戶登錄機制由 GraphQL API 提供支持。API 終端節點有一個速率限制器&#xff0c;如果它在短時間內收到來自同一源的太多請求&#xff0c;則會返回錯誤。 要解決實驗問題&#xff0c;請暴力破解登錄機制以 .使用身份驗證實驗室密碼列表作為密碼…

C/C++ 使用rapidjson庫 操作Json格式文件(創建、插入、解析、修改、刪除)

目錄 一、前言 1.簡介 2.兼容性 3.下載 4.安裝 5.官方文檔 6.自述 二、封裝Json 1. 創建一個 Document 對象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 將Document轉換為字符串…