Apache HttpClient总览

一、重大版本

Apache HttpClient 4.x 系列

    •    HttpClient 4.0(发布于2008年左右):这是一个重要的里程碑,标志着HttpClient从Jakarta Commons项目转移到Apache HttpComponents项目。4.0版进行了大量的重构,引入了新的连接管理模型(基于HttpCore),支持了HTTP/1.1的持久连接、连接池以及更灵活的配置选项。
    •    HttpClient 4.2(发布于2013年之前):此版本增加了对HTTP状态线支持、改进了多部分实体的处理、增强了请求参数编码,以及更强大的HTTP响应处理能力。它还引入了对国际域名(IDN)的支持,并改进了与SSL/TLS相关的功能。
    •    HttpClient 4.5(约2015年至2016年间):这个版本重点在于提升性能、增强安全性、简化API使用,并且开始为HTTP/2做准备。它包括对TLSv1.2的支持、改进的连接管理、更严格的SSL握手策略,以及对HTTP/2的初步实验性支持。

Apache HttpClient 5.x 系列

    •    HttpClient 5.0(2018年以后):这是一个重大的更新,引入了全新的HTTP/2实现,完全基于Java NIO,提供了原生的异步支持。此外,它还增强了对HTTP/1.1的性能和兼容性,改进了连接重用策略,支持了WebSocket,以及提供了更强大的请求和响应拦截器系统。
    •    后续版本:随着时间的推移,HttpClient 5.x系列通过后续的小版本更新,继续优化HTTP/2支持、修复漏洞、提升性能和稳定性,并引入更多现代Web特性支持,如HTTP/3的实验性支持、对新TLS版本的兼容性增强等。

二、代码模块

httpclient

httpcore

httpcore-nio

httpasyncclient

    1.    HttpCore:
    •    核心包:这是HttpClient库的基础,提供了HTTP协议的核心抽象和实现。它定义了HTTP请求、响应、头信息、实体内容、连接管理等基本组件。HttpCore分为两个模块:httpcore 用于NIO(非阻塞I/O)支持,而 httpcore-nio 专注于阻塞I/O模型。它是构建高性能HTTP客户端和服务端的基础。
    2.    HttpClient:
    •    高级API:基于HttpCore,HttpClient提供了更高层次的API,使得发送HTTP请求变得简单直接。它封装了复杂的HTTP协议细节,让你可以专注于业务逻辑。HttpClient支持HTTPS、认证、连接管理、重定向处理、请求和响应实体的处理等特性。
    3.    HttpAsyncClient:
    •    异步API:针对需要高性能和高并发的应用场景,HttpAsyncClient提供了异步请求处理能力。这意味着你可以在发送HTTP请求后立即返回,不阻塞当前线程,当响应到达时通过回调或Future/Promise模式处理结果。这非常适合那些需要处理大量并发请求的场景。
    4.    Connection Management:
    •    连接池管理:HttpClient支持通过ConnectionManager(如PoolingHttpClientConnectionManager)来复用连接,减少每次请求时建立和销毁TCP连接的开销。连接池管理包括连接的最大数量、超时设置、空闲连接的清理等,对于性能优化至关重要。
    5.    Request and Response Handling:
    •    请求与响应处理:HttpClient提供了丰富的API来构建HTTP请求(如GET、POST、PUT等)、设置请求头、处理请求体、解析响应等。它还支持多种实体处理器(EntityHandler)来处理不同类型的内容,如字符串、文件、流等。
    6.    Authentication and Authorization:
    •    认证与授权:支持多种认证机制,包括Basic、Digest、NTLM、Kerberos以及OAuth等,以满足不同安全需求。
    7.    Redirects and Retries:
    •    重定向与重试:自动处理HTTP重定向,并且可以配置重试策略来处理暂时性的网络问题或服务器错误。
    8.    SSL/TLS Support:
    •    SSL/TLS支持:HttpClient能够处理HTTPS请求,并允许自定义SSL上下文以支持信任管理、证书验证等安全配置。
    9.    Interceptors and Filters:
    •    拦截器与过滤器:允许插入自定义逻辑到请求/响应处理流程中,例如日志记录、请求/响应修改、计时、性能监控等。
    10.    Content Compression:
    •    内容压缩:支持请求和响应内容的自动压缩,减少网络传输的数据量,提升效率。

 三、设计哲学

CloseableHttpClient 上层使用入口,通过HttpClients工具生产

HttpClientConnectionManager 连接管理,最大连接数,单路由最大连接数

