Apache HttpClient 5 用法-Java调用http服务

Apache HttpClient 5 核心用法详解

Apache HttpClient 5 是 Apache 基金会推出的新一代 HTTP 客户端库,相比 4.x 版本在性能、模块化和易用性上有显著提升。以下是其核心用法及最佳实践:


一、添加依赖
Maven 项目:
<dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.4-alpha1</version> <!-- 检查最新版本 -->
</dependency>
Gradle 项目:
implementation 'org.apache.httpcomponents.client5:httpclient5:5.4-alpha1'

二、基础用法
1. 创建 HttpClient 实例
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;// 创建带连接池的客户端(默认连接池大小:2*CPU核心数)
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManagerShared(true) // 共享连接池(推荐).setDefaultRequestConfig(RequestConfig.custom().setConnectTimeout(5000)   // 连接超时(毫秒).setResponseTimeout(10000) // 响应超时.build()).build();
2. 发送 GET 请求
HttpGet httpGet = new HttpGet("https://api.example.com/data");try (CloseableHttpClient client = HttpClients.createDefault()) {try (CloseableHttpResponse response = client.execute(httpGet)) {HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity);System.out.println("Status: " + response.getCode() + ", Body: " + result);}
}
3. 发送 POST 请求(提交 JSON)
HttpPost httpPost = new HttpPost("https://api.example.com/post");
String jsonBody = "{\"key\":\"value\"}";
httpPost.setEntity(new StringEntity(jsonBody, ContentType.APPLICATION_JSON));try (CloseableHttpClient client = HttpClients.createDefault()) {try (CloseableHttpResponse response = client.execute(httpPost)) {HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity);System.out.println("Status: " + response.getCode() + ", Body: " + result);}
}

三、高级功能
1. 连接池配置(优化性能)
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100);       // 最大连接数
cm.setDefaultMaxPerRoute(20); // 每个路由默认最大连接数CloseableHttpClient client = HttpClients.custom().setConnectionManager(cm).build();
HttpGet httpGet = new HttpGet("https://api.example.com/data");
httpGet.setHeader("User-Agent", "Apache HttpClient 5");
httpGet.setHeader("Authorization", "Bearer token123");// 添加 Cookie
BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("session_id", "abc123");
cookie.setDomain("api.example.com");
cookieStore.addCookie(cookie);CloseableHttpClient client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
3. 文件上传(Multipart)
HttpPost httpPost = new HttpPost("https://api.example.com/upload");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", new File("path/to/file.jpg"), ContentType.MULTIPART_FORM_DATA, "file.jpg");
builder.addTextBody("description", "Test upload", ContentType.TEXT_PLAIN);httpPost.setEntity(builder.build());try (CloseableHttpClient client = HttpClients.createDefault()) {try (CloseableHttpResponse response = client.execute(httpPost)) {// 处理响应}
}
4. 异步请求(非阻塞)
HttpClientAsyncClient asyncClient = HttpClients.createAsyncDefault();HttpGet httpGet = new HttpGet("https://api.example.com/data");
asyncClient.execute(httpGet, new FutureCallback<>() {@Overridepublic void completed(ClassicHttpResponse response) {HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity);System.out.println("Async Response: " + result);}@Overridepublic void failed(Exception ex) {ex.printStackTrace();}@Overridepublic void cancelled() {System.out.println("Request cancelled");}
});// 主线程继续执行其他任务
Thread.sleep(5000); // 等待异步结果(实际需用 CountDownLatch 等机制)

四、迁移指南(从 HttpClient 4.x)
  1. 包名变化

    • org.apache.http.client.HttpClient → org.apache.hc.client5.http.classic.HttpClient
    • HttpGet/HttpPost 等类路径调整。
  2. API 调整

    • 响应处理:CloseableHttpResponse 替代 CloseableHttpResponse(方法名类似)。
    • 连接池管理:使用 PoolingHttpClientConnectionManager 替代 PoolingHttpClientConnectionManager
  3. 移除废弃方法

    • 如 HttpClientBuilder.setMaxConnPerRoute() 改为 setMaxConnPerRoute(Route, int)

