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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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转换为字符串…