当前位置: 首页 > article >正文

Apache HttpClient使用

一、Apache HttpClient 基础版

HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配置 HTTP 客户端实例。

以下是关于 HttpClients 的详细讲解:

1. Apache HttpClient 简介

Apache HttpClient 是一个开源的 Java HTTP 客户端库,支持 HTTP/1.1 和 HTTP/2 协议。它提供了丰富的功能,例如:

  • 发送 GET、POST、PUT、DELETE 等 HTTP 请求。

  • 处理 HTTP 请求和响应的头部、状态码、实体等。

  • 支持连接池、重试机制、代理、SSL/TLS 等高级功能。

2. HttpClients 类的作用

HttpClients 是一个工厂类,用于创建 CloseableHttpClient 实例。CloseableHttpClient 是 HTTP 客户端的主要接口,用于执行 HTTP 请求。

HttpClients 提供了多种静态方法来创建和配置 HTTP 客户端实例,例如:

  • 创建默认的 HTTP 客户端。

  • 创建自定义配置的 HTTP 客户端。

  • 创建支持连接池的 HTTP 客户端。


3. HttpClients 的常用方法

(1) HttpClients.createDefault()
  • 功能: 创建一个默认的 HTTP 客户端实例。

  • 特点

    • 使用默认的配置(例如连接池、重试机制等)。

    • 适合大多数简单的 HTTP 请求场景。

  • 示例

    CloseableHttpClient httpClient = HttpClients.createDefault();
(2) HttpClients.createSystem()
  • 功能: 创建一个基于系统属性的 HTTP 客户端实例。

  • 特点

    • 使用系统属性(例如代理设置、超时时间等)来配置客户端。

    • 适合需要与系统配置集成的场景。

  • 示例

    CloseableHttpClient httpClient = HttpClients.createSystem();
(3) HttpClients.custom()
  • 功能: 返回一个 HttpClientBuilder 对象,用于自定义配置 HTTP 客户端。

  • 特点

    • 可以设置连接池、超时时间、代理、SSL/TLS 等高级配置。

    • 适合需要精细控制的场景。

  • 示例

     CloseableHttpClient httpClient = HttpClients.custom().setMaxConnTotal(100) // 最大连接数.setMaxConnPerRoute(10) // 每个路由的最大连接数.build();

4. HttpClients 的使用示例

以下是一个完整的示例,展示如何使用 HttpClients 发送 HTTP GET 请求并处理响应:

 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;​public class HttpClientExample {public static void main(String[] args) {// 1. 创建 HTTP 客户端try (CloseableHttpClient httpClient = HttpClients.createDefault()) {// 2. 创建 HTTP GET 请求HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");​// 3. 发送请求并获取响应try (CloseableHttpResponse response = httpClient.execute(request)) {// 4. 检查响应状态码int statusCode = response.getStatusLine().getStatusCode();System.out.println("Status Code: " + statusCode);​// 5. 获取响应内容String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response Body: " + responseBody);}} catch (Exception e) {e.printStackTrace();}}}

5. HttpClients 的高级配置

通过 HttpClients.custom() 方法,可以自定义 HTTP 客户端的配置。以下是一些常见的配置选项:

(1) 连接池配置
 CloseableHttpClient httpClient = HttpClients.custom().setMaxConnTotal(100) // 最大连接数.setMaxConnPerRoute(10) // 每个路由的最大连接数.build();
(2) 超时配置
 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) // 连接超时时间.setSocketTimeout(5000) // 读取超时时间.build();​CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
(3) 代理配置
 HttpHost proxy = new HttpHost("proxy.example.com", 8080);​CloseableHttpClient httpClient = HttpClients.custom().setProxy(proxy).build();
(4) SSL/TLS 配置
 SSLContext sslContext = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true) // 信任所有证书.build();​CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();

6. 注意事项

  1. 资源释放CloseableHttpClientCloseableHttpResponse 都实现了 Closeable 接口,使用后需要关闭以释放资源。

  2. 线程安全CloseableHttpClient 是线程安全的,可以在多线程环境中共享。

  3. 性能优化: 使用连接池和合理的超时配置可以显著提升性能。


7. 总结

  • HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。

  • 它提供了多种方法来创建默认或自定义配置的 HTTP 客户端。

  • 通过 HttpClients.custom() 方法,可以实现连接池、超时、代理、SSL/TLS 等高级配置。

  • 使用 Apache HttpClient 可以轻松发送 HTTP 请求并处理响应,是 Java 中处理 HTTP 请求的强大工具。

二、Apache HttpClient 高级版

1. HttpClients 类概述

HttpClients 是 Apache HttpClient 库中的一个工厂类,用于创建和配置 CloseableHttpClient 实例。它是构建 HTTP 客户端的入口点,支持高度自定义的 HTTP 请求处理,包括连接池管理、SSL/TLS 配置、重试机制等。


