Java如何使用 HttpClientUtils 发起 HTTP 请求
Java如何使用 HttpClientUtils 发起 HTTP 请求
- 一、前言
- 1.HttpClientUtils 类概览
- 2.解析 HttpClientUtils 类
- 3.使用 HttpClientUtils 类
一、前言
在现代的软件开发中,经常需要与远程服务器进行通信,例如获取数据或发送数据。Apache HttpClient 是一个流行的 Java HTTP 客户端库,能够简化 HTTP 请求的发起和响应处理。本文将介绍如何使用自定义的 HttpClientUtils 类来利用 Apache HttpClient 发起 POST 请求,并且管理连接池以优化性能。
1.HttpClientUtils 类概览
public class HttpClientUtils {// 静态常量和变量声明private static final int MAX_TOTAL_CONN = 600;private static final int MAX_CONN_PER_HOST = 300;private static final int SOCKET_TIMEOUT = 5000;private static final int CONNECTION_TIMEOUT = 200;private static final int CONNECTION_MANAGER_TIMEOUT = 100;private static CloseableHttpClient httpclient;private static PoolingHttpClientConnectionManager connMrg;private static String encoding = StandardCharsets.UTF_8.name();private static Logger log = LoggerFactory.getLogger(HttpClientUtils.class);private static final ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(2);// 静态代码块,用于初始化 HttpClient 和连接管理器,并设置 JVM 退出时关闭 HttpClientstatic {init();destroyByJvmExit();}// 初始化连接管理器和 HttpClientprivate static void init() {connMrg = new PoolingHttpClientConnectionManager();connMrg.setMaxTotal(MAX_TOTAL_CONN);connMrg.setDefaultMaxPerRoute(MAX_CONN_PER_HOST);httpclient = HttpClients.custom().setConnectionManager(connMrg).setDefaultRequestConfig(HttpClientUtils.defaultRequestConfig()).build();// 定时任务,定期清理过期和空闲连接scheduledService.scheduleAtFixedRate(() -> {connMrg.closeExpiredConnections();connMrg.closeIdleConnections(CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);}, 0, CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);}// JVM 退出时关闭 HttpClientprivate static void destroyByJvmExit() {Runtime.getRuntime().addShutdownHook(new Thread(() -> {try {httpclient.close();} catch (IOException e) {log.error("Error closing HttpClient: {}", e.getMessage());}}));}// 创建 HttpClientContextprivate static HttpClientContext createContext() {return HttpClientContext.create();}// 创建默认的 RequestConfigprivate static RequestConfig defaultRequestConfig() {return RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).setConnectionRequestTimeout(CONNECTION_MANAGER_TIMEOUT).build();}// 发起带参数的 POST 表单请求,返回字符串结果public static String postWithParamsForString(String url, List<NameValuePair> params) {HttpPost httpPost = new HttpPost();try {URI uri = new URIBuilder(url).build();httpPost.setURI(uri);httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));return executeRequest(httpPost);} catch (URISyntaxException | IOException e) {log.error("Error executing POST request: {}", e.getMessage());} finally {httpPost.releaseConnection();}return null;}// 发起 GET 请求,返回字符串结果public static String get(String url, List<NameValuePair> params) {HttpGet httpGet = new HttpGet();try {URI uri = new URIBuilder(url).setParameters(params).build();httpGet.setURI(uri);return executeRequest(httpGet);} catch (URISyntaxException | IOException e) {log.error("HTTP GET request failed", e);} finally {httpGet.releaseConnection();}return null;}// 发起 Post 请求,返回字符串结果public static String post(String url, List<NameValuePair> params) {HttpPost httpPost = new HttpPost();try {httpPost.setURI(new URI(url));httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));return executeRequest(httpPost);} catch (URISyntaxException | IOException e) {log.error("HTTP POST request failed", e);} finally {httpPost.releaseConnection();}return null;}// 执行 HTTP 请求并处理响应private static String executeRequest(HttpUriRequest request) throws IOException {try (CloseableHttpResponse response = httpclient.execute(request, createContext())) {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, encoding);} else {log.warn("Empty response entity");}} else {log.error("HTTP request failed with status code: {}", statusCode);}} catch (IOException e) {log.error("HTTP request execution failed: {}", e.getMessage());throw e;}return null;}
}
2.解析 HttpClientUtils 类
-
静态常量和变量:
- 定义了最大连接数、连接超时时间、Socket 超时时间等常量和变量。
-
初始化和销毁:
- 在静态代码块中初始化了
HttpClient和连接管理器PoolingHttpClientConnectionManager。 - 使用
ScheduledExecutorService定期清理过期和空闲连接。 - 在
destroyByJvmExit方法中,注册了一个 JVM 退出钩子,确保在 JVM 关闭时关闭HttpClient。
- 在静态代码块中初始化了
-
HTTP 请求方法:
postWithParamsForString方法用于执行带参数的 POST 请求。- 使用
HttpPost构建请求,设置 URL 和请求参数,最终调用executeRequest方法执行请求。
-
执行请求和处理响应:
executeRequest方法接收HttpUriRequest,执行 HTTP 请求并处理响应。- 检查响应的状态码,如果是 200(OK),则读取响应实体并将其转换为字符串返回。
- 使用日志记录错误和警告信息,确保代码的健壮性和可靠性。
3.使用 HttpClientUtils 类
使用 HttpClientUtils 类可以简化 HTTP 请求的编写和管理,具体步骤如下:
public class Main {public static void main(String[] args) {List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("param1", "value1"));params.add(new BasicNameValuePair("param2", "value2"));String response = HttpClientUtils.postWithParamsForString("http://example.com/api", params);if (response != null) {System.out.println("Response: " + response);} else {System.err.println("Failed to execute POST request");}}
}
通过以上学习,你现在应该了解如何使用 HttpClientUtils 类来管理 HTTP 客户端和发起请求。这种方式可以帮助你在 Java 应用中更高效地处理 HTTP 通信,同时通过连接池和定期清理机制提升性能和稳定性。
相关文章:
Java如何使用 HttpClientUtils 发起 HTTP 请求
Java如何使用 HttpClientUtils 发起 HTTP 请求 一、前言1.HttpClientUtils 类概览2.解析 HttpClientUtils 类3.使用 HttpClientUtils 类 一、前言 在现代的软件开发中,经常需要与远程服务器进行通信,例如获取数据或发送数据。Apache HttpClient 是一个流…...
无人机的工作原理
无人飞行器(UAV,即Unmanned Aerial Vehicle)的工作原理涉及多个复杂的系统和技术。以下是对各个系统和技术的详细介绍: 1. 飞行控制系统(FCS) 飞行控制系统是无人机的“大脑”,负责监控和调整…...
敏捷开发笔记(第10章节)--Liskov原则(LSP)
目录 1:PDF上传链接 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1:PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…...
基于SSM的校园一卡通管理系统的设计与实现
摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM(Spring、Spring MVC、MyBatis)框架精心打造而成,旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…...
新版Android Studio中设置gradle的JDK版本
旧版android studio 在旧版(具体哪个版本号之前搞不清了)中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…...
打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)
1. 项目概述 随着物联网技术的蓬勃发展,智能家居正逐步融入人们的日常生活。然而,市面上琳琅满目的智能家居设备通常采用不同的通信协议,导致不同品牌设备之间难以实现互联互通。为了解决这一难题,本文设计了一种基于STM32的多协…...
【基于R语言群体遗传学】-16-中性检验Tajima‘s D及连锁不平衡 linkage disequilibrium (LD)
Tajimas D Test 已经开发了几种中性检验,用于识别模型假设的潜在偏差。在这里,我们将说明一种有影响力的中性检验,即Tajimas D(Tajima 1989)。Tajimas D通过比较数据集中的两个𝜃 4N𝜇估计值来…...
防火墙组网与安全策略实验
实验要求: 实现: 防火墙接口配置: 所有接口均配置为三层接口 由于G1/0/3口下为vlan环境,所以防火墙需要配置子接口 : 交换机划分vlan分开生产区和办公区、配置trunk干道 : 安全策略: 生产区访…...
xmind梳理测试点,根据这些测试点去写测试用例
基本流(冒烟用例必写) 备选流 公共测试点:...
MICCAI 2024 每日一篇论文 纯纯直读 CUTS:用于多粒度无监督医学图像分割的深度学习和拓扑框架
MICCAI 2024 CUTS: A Deep Learning and Topological Framework for Multigranular Unsupervised Medical Image Segmentation CUTS: 用于多粒度无监督医学图像分割的深度学习和拓扑框架 作者 陈璐1*、Matthew Amodio1*、梁博伦.沈2、冯高3、阿曼阿维斯塔4、Sanjay Aneja3,5…...
实验9 存储过程与函数的创建管理实验
一、实验目的: 理解存储过程和函数的概念。掌握创建存储过程和函数的方法。掌握执行存储过程和函数的方法。掌握游标的定义、使用方法。 二、实验内容 1.某超市的食品管理的数据库的Food表,Food表的定义如表所示, Food表的定义…...
计算机网络--tcpdump和iptable设置、内核参数优化策略
tcpdump工具 tcpdump命令: 选项字段: 过滤表达式: 实用命令: TCP三次握手抓包命令: #客户端执行tcpdump 抓取数据包 tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcapnetstat命令 netst…...
Vue3框架搭建2:axios+typescript封装
仓库地址:https://github.com/buguniao5213/LuArch 1、安装axios npm install axios2、创建文件 先创建一个文件夹: ├── src/ │ ├── api/ │ │ ├── index.ts/ #编写axios封装代码 │ │ └── example.ts/ #定义…...
【机器学习】使用决策树分类器预测汽车安全性的研究与分析
文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…...
【香橙派 Orange pi AIpro】| 开发板深入使用体验
目录 一. 🦁 写在前面二. 🦁 愉快的安装流程2.1 安装前准备2.2 流程准备2.2.1 烧录镜像2.2.2 开机2.2.3 连网2.2.4 SSH远程连接开发板 2.3 体验 AI 应用样例 三. 🦁 写在最后 一. 🦁 写在前面 大家好,我是狮子呀&…...
初识Laravel(Laravel的项目搭建)
初识Laravel(Laravel的项目搭建) 一、项目简单搭建(laravel)1.首先我们确保使用国内的 Composer 加速镜像([加速原理](https://learnku.com/php/wikis/30594)):2.新建一个名为 Laravel 的项目&a…...
RequestContextHolder多线程获取不到request对象
RequestContextHolder多线程获取不到request对象,调用feign接口时,在Feign中的RequestInterceptor也获取不到HttpServletRequest问题解决方案。 1.RequestContextHolder多线程获取不到request对象 异常信息,报错如下: 2024-07-0…...
打造高效工作与生活质量的完美平衡
在快节奏的编程行业中,保持健康的工作与生活平衡是至关重要的。长时间坐在电脑前、面对紧凑的项目截止日期和频繁的加班文化,很容易导致身心健康问题,如眼睛疲劳、颈部和背部疼痛、压力累积、睡眠障碍乃至慢性疾病。因此,采取积极…...
【零基础】学JS之APIS第四天
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
走进linux
1、为什么要使用linux 稳定性和可靠性: Linux内核以其稳定性而闻名,能够持续运行数月甚至数年而不需要重新启动。这对于服务器来说至关重要,因为它们需要保持长时间的稳定运行,以提供持续的服务 安全性: Linux系统…...
RecyclerView 动态布局实战:ItemView 高宽自适应与多列切换
1. RecyclerView动态布局的核心挑战 在Android开发中,RecyclerView是最常用的列表控件之一。但很多开发者都会遇到这样的问题:如何让ItemView根据数据量动态调整高度和宽度?特别是在需要实现单列和多列布局自动切换的场景下,这个问…...
OpenCore Legacy Patcher:3大突破让旧Mac重获新生的系统兼容性优化指南
OpenCore Legacy Patcher:3大突破让旧Mac重获新生的系统兼容性优化指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher(O…...
【国家级智慧农场落地案例】:Python图像算法如何将番茄裂果识别准确率提升至98.7%?
第一章:国家级智慧农场落地背景与番茄裂果识别挑战近年来,国家《“十四五”推进农业农村现代化规划》明确提出加快数字技术与农业生产深度融合,推动建设一批国家级智慧农场示范项目。在华北、华东等核心蔬菜产区,规模化番茄种植基…...
【Hi3519DV500】SD卡64G正常识别,16G和32G识别失败,报告警 mmc1: error -110 whilst initialising SD card
目录 环境 问题 定位和解决 设备树文件层次关系与覆盖原则 解决方案 方案一:修改环境变量(推荐) 方案二:修改设备树 方案三:修改硬件支持 环境 Hi3519DV500开发板 参考文档:鸿鸥派 HongOU PI V2.…...
3分钟让静态图像“活“起来:AI肖像动画技术全解析
3分钟让静态图像"活"起来:AI肖像动画技术全解析 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 静态图像如何突破二维平面的限制,展现动态生命力?…...
深入解析OpenWrt无线初始化:mac80211.sh脚本核心功能与实战应用
1. 初识mac80211.sh:OpenWrt无线初始化的核心引擎 当你第一次刷入OpenWrt固件时,有没有好奇过路由器是如何自动创建无线网络的?这一切的秘密都藏在/lib/wifi/mac80211.sh这个脚本中。作为OpenWrt无线子系统的"大脑",这个…...
从零开始:使用mmsegmentation训练自定义数据集的全流程指南
1. 环境准备与安装指南 第一次接触mmsegmentation时,最头疼的就是环境配置。记得我刚开始用的时候,光是解决CUDA和PyTorch版本兼容问题就折腾了一整天。现在把踩过的坑都总结出来,让你10分钟搞定环境搭建。 核心依赖清单: Python …...
视频换脸功能上线!AI黑科技助力内容创作降本90%
在电商圈摸爬滚打十几年,从国内淘宝京东到亚马逊TikTok,操盘过美妆、服饰、3C多个类目的百万级店铺。这十年最深的体会就是:流量越来越贵,内容越来越卷,成本越来越高。 尤其是短视频赛道。一条带货视频,模…...
Ansys - Fluent 在激光与电弧焊接增材领域的模拟探索
Ansys-Fluent激光电弧焊接增材数值模拟案例,激光焊接,激光增材,激光熔覆等,SLM Fluent模拟,内容包含 激光焊接熔池演变(视频教程) SLM激光熔池演变(视频教程) 激光熔覆单…...
PDFMathTranslate深度解析:基于ONNX推理引擎的学术论文翻译技术评测
PDFMathTranslate深度解析:基于ONNX推理引擎的学术论文翻译技术评测 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服…...