RequestConfig 请求配置,连接超时时间,读取超时时间

在Spring框架中,Spring为RestTemplate设计了兼容类,org.springframework.http.client.HttpComponentsClientHttpRequestFactory

用来直接接收HttpClient。这样就完美结合了RestTemplate和Apache HttpClient

import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
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.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;public class HttpClientPoolUtil {private static final int MAX_TOTAL_CONNECTIONS = 100;private static final int DEFAULT_MAX_PER_ROUTE = 20;private static final int CONNECT_TIMEOUT = 5000; // 连接超时时间,单位毫秒private static final int SOCKET_TIMEOUT = 10000; // 数据读取超时时间,单位毫秒private static volatile CloseableHttpClient httpClient;private static PoolingHttpClientConnectionManager connectionManager;private HttpClientPoolUtil() {// 防止外部实例化}private static synchronized void init() {if (httpClient != null) {return;}connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(MAX_TOTAL_CONNECTIONS);connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);RequestConfig config = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(config).build();}public static String sendGetRequest(String url) throws Exception {if (httpClient == null) {init();}HttpGet httpGet = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(httpGet)) {HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity);} else {throw new RuntimeException("Response entity is null");}}}// 可以根据需要添加其他HTTP方法如POST、PUT等
}public class Main {public static void main(String[] args) {try {String response = HttpClientPoolUtil.sendGetRequest("http://example.com/api/data");System.out.println(response);} catch (Exception e) {e.printStackTrace();}}
}

四、理解

Apache HttpClient 是一个实现了HTTP协议的客户端库,它允许Java应用程序发送HTTP请求并与Web服务器交互。从HTTP协议的角度来说,HttpClient确实是在实现一个无状态的协议。HTTP本身被设计为无状态协议,这意味着每个请求都是独立的,服务器不保留关于客户端请求之间的任何上下文信息,除非显式地通过例如Cookies等方式在请求之间传递状态。

HttpClient作为一个工具类库,它本身也是无状态的,即HttpClient实例不会在内部存储关于之前请求的信息,除非你特别配置它去保存某些状态信息(比如使用CookieStore来管理Cookies)。每次你使用HttpClient创建并发送一个新的请求时,都需要为该请求提供完整的必要信息,包括URL、请求方法、头信息、请求体等。HttpClient不会自动记住或应用前一次请求的任何配置或结果到下一次请求,除非你进行了相应的编程设计来复用这些信息。

然而,HttpClient提供了连接管理(通过PoolingHttpClientConnectionManager等)来复用物理连接,这可以提高效率,但这并不改变其无状态的本质——连接的复用是一种资源管理策略,而不是对请求间状态的维护。因此,从这个角度看,说HttpClient是一个实现无状态协议(HTTP)的无状态工具类是准确的。

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

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

相关文章

【OpenVINO™】使用 OpenVINO™ C++ 异步推理接口部署YOLOv8 ——在Intel IGPU 上实现80+FPS视频推理

​ OpenVINO Runtime支持同步或异步模式下的推理。Async API的主要优点是,当设备忙于推理时,应用程序可以并行执行其他任务(例如,填充输入或调度其他请求),而不是等待当前推理首先完成。 当我们使用异步API…

ubuntu20.04设置共享文件夹

ubuntu20.04设置共享文件夹 一,简介二,操作步骤1,设置Windows下的共享目录2,挂载共享文件夹3,测试是否挂载成功 一,简介 在公司电脑上,使用samba设置共享文件夹,IT安全部门权限不通…

PythonWeb项目-Django+vue宾馆管理系统功能介绍

本项目源码:基于Python的Django-vue宾馆管理系统源码-参考文档资源-CSDN文库 项目关键技术 开发工具:Pycharm 编程语言: Python 数据库: MySQL5.7 框架:Django、vue 前端:Vue、ElementUI 关键技术:Django、vue、MYSQL…

全新取图系统搭建,广泛应用,轻松解决找图难问题!

前言 在数字化高速发展的时代,图片已成为人们日常交流不可或缺的一部分。每个社交平台我们都需要头像、背景等去打造属于我们自己的一张名片。为了满足大众日益增长的需求,并创造更多的收益机会,搭建一款先进的取图系统真的很必要。 一、这款…

RabbitMQ概述

RabbitMQ RabbitMQ概述 RabbitMQ是一个开源的消息代理(message broker)系统,最初由Rabbit Technologies Ltd开发,并在开源社区的支持下不断发展和完善。它提供了强大的消息传递机制,被广泛应用于构建分布式系统和应用…