2. 核心方法与配置

2.1 创建默认客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
  • 特点

    • 使用默认的配置(连接池、请求重试等)。

    • 适合简单场景,但扩展性有限。

2.2 自定义配置客户端

通过 HttpClients.custom() 返回 HttpClientBuilder,允许精细化配置:

 CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager)  // 连接池管理.setDefaultRequestConfig(requestConfig)   // 请求超时配置.setRetryHandler(retryHandler)            // 请求重试策略.setProxy(proxy)                          // 代理设置.setSSLContext(sslContext)                // SSL/TLS 配置.build();

3. 高级配置详解

3.1 连接池管理

连接池是提升性能的关键组件,避免频繁创建和销毁连接。

 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(200);          // 最大总连接数connectionManager.setDefaultMaxPerRoute(20); // 每个路由(目标主机)的最大连接数​CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();
3.2 超时配置
 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)    // 连接建立超时时间(毫秒).setSocketTimeout(10000)     // 数据传输超时时间(毫秒).setConnectionRequestTimeout(2000) // 从连接池获取连接的超时时间.build();​CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
3.3 重试机制

自动重试失败的请求(例如网络波动导致失败):

 HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {if (executionCount >= 3) return false; // 最大重试次数if (exception instanceof NoHttpResponseException) return true; // 无响应时重试return false;};​CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(retryHandler).build();
3.4 代理配置
 HttpHost proxy = new HttpHost("proxy.example.com", 8080);CloseableHttpClient httpClient = HttpClients.custom().setProxy(proxy).build();
3.5 SSL/TLS 配置

信任所有证书(仅限测试环境):

 SSLContext sslContext = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true) // 信任所有证书.build();​CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) // 跳过主机名验证.build();
3.6 认证机制

使用 Basic 认证:

 CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(new AuthScope("host.example.com", 80),new UsernamePasswordCredentials("user", "pass"));​CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();

4. 请求与响应处理

