JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南
1、简述
CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互,可以发送 GET、POST 等各种请求类型,并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。

2、特性
CloseableHttpClient 是 HttpClient 的一个实现类,它可以进行各种 HTTP 请求,并且在使用完毕时支持关闭以释放资源。与其搭配的 HttpResponse 提供了对 HTTP 响应的解析。
主要特性包括:
- 支持同步和异步请求
- 支持连接池和重试机制
- 支持多种请求方法:GET、POST、PUT、DELETE 等
- 支持表单数据、JSON 数据和文件上传等多种数据格式
3、基础用法
3.1 发送 GET 请求
GET 请求用于从服务器获取资源数据,示例如下:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientExample {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建GET请求HttpGet request = new HttpGet("http://httpbin.org/get");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 获取响应体HttpEntity entity = response.getEntity();if (entity != null) {// 将响应体转为字符串String result = EntityUtils.toString(entity);System.out.println(result);}}} catch (IOException e) {e.printStackTrace();}}
}
3.2 发送 POST 请求
POST 请求用于向服务器提交数据,例如表单数据或 JSON 数据:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientExample {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建GET请求HttpGet request = new HttpGet("http://httpbin.org/get");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 获取响应体HttpEntity entity = response.getEntity();if (entity != null) {// 将响应体转为字符串String result = EntityUtils.toString(entity);System.out.println(result);}}} catch (IOException e) {e.printStackTrace();}}
}
3.3 表单数据和文件上传
在实际开发中,通常会遇到需要上传文件的场景。例如,用户通过网页上传文件到服务器,这时就需要使用 MultipartEntityBuilder 来构建多部分表单(form-data)。
上传文件和表单参数 通过 MultipartEntityBuilder 可以轻松实现文件上传和传递其他表单字段:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.File;
import java.io.IOException;
import java.util.Map;public class HttpClientFileUploadWithParams {public static void main(String[] args) {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建POST请求HttpPost postRequest = new HttpPost("http://httpbin.org/post");// 模拟表单参数 (key-value 对)Map<String, String> formParams = Map.of("username", "john_doe","password", "secret_password");// 构建MultipartEntity,添加文件参数和普通表单参数MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.addBinaryBody("file", new File("path/to/your/file.txt"),ContentType.APPLICATION_OCTET_STREAM, "file.txt");// 添加表单参数for (Map.Entry<String, String> entry : formParams.entrySet()) {builder.addTextBody(entry.getKey(), entry.getValue(), ContentType.TEXT_PLAIN);}// 设置请求体HttpEntity multipart = builder.build();postRequest.setEntity(multipart);// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(postRequest)) {// 获取响应体String result = EntityUtils.toString(response.getEntity());System.out.println(result);}} catch (IOException e) {e.printStackTrace();}}
}
3.4 使用 Map 传递 JSON 数据
如果需要发送 POST 请求并将数据以 JSON 格式发送,可以使用 Map 构建数据并将其序列化为 JSON 格式:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class HttpClientMapJsonExample {public static void main(String[] args) throws IOException {// 创建HttpClient实例try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 创建POST请求HttpPost postRequest = new HttpPost("http://httpbin.org/post");// 模拟参数 (key-value 对)Map<String, Object> jsonParams = new HashMap<>();jsonParams.put("username", "john_doe");jsonParams.put("age", 30);jsonParams.put("active", true);// 将Map转换为JSON字符串ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(jsonParams);// 设置请求体 (JSON格式)StringEntity entity = new StringEntity(json);postRequest.setEntity(entity);postRequest.setHeader("Content-Type", "application/json");// 执行请求并获取响应try (CloseableHttpResponse response = httpClient.execute(postRequest)) {// 获取响应体String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}}
}
4、错误处理和性能优化
4.1错误处理
在使用 CloseableHttpClient 时,建议对 HTTP 请求的响应状态码进行检查,确保服务器返回了预期的结果:
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {// 成功处理逻辑
} else {System.err.println("请求失败,状态码:" + statusCode);
}
4.2 连接池和超时设置
为了提高性能,可以使用连接池管理多个 HTTP 连接。此外,设置合理的超时时间对于处理网络延迟也是必要的:
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.util.Timeout;public class HttpClientPoolExample {public static CloseableHttpClient createHttpClientWithPool() {// 创建连接池管理器,并设置最大连接数和每个路由的最大连接数PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100); // 最大连接数connectionManager.setDefaultMaxPerRoute(20); // 每个路由的最大连接数// 配置请求的超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(Timeout.ofSeconds(10)) // 连接超时时间.setConnectionRequestTimeout(Timeout.ofSeconds(5)) // 从连接池获取连接的超时时间.setResponseTimeout(Timeout.ofSeconds(15)) // 请求超时时间.build();// 创建带有连接池和请求配置的 HttpClientreturn HttpClients.custom().setConnectionManager(connectionManager) // 设置连接池管理器.setDefaultRequestConfig(requestConfig) // 设置请求配置.build();}
}
5、总结
通过使用 CloseableHttpClient,可以方便地在 Java 中实现各种 HTTP 请求,包括 GET、POST、文件上传等。在实际开发中,我们可以根据具体业务场景灵活调整请求配置,例如设置超时、使用连接池管理多线程请求等。
这种 HTTP 客户端非常适合 REST API 调用、文件处理等常见应用场景。
相关文章:
JAVA:CloseableHttpClient 进行 HTTP 请求的技术指南
1、简述 CloseableHttpClient 是 Apache HttpComponents 提供的一个强大 HTTP 客户端库。它允许 Java 程序与 HTTP/HTTPS 服务交互,可以发送 GET、POST 等各种请求类型,并处理响应。该库广泛用于 REST API 调用、文件上传和下载等场景。 2、特性 Close…...
Mac上搭建k8s环境——Minikube
1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…...
经典排序算法复习----C语言
经典排序算法复习 分类 交换类 冒泡快排 分配类 计数排序基数排序 选择类 选择排序 堆排序 归并类 归并排序 插入类 直接插入排序 希尔排序 折半插入排序 冒泡排序 基于交换。每一轮找最大值放到数组尾部 //冒泡排序 void bubSort(int* arr,int size){bool sorte…...
自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同
目录 1、引言 2、主要内容 2.1、定位对比:感知与规划的全维覆盖 2.2、数据与技术特性对比 2.3、技术协同:构建全栈研发生态 2.4、应用场景与评估体系 2.5、总结与展望 3、参考文献 1、引言 随着自动驾驶技术向全栈化迈进,Motional 团…...
[LUA ERROR] bad light userdata pointer
Cocos2d项目,targetSdkVersion30,在 android 13 设备运行报错: [LUA ERROR] bad light userdata pointer ,导致黑屏。 参考 cocos2dx 适配64位 arm64-v8a 30 lua 提示 bad light userdata pointer 黑屏-CSDN博客的方法 下载最新的Cocos2dx …...
【Java八股】JVM
JVM 1. jvm内存区域分为哪些部分 线程私有的:程序计数器、虚拟机栈、本地方法栈 程序计数器:指示当前线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈:用于存储方法调用的数据&…...
集成学习(一):从理论到实战(附代码)
一、引言 在机器学习领域,打造一个独立、强大的算法是解决问题的关键。然而,集成学习提供了一种不同的视角:通过组合多个“弱”学习器来创建一个更强大的模型。本文探讨集成学习的思想、方法及其应用。 二、机器学习 vs 集成学习思想 传统…...
Netty:高性能网络应用框架的深度解析
引言 Netty 是由 JBoss 提供的一个开源的 Java NIO 客户端/服务器框架,它用以快速开发网络应用程序,如协议服务器和客户端。它的设计目标是提供异步事件驱动的网络应用程序框架,支持高效的网络通信和数据处理。Netty 在性能、可扩展性、安全…...
神经网络常见激活函数 3-ReLU函数(修正线性单元)
文章目录 ReLU函数求导函数和导函数图像优缺点pytorch 中的 ReLU 函数tensorflow 中的ReLU函数 ReLU 修正线性单元 (Rectified Linear Unit) 函数求导 ReLU函数 ReLU max ( 0 , x ) { x x ≥ 0 0 x < 0 \begin{aligned} \operatorname{ReL…...
Android开发获取缓存,删除缓存
Android开发获取缓存,删除缓存 app设置中往往有清理缓存的功能。会显示当前缓存时多少,然后可以点击清理缓存 直接上代码: object CacheHelper {/*** 获取缓存大小* param context* return* throws Exception*/JvmStaticfun getTotalCache…...
如何通过PHP接入DeepSeek的API
想知道如何通过PHP接入DeepSeek的API。看起来他对之前的Python步骤比较熟悉,但这次想用PHP实现。 首先,我需要回顾一下DeepSeek API的文档,确认它支持哪些方法和参数。假设用户已经配置了环境变量,比如API密钥,接下来…...
一种基于Leaflet.Legend的图例动态更新方法
目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代,地理信息系统(GIS)技术已经广泛应用于各个领域,…...
Spring Boot: 使用 @Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ
Spring Boot: 使用 Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ 在微服务架构中,确保消息的可靠性和一致性非常重要,尤其是在涉及到分布式事务的场景中。本文将演示如何使用 Spring Boot 的事务机制和 TransactionSynchron…...
LQB(2)-python-枚举
前言 python中的枚举一般有两个说法,一个是枚举算法(暴力求解法,算法层面),一个是遍历使用enumerate()函数或者enum模块创建()。 暴力求解法在之前的博文里面讲过了👇,…...
MongoDB开发规范
分级名称定义P0核心系统需7*24不间断运行,一旦发生不可用,会直接影响核心业务的连续性,或影响公司名誉、品牌、集团战略、营销计划等,可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用,会间接影响用户使用…...
为什么DeepSeek服务器繁忙?
致敬DeepSeek 用户层面 用户数量激增:DeepSeek 免费且功能强大,对普通用户和开发者都极具吸引力124。尤其是在新功能推出、新模型上线或相关热门活动期间,大量用户会在短时间内涌入9。例如春节期间,DeepSeek 的用户量达到四千万7。…...
律所录音证据归集工具:基于PyQt6与多线程的自动化音频管理解决方案
在律所日常工作中,音频证据的整理与归集是一个高频且复杂的任务。面对大量的案件录音文件,如何实现快速且准确的分类与存档,成为了律所提高效率、降低出错率的关键。本文将通过技术角度解析一款名为律所录音证据归集工具的项目,详…...
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue旅游管理网站
开题报告 本论文探讨了一款采用现代Web开发技术构建的台州市旅游综合信息与服务平台的设计与实现。该系统基于SpringBoot框架,以其轻量级、快速开发和强大的企业级应用支持能力为核心后端技术支撑,结合Vue.js前端框架及ElementUI组件库,为用…...
unity碰撞的监测和监听
1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…...
DeepSeek-R1 32B Windows+docker本地部署
最近国产大模型DeepSeek兴起,本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件:Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama,它可以在本地运行和管理大模型。 到Ollama官网 https://ol…...
seo实用工具对网站长期发展有什么影响
SEO实用工具对网站长期发展的影响 在当今数字化时代,网站的长期发展离不开搜索引擎优化(SEO)。而SEO实用工具,则是推动网站长期发展的重要助手。它们不仅帮助提升网站的搜索排名,还能够提供数据分析、关键词研究和竞争…...
trae中安装mcp报Cannot find package/ERR_MODULE_NOT_FOUND问题
简介 我在trae中安装高德地图的mcp和其他的mcp报出了以下错误,以此记录并分享给大家。 新的改变 node:internal/modules/esm/resolve:204 const resolvedOption FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified); ^ Error: Cannot find pack…...
Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响
Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响 1. 认识Qwen3.5-2B轻量化多模态模型 Qwen3.5-2B是Qwen3.5系列中的轻量级版本,仅有20亿参数规模。这个模型特别适合在资源有限的设备上运行,比如个人电脑、边缘计算设备等。…...
从单片机思维到FPGA思维:我用Xilinx Ego1做循迹小车踩过的那些‘坑’
从单片机思维到FPGA思维:Xilinx Ego1循迹小车开发实战避坑指南 第一次用FPGA做循迹小车时,我盯着Vivado里密密麻麻的时序报告发呆了半小时——这和我熟悉的单片机开发完全是两个世界。作为有三年STM32开发经验的工程师,本以为凭借Verilog语法…...
**元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统**在元宇宙经济蓬勃发展的今
元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统 在元宇宙经济蓬勃发展的今天,数字资产的流通与确权成为核心议题。无论是虚拟土地、NFT艺术品还是游戏道具,背后都离不开区块链技术的支持。而智能合约正是连接现实世界资…...
知乎上线求职工具,助力毕业生破困局
知乎上线求职利器,直击毕业生痛点2026届全国普通高校毕业生预计达1270万人,再创历史新高。与此同时,AI技术加速行业重构,部分传统岗位需求收缩,大量毕业生陷入“海投”困境,难以精准定位自身。在此背景下&a…...
手把手教你学<基于 Linux 的 NPU 协处理器固件开发>专栏第1章 入门:
1.2 典型 AI 芯片架构:主核 Linux + NPU 协处理器 在上一节我们明确了NPU是依附于Linux主核的专用AI协处理器,属于主从配合的工作模式,这一节我们就深入拆解端侧AI芯片最主流的“Linux主核+NPU协处理器”异构架构。结合大家日常接触的代码仓库管理、编译脚本执行、固件烧录…...
MSPM0G3507开发实战:从零搭建Keil工程与SysConfig配置详解
1. 开发环境准备与SDK文件结构解析 第一次接触MSPM0G3507开发板时,我花了整整两天时间才搞明白SDK文件该怎么用。这里分享我的踩坑经验,帮你省下这些时间。首先确认你的开发环境已经安装以下组件: Keil MDK:建议使用5.33版本&…...
iarduino_KB矩阵键盘库:硬件感知型Arduino按键驱动方案
1. 项目概述iarduino_KB是由俄罗斯嵌入式开发团队 iArduino.ru 面向 Arduino IDE 推出的专用矩阵键盘驱动库。该库并非通用型扫描抽象层,而是针对其自研四款物理形态与电气特性高度定制化的柔性/机械式矩阵键盘模块进行深度适配的固件级解决方案。其核心价值在于将底…...
AI爱好者成长手册:从“会用”到“用好”主流大模型的进阶之路
许多AI爱好者在使用大模型一段时间后会陷入一个困惑:为什么别人能用AI写出惊艳的文案、完成复杂的分析,而自己却总是得到平庸的结果?答案往往不在于模型的选择,而在于使用方式。经过在RskAi(www.rsk.cn) 平…...