1058 选择题(测试点1)

solution 把题目设置为结构体,记录题目的总分,做错该题的人数,题目编号(从1开始),正确答案。对于输入的学生答案提取每道题的回答,与答案对比是否相等,若相等则该同学的分数加上这一…

易保全网络赋强公证系统,“公证赋强+科技赋能”双重增信

网络赋强公证系统是一种创新的法律服务模式,旨在通过线上方式赋予债权文书强制执行效力。具体来说,该系统结合了互联网技术与公证业务,允许公证机构根据当事人的申请,利用互联网公证技术手段对互联网上的债权文书进行公证&#xf…

算法训练营day06--242.有效的字母异位词+349. 两个数组的交集+202. 快乐数+1. 两数之和

一、242.有效的字母异位词 题目链接:https://leetcode.cn/problems/valid-anagram/description/ 文章讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html 视频讲解:http…

是否可以购买外链?

答案是可以,但要看你买什么外链,有价值的自然外链价格肯定也高,随便到某些平台发的外链,哪怕是相关的高权重平台,作用也有限,当然,你要大批量购买,说不定也能出一点效果,…

基于Java的诊所医院管理系统,springboot+html,MySQL数据库,用户+医生+管理员三种身份,完美运行,有一万一千字论文

演示视频 基本介绍 基于Java的诊所医院管理系统,springboothtml,MySQL数据库,用户医生管理员三种身份,完美运行,有一万一千字论文。 用户:个人信息管理、预约医生、查看病例、查看公告、充值、支付费用...…

【CT】LeetCode手撕—53. 最大子数组和

目录 题目1-思路2- 实现⭐53. 最大子数组和——题解思路 3- ACM 实现 题目 原题连接:53. 最大子数组和 1-思路 动规五部曲 1. 定义 dp 数组 dp[i] 含义为:下标为 i 的数组的最大子数组和 2. 递推公式 因为所求的是最大子数组的和,即当前 n…

快速掌握JUnit等测试框架的使用,进行Java单元测试

1. 单元测试简介 单元测试(Unit Testing)是一种软件测试方法,通过对软件中的最小可测试单元进行验证,确保它们按预期工作。单元测试通常用于测试一个类的单个方法,以确保其逻辑正确、边界情况处理妥当、异常处理合适。…

【HarmonyOS - UIAbility组件和UI的数据同步】

简述 基于HarmonyOS的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信:基于发布订阅模式来实现,事件需要先订阅后发布,订阅者收到消息后进行处理。使用globalThis进行数据同步…

unity 打包PC安装包中常见文件的功能

目录 前言 一、打包好的文件 二、常用文件 1.文件夹XXX_Data 2.文件夹MonoBleedingEdge 3.文件夹XXX_Data内部 三、文件的应用 1.如果你替换了一个图片 2.如果你新增了或减少了图片和资源 3.场景中有变动 4.resources代码加载的资源改了 5.如果你代码替换了 四、作…

Vue11-键盘事件

一、键盘事件:keydown和keyup事件 keydown 和 keyup 是两种常用于处理键盘输入事件的JavaScript事件。当你在网页的输入框或其他可输入元素上按下或释放键盘上的某个键时,这些事件就会被触发。 1-1、keydown 事件 当用户按下键盘上的某个键时&#xff…

vue3第三十九节(TS中的高级类型,分类以及使用注意事项)

前言:为什么需要使用高级类型,正常的类型不能满足日常的业务需求,对于复杂的数据结构、函数签名、类型转换,我们需要使用高级类型来处理,常用的高级类型包含以下几种: 常用的类型定义: 基本类…

【源码】html+JS实现:24小时折线进度图

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>24小时折线进度图</title> <st…

基于SpringBoot3+Vue3宠物小程序宠物医院小程序的设计与实现

大家好&#xff0c;我是程序员小孟。 最近开发了一个宠物的小程序&#xff0c;含有详细的文档、源码、项目非常的不错&#xff01; 一&#xff0c;系统的技术栈 二&#xff0c;项目的部署教程 前端部署包&#xff1a;npm i 启动程序&#xff1a;npm run dev 注意事项&…

qmt量化交易策略小白学习笔记第30期【qmt编程之获取行业概念数据--如何获取板块分类信息数据以及板块成分股数据】

qmt编程之获取行业概念数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取行业概念数…

uniapp地图选择位置

直接上代码 通过一个点击事件调用官方api即可调用 点击调用成功后显示如下 然后选择自己所需要的位置即可