4.1 发送 GET 请求
 HttpGet httpGet = new HttpGet("https://api.example.com/data");try (CloseableHttpResponse response = httpClient.execute(httpGet)) {int statusCode = response.getStatusLine().getStatusCode();HttpEntity entity = response.getEntity();String content = EntityUtils.toString(entity);EntityUtils.consume(entity); // 确保资源释放}
4.2 发送 POST 请求(JSON 数据)
 HttpPost httpPost = new HttpPost("https://api.example.com/create");StringEntity jsonEntity = new StringEntity("{\"key\":\"value\"}", ContentType.APPLICATION_JSON);httpPost.setEntity(jsonEntity);​try (CloseableHttpResponse response = httpClient.execute(httpPost)) {// 处理响应...}
4.3 文件上传(Multipart)
 HttpPost httpPost = new HttpPost("https://api.example.com/upload");FileBody fileBody = new FileBody(new File("path/to/file"));MultipartEntityBuilder builder = MultipartEntityBuilder.create().addPart("file", fileBody).addTextBody("comment", "File upload");httpPost.setEntity(builder.build());

5. 高级功能

5.1 异步请求

使用 HttpAsyncClients 实现异步非阻塞请求:

 CloseableHttpAsyncClient asyncClient = HttpAsyncClients.custom().build();asyncClient.start();​SimpleHttpRequest request = SimpleHttpRequest.get("https://api.example.com/data");Future<SimpleHttpResponse> future = asyncClient.execute(request, new FutureCallback<>() {@Overridepublic void completed(SimpleHttpResponse response) {System.out.println("Response: " + response.getBodyText());}​@Overridepublic void failed(Exception ex) {ex.printStackTrace();}​@Overridepublic void cancelled() {System.out.println("Request cancelled");}});
5.2 请求拦截器

添加自定义逻辑(如日志记录、修改请求头):

 CloseableHttpClient httpClient = HttpClients.custom().addInterceptorFirst((HttpRequestInterceptor) (request, context) -> {request.addHeader("X-Custom-Header", "value");System.out.println("Request URI: " + request.getRequestLine().getUri());}).build();
5.3 Cookie 管理

自动管理 Cookie:

 CookieStore cookieStore = new BasicCookieStore();CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();

6. 最佳实践与常见问题

6.1 资源释放

确保关闭 CloseableHttpClientCloseableHttpResponse

 try (CloseableHttpClient httpClient = HttpClients.createDefault()) {try (CloseableHttpResponse response = httpClient.execute(request)) {// 处理响应...}}
6.2 性能调优
  • 连接池参数:根据并发需求调整 MaxTotalDefaultMaxPerRoute

  • 超时设置:避免因网络问题导致线程阻塞。

  • 重用连接:复用 HttpClient 实例而非频繁创建。

6.3 错误处理
  • 重试策略:针对可恢复错误(如超时)配置自动重试。

  • 异常捕获:处理 IOExceptionClientProtocolException 等。

6.4 安全性
  • 生产环境禁用信任所有证书:使用有效 CA 签名的证书。

  • 敏感信息保护:避免在日志中打印请求头或响应体中的敏感数据。


7. 典型应用场景

  1. 微服务间通信:在分布式系统中通过 HTTP 调用其他服务。

  2. API 集成:调用第三方 RESTful API(如支付网关、地图服务)。

  3. 爬虫开发:抓取网页内容并解析数据。

  4. 文件传输:上传/下载文件到远程服务器。

  5. 测试自动化:模拟客户端发送 HTTP 请求验证接口功能。


8. 官方文档与资源

  • Apache HttpClient 官方文档: Apache HttpComponents – HttpClient Overview

  • GitHub 仓库: https://github.com/apache/httpcomponents-client


相关文章:

Apache HttpClient使用

一、Apache HttpClient 基础版 HttpClients 是 Apache HttpClient 库中的一个工具类&#xff0c;用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配…...

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…...

【微服务架构】本地负载均衡的实现(基于随机算法)

前言 负载均衡 概念&#xff1a;一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术&#xff0c;旨在提高系统的可用性、性能和可伸缩性。作用&#xff1a; 提高性能&#xff1a;通过将请求分散到多个实例上&#xff0c;避免单个实例因请求过多而过载&#xff…...

C盘急救实录:从爆红到畅快

极速救援通道&#xff08;懒人专享&#xff09; 老规矩&#xff0c;先上王炸方案&#xff01;”小番茄C盘清理器”直达链接&#xff1a;https://cclean-cdn.xkbrowser.com/cleanmaster/FanQieClean_13046_st.exe 这个神器有三绝&#xff1a; 智能扫描引擎&#xff1a;能识别23…...

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现 随着深度学习技术的发展,图像分割任务取得了长足的进步。本文将从一个具体的PyTorch代码实例出发,带大家了解一种 novel 的语义分割网络架构——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…...

openGl片段着色器的含义

片段着色器的含义及代码中的应用说明&#xff1a; 1. 片段着色器的基本概念 片段着色器&#xff08;Fragment Shader&#xff09;是OpenGL着色器管线中的关键组件&#xff0c;主要用于计算屏幕空间中每个片段&#xff08;对应像素&#xff09;的最终颜色。它是图形渲染流程的…...

ROS2 部署大语言模型节点

4GB GPU的DeepSeek-Coder 1.3B模型&#xff0c;并且它已经被量化或优化过。以下是具体的步骤&#xff1a; 安装必要的依赖项&#xff1a; pip install transformers torch grpcio googleapis-common-protos创建一个新的ROS 2包&#xff1a; cd ~/ros2_ws/src ros2 pkg creat…...

UART转APB模块ModelSim仿真

一、简介 之前介绍过一个UART转AHB模块&#xff0c;这个代码的框架有个好处&#xff0c;就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图&#xff0c;主要有三个状态机&#xff1a; &#xff08;1&#xff09; UART_RX_FSM将接收…...

【LeetCode 题解】算法:4.寻找两个正序数组的中位数

1. 引言&#xff1a;挑战 LeetCode 经典算法题 在算法这片广袤无垠的天地里&#xff0c;一道道经典题目宛如夜空中熠熠生辉的星辰&#xff0c;持续吸引着开发者们投身其中&#xff0c;不断探索。今天&#xff0c;我们继续将目光聚焦于 LeetCode 平台上一道极具代表性的题目&am…...

基于 SGLang 部署 Qwen2.5 7B 模型

本文将详细介绍如何使用 SGLang 快速部署 Qwen2.5 7B 模型,并深入探讨 SGLang 的关键性能优化技术,以及预期可以达到的延迟和吞吐量。 1. SGLang 框架介绍 SGLang 旨在解决 LLM 服务中的核心挑战: 高延迟: LLM 推理通常需要较长的计算时间,导致响应延迟高。低吞吐量: 由…...

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;...

JDBC 连接字连接 KingbaseES支持主从负载均衡参数说明。

JDBC 连接字符串是用于连接 KingbaseES&#xff08;人大金仓数据库&#xff09;的&#xff0c;支持主从负载均衡。让我们逐一解析各个参数的作用&#xff0c;并探讨如何调整到最优。 参数解析 jdbc:kingbase8://10.10.14.19:54321/xxx_onlinejdbc:kingbase8://&#xff1a;指定…...

Java运行时的堆、栈和方法区

目录 1. 堆&#xff08;Heap&#xff09;存储内容与线程关系 2. 栈&#xff08;Stack&#xff09;存储内容与线程关系 3. 方法区&#xff08;Method Area&#xff09;存储内容与线程关系变动 1. 堆&#xff08;Heap&#xff09; 存储内容 对象实例&#xff08;对象实例的全部数…...

【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)

BKP备寄存器 BKP简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.8~3.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xff0…...

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…...

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…...

[CLS] Token 在 ViT(Vision Transformer)中的作用与实现

[CLS] Token 在 ViT&#xff08;Vision Transformer&#xff09;中的作用与实现 1. 什么是 [CLS] Token&#xff1f; [CLS]&#xff08;classification token&#xff09;是Transformer模型中一个可学习的嵌入向量&#xff0c;最初在 BERT&#xff08;Bidirectional Encoder …...

基于网启PXE服务器的批量定制系统平台

项目概述 1.需求 公司新购了一批服务器和台式机&#xff0c;需要为台式机和服务器安装系统&#xff0c;一部分需要安装国产OpenEuler&#xff0c;一部分要求安装CentOS 7.9&#xff0c;同时也要满足定制化需求&#xff0c;即按要求分区安装相应软件。 2.使用开源软件 &…...

Reactor/Epoll为什么可以高性能?

在 Reactor 模式中使用 epoll_wait 实现低 CPU 占用率的核心原理是 ​事件驱动的阻塞等待机制&#xff0c;而非忙等待。以下通过分步骤解析其工作原理和性能优势&#xff1a; void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…...

-JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期

#JavaEE-HTTP-Servlet& 路由 & 周期 参考&#xff1a; https://blog.csdn.net/qq_52173163/article/details/121110753 1 、解释 Servlet 是运行在 Web 服务器或应用服务器上的程序 , 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数…...

在本地Windows机器加载大模型并生成内容

本篇演示在本地机器下载和加载大模型并获取AI产生的内容。简单起见&#xff0c;使用的大模型是Qwen2.5-0.5B-Instruct&#xff0c;整个模型的所有文件不到1G。 Qwen2.5-0.5B-Instruct 是阿里巴巴云 QWen 团队基于 Transformer 架构开发的轻量级指令调优语言模型&#xff0c;专…...

热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

找树左下角的值 本题递归偏难&#xff0c;反而迭代简单属于模板题&#xff0c; 两种方法掌握一下 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 我们来分析一下题目&#…...

shopify跨境电商行业前景与规模

Shopify跨境电商行业前景与规模分析 一、行业背景 Shopify 是一个全球知名的电子商务平台&#xff0c;它为小型企业到大型企业提供了创建和管理在线商店的工具。近年来&#xff0c;随着全球化进程的加快以及互联网技术的发展&#xff0c;跨境电商已经成为国际贸易的重要组成部…...

【计算机网络】-计算机网络期末复习题复习资料

一、计算机网络体系结构&#xff08;800字&#xff09; 1. OSI参考模型 七层结构&#xff1a;物理层→数据链路层→网络层→传输层→会话层→表示层→应用层 各层核心功能&#xff1a; 物理层&#xff1a;比特流传输&#xff08;如RJ45、光纤接口&#xff09; 数据链路层&…...

游戏中的碰撞检测算法

参考博客Sort, sweep, and prune: Collision detection algorithms...

批归一化(Batch Normalization)与层归一化(Layer Normalization)的区别与联系

文章目录 一、Batch normalization 理论与应用1. 理论解释2. 数值例子 二、Layer normalization 理论与应用1. 理论解释2. 数值例子 三、Layer Normalization 和 Batch Normalization 的区别四、《Transformers without Normalization》笔记 一、Batch normalization 理论与应用…...

12届蓝桥杯—货物摆放

货物摆放 题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有 nn 箱货物要摆放在仓库&#xff0c;每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向&#xff0c;每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...

c++进阶--哈希表的实现

大家好&#xff0c;今天我们来学习ubordered_set和unordered_map的底层哈希表。 目录 哈希表实现 1. 哈希概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因⼦ 1.4 将关键字转为整数 1.5 哈希函数 下面我们介绍几种哈希函数&#xff1a;1.5.1 除法散列法/除留余数法 1.…...

颠覆传统:SaaS 品牌如何通过 SEO 策略引爆市场!

SaaS 商业模式提供了令人难以置信的可扩展性和盈利能力——但前提是与正确的营销增长策略相结合。 SaaS 品牌知道&#xff0c;托管基于云的应用程序的成本会随着用户量的增加而降低&#xff0c;因此必须专注于订阅者的快速增长&#xff0c;以保持竞争力并降低成本。 许多 CMO…...

【数据库发展史】

数据库的发展历史可以追溯到20世纪50年代&#xff0c;随着计算机技术的进步和数据管理需求的演变&#xff0c;数据库系统经历了多个阶段的变革。以下是数据库技术的主要发展阶段&#xff1a; 1. 前数据库时代&#xff08;1950年代前&#xff09; 手工管理&#xff1a;数据通过…...