五、最佳实践
  1. 复用 HttpClient 实例:避免频繁创建/销毁,推荐使用 HttpClients.custom().build() 创建单例。
  2. 资源释放:使用 try-with-resources 确保 CloseableHttpClient 和 CloseableHttpResponse 正确关闭。
  3. 异常处理:捕获 IOException 和 HttpRequestException,处理网络错误和 HTTP 状态码。
  4. 性能监控:通过 ConnectionStats 监控连接池使用情况。

通过以上内容,您已掌握 Apache HttpClient 5 的核心用法,可根据项目需求实现高效、稳定的 HTTP 通信。如需处理复杂场景(如 OAuth2 认证、WebSocket),可进一步探索其扩展模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/80093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Spark 的流量统计

一、引言 在互联网行业&#xff0c;流量统计是分析网站或应用用户行为、评估业务表现、优化资源分配以及制定营销策略的关键环节。借助 Apache Spark 强大的分布式数据处理能力&#xff0c;我们可以高效地对大规模的流量数据进行统计分析&#xff0c;获取有价值的洞察。本文将…

Python模块化编程进阶指南:从基础到工程化实践

一、模块化编程核心原理与最佳实践 1.1 模块化设计原则 根据企业级项目实践&#xff0c;模块化开发应遵循以下核心原则&#xff1a; ​​单一职责原则​​&#xff1a;每个模块只承担一个功能域的任务&#xff08;如用户认证模块独立于日志模块&#xff09;​​接口隔离原则…

锐捷交换机STP环路日志信息解读

因公司网络组建使用锐捷全系列交换机&#xff0c;近期设备巡检时发现部分日志提示信息&#xff0c; 接入交换机NBS3100-24GT4SFP-V2&#xff0c;设备频繁打出STP Blocking的日志信息。 误以为是环路导致&#xff0c;故进行实验测试&#xff0c;来验证环路情况下会如何报日志。…

使用Python调用DeepSeek的示例

使用Python调用DeepSeek API的示例代码,包括API密钥的获取、基本请求的发送以及响应处理。请确保你已经注册了DeepSeek账号并获取了API密钥。 文章目录 前言一、获取API密钥二、python示例代码三、代码说明四、注意事项五、扩展功能总结前言 提示:这里可以添加本文要记录的大…

mysql的not exists走索引吗

在MySQL中&#xff0c;​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下是关键点总结&#xff1a; ​索引的作用​&#xff1a; 当子查询的关联字段&#xff08;例如B.a_id&#xff09;存在索引&#xff08;如普通B-tree索引&#xff09;时&…

Python线性回归:从理论到实践的完整指南

Python线性回归&#xff1a;从理论到实践的完整指南 线性回归是数据科学和机器学习中最基础且最重要的算法之一。本文将深入探讨如何使用Python实现线性回归&#xff0c;从理论基础到实际应用&#xff0c;帮助读者全面理解这一重要的统计学和机器学习方法。 什么是线性回归&a…

鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp

UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时&#xff0c;遇到了需要扫描和生成二维码的需求。在移动应用开发中&#xff0c;二维码功能已经成为标配&#xff0c;特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架&#xff0c;为我们提供…

Westlake-Omni 情感端音频生成式输出模型

简述 github地址在 GitHub - xinchen-ai/Westlake-OmniContribute to xinchen-ai/Westlake-Omni development by creating an account on GitHub.https://github.com/xinchen-ai/Westlake-Omni Westlake-Omni 是由西湖心辰&#xff08;xinchen-ai&#xff09;开发的一个开源…

uv python 卸载

又是查了半天 官网wiki没有 网上一堆傻子胡说 uv提示也不对 AI还在这尼玛胡编乱造 开始 我原来装了这几个环境 uv python list 现在python3.7.7不需要了&#xff0c;卸载&#xff0c;直接 uv python uninstall 3.7.7 去找你自己要卸载的版本号&#xff0c;不需要整个包名复制…

