发送Http请求的HttpClientUtil工具

news/2024/10/25 15:19:48/

发送Http请求的HttpClientUtil工具

代码如下:

/*** @author xuan* @create 2023/11/6*/
public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();// http客户端private static CloseableHttpClient httpClient;static {//连接池最大连接数connMgr.setMaxTotal(200);//每个路由的最大连接数connMgr.setDefaultMaxPerRoute(20);//连接的过期时间connMgr.setValidateAfterInactivity(1000*60);}public static void post(String url, Map<String, String> params) {//这里之所以有两个检查是否为null的语句,主要是支持高并发的,比如现在一次性的有很多个请求过来,首先这些请求先判断第一个if,发现httpClient == null//是成立的,接着这些请求就会跑到synchronized关键字的上面,然后因为同步原因,第一个请求会先进去,进去之后发现httpClinet == null仍然是成立的,接着//当前请求就去给httpClient赋值;然后当前请求走出代码同步块,接着第二个请求会进去,发现httpClient已经不等于空了,所以就不会重新给httpClient进行赋值了,//因此第二个null是很有必要写的,可以提升代码的效率if(httpClient == null) {synchronized(HttpUtil.class) {if(httpClient == null) {httpClient = HttpClients.custom().setConnectionManager(connMgr).build();}}}//创建Post请求HttpPost httpPost = new HttpPost(url);//设置参数List<NameValuePair> formParams = new ArrayList<>();for(Map.Entry<String, String> entry : params.entrySet()) {String name = entry.getKey();String value = entry.getValue();formParams.add(new BasicNameValuePair(name, value));}UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, StandardCharsets.UTF_8);httpPost.setEntity(entity);try {CloseableHttpResponse response = httpClient.execute(httpPost);System.out.println(response);} catch (IOException e) {throw new RuntimeException(e);} finally {httpPost.releaseConnection();}}public static void main(String[] args) {Map<String, String> params = new HashMap<>();params.put("rid", "666");params.put("level", "666");params.put("content", "666");params.put("server", "666");params.put("logType", "666");params.put("sid", "666");params.put("time", new Date().getTime() + "");HttpUtil.post("http://192.168.10.232:9898/addOne", params);}
}

注意这里有一个http请求连接池,功能和数据库连接池的功能差不多,都是用来提高连接效率的。如下图:
在这里插入图片描述

使用http请求连接池,可以把一些http连接放到池子里面,这样我们就不用频繁的进行http连接和断开http连接了,需要的时候直接去连接池里面去拿,用完之后就放回到池子里面。

为什么频繁的进行http连接和断开http连接消耗性能呢?

  • 避免反复的三次握手和四次握手。长连接的建立需要进行三次握手,而连接的释放需要进行四次握手,这是发生在系统层面的两个动作,对于单条连接来说耗时微乎其微,但在高吞吐场景时,耗时则不能忽略。

执行main方法,如下图:
在这里插入图片描述
返回的状态码是200,插入成功!


http://www.ppmy.cn/news/1200004.html

相关文章

1.4、Python基础-闭包、装饰器、语法糖、反射

1.3、Python基础 1、闭包2、装饰器-语法糖写法3、Python中的反射 1、闭包 闭包就是外部函数中定义一个内部函数&#xff0c;内部函数引用外部函数中的变量&#xff0c;外部函数的返回值是内部函数 def Student():name "susu"age 21print(f"{name}{age}了&qu…

创新思维:腾讯产品经理如何解决一头800kg牛的过桥难题?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;一个热爱技术、热爱分享的90后&#xff0c;今天我要和大家一起探讨一道经典的面试题——“腾讯产品经理面试题&#xff1a;一头牛重800kg&#xff0c;一座桥承重700kg&#xff0c;牛该怎么过桥&#xff1f;”…

vue3的自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (CustomDirectives)。 1.自定义指令的目的和简单介绍 自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 一个自定义指令由一个包含类似组件生命周期钩子的对象…

设计模式之装饰模式

一、概念 装饰模式是一种结构型设计模式&#xff0c;允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 二、构造 部件&#xff08;Component&#xff09;声明封装器和被封装对象的公用接口。 具体部件&#xff08;Concrete Component&#xff09;类是…

全光谱大面积氙光灯太阳光模拟器老化测试

氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试&#xff0c;光热转化&#xff0c;光电材料特性测试&#xff0c;生物…

快速跳转插件

只要是著名的编辑软件&#xff08;很多人使用的&#xff09;一般就会有相应的跳转插件&#xff0c;用于快速在页面中进行快速的跳转&#xff0c;在Github的这个链接中列出了一些著名软件的跳转插件&#xff1a;https://github.com/acejump/AceJump#comparison

vue如何实现视频全屏切换

最近项目开发中遇到一个视频窗口全屏切换功能&#xff0c;为此在这里做个记录。 具体的实现思路&#xff1a; <template><div class"content-box"><div class"container"><div id"screen" class"screen"><…

Elasticsearch实战:常见错误及详细解决方案

Elasticsearch实战&#xff1a;常见错误及详细解决方案 1.read_only_allow_delete":“true” 当我们在向某个索引添加一条数据的时候&#xff0c;可能&#xff08;极少情况&#xff09;会碰到下面的报错&#xff1a; {"error": {"root_cause": [{&…