使用哈希表封装myunordered_set和myunordered_map

文章目录 使用哈希表封装myunordered_set和myunordered_map实现出复用哈希表框架&#xff0c;并支持insert支持迭代器的实现constKey不能被修改unordered_map支持[ ]结语 我们今天又见面啦&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01…

后端框架(2):Java的反射机制

什么是java反射机制&#xff1f; 回顾之前java程序如何使用类 1.分析&#xff0c;确定类名&#xff0c;属性名&#xff0c;方法......创建类 2.创建类的对象 3.使用 一切都是已知的。 在程序开发中&#xff0c;在哪儿需要使用哪个类的对象&#xff0c;就在那儿创建这个类对象…

ch10 课堂参考代码

ch10 最小生成树 生成树&#xff1a;对于 n 个结点 m 条边的无向图 G&#xff0c;由全部 n 个结点和其中 n - 1 条边构成的无向连通子图称为 G 的一棵生成树。 如果图 G 原本就不连通&#xff0c;则不存在生成树&#xff0c;只存在生成森林。 最小生成树&#xff08;Minimum…

费曼技巧及提高计划

费曼技巧及提高计划 一、什么是费曼技巧&#xff1f; 费曼技巧&#xff08;Feynman Technique&#xff09;由诺贝尔物理学奖得主理查德费曼提出&#xff0c;是一种通过“以教代学”来彻底理解复杂概念的学习方法。其核心逻辑是&#xff1a; “如果你不能简单解释一件事&#x…

LongRefiner:解决长文档检索增强生成的新思路

大语言模型与RAG的应用越来越广泛&#xff0c;但在处理长文档时仍面临不少挑战。今天我们来聊聊一个解决这类问题的新方法——LongRefiner。 背景问题&#xff1a;长文档处理的两大难题 使用检索增强型生成&#xff08;RAG&#xff09;系统处理长文档时&#xff0c;主要有两个…

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

MySQL基础面试通关秘籍(附高频考点解析)

文章目录 一、事务篇&#xff08;必考重点&#xff09;1.1 事务四大特性&#xff08;ACID&#xff09;1.2 事务实战技巧 二、索引优化大法2.1 索引类型全家福2.2 EXPLAIN命令实战 三、存储引擎选型指南3.1 InnoDB vs MyISAM 终极对决 四、SQL优化实战手册4.1 慢查询七宗罪4.2 分…

Word图片格式调整与转换工具

软件介绍 本文介绍的这款工具主要用于辅助Word文档处理。 图片排版功能 经常和Word打交道的人或许都有这样的困扰&#xff1a;插入的图片大小各异&#xff0c;排列也参差不齐。若不加以调整&#xff0c;遇到要求严格的领导&#xff0c;可能会让人颇为头疼。 而这款工具能够统…

工业巡检机器人 —— 机器人市场的新兴增长引擎

摘要 在机器人产业蓬勃发展的当下&#xff0c;不同类型机器人的市场表现差异显著。工业机械臂虽市场规模庞大&#xff0c;但已趋近饱和&#xff0c;陷入红海竞争&#xff1b;人形机器人因技术瓶颈仍多停留于实验室阶段&#xff0c;距离大规模商用尚有较长距离。与之形成鲜明对比…

Oracle where条件执行先后顺序

Oracle where条件执行先后顺序 在Oracle数据库中&#xff0c;WHERE子句的条件执行顺序通常是根据你在WHERE子句中指定的条件来决定的&#xff0c;而不是按照某种固定的顺序执行的。当你编写一个WHERE子句时&#xff0c;你可以包含多个条件&#xff0c;这些条件可以是逻辑运算符…

在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。

times函数用于获取当前进程时间,其函数原型如下所示: #include <sys/times.h> clock_t times(struct tms *buf); //使用该函数需要包含头文件<sys/times.h>。 函数参数和返回值含义如下: buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据…