发送Http请求的HttpClientUtil工具

发送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,插入成功!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java--类和对象

目录 面向对象一.类1.类的创建默认初始化2.类的实例化3.注意事项利用类的创建来交换值 二.this1.使用this2.可使用this来调用其他构造方法来简化 三.构造方法3.1概念3.2特性3.3不带参数的构造方法3.4带参数的构造方法当使用自定义的构造方法后&#xff0c;再删除时&#xff0c;…

【Orangepi Zero2 全志H616】驱动舵机控制 / Linux定时器(signal、setitimer)

一、SG90舵机开发 舵机基本介绍 二、Linux定时器 signal 函数setitimer 函数原型signal、setitimer函数API调用 三、舵机 软件PWM实现 一、SG90舵机开发 舵机基本介绍 如下图所示&#xff0c;最便宜的舵机sg90&#xff0c;常用三根或者四根接线&#xff0c;黄色为PWM信号控…

JMeter:断言之响应断言

一、断言的定义 断言用于验证取样器请求或对应的响应数据是否返回了期望的结果。可以是看成验证测试是否预期的方法。 对于接口测试来说&#xff0c;就是测试Request/Response&#xff0c;断言即可以针对Request进行&#xff0c;也可以针对Response进行。但大部分是对Respons…

【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件

文章目录 1.MenuStrip2.ContextMenuStrip3.ToolStrip4.StatusStrip 1.MenuStrip MenuStrip作为一个容器可以包含多个菜单项。MenuStrip 的重要属性包括&#xff1a; Name&#xff1a;菜单的名字Dock&#xff1a;菜单的停靠位置Items&#xff1a;菜单项的集合 ToolStripMenuI…

多种循环法打印乘法表

1 问题 使用多种循环法打印乘法表&#xff0c;有助于巩固夯实循环的语法及用法。 使用for-for、for-while、while-for方法实现乘法表。 2 方法 &#xff08;1&#xff09;for-for:使用两个for.. in..来实现乘法表。 &#xff08;2&#xff09;for-while:使用一个for语句再一个w…

Visual Studio Code将中文写入变量时,中文老是乱码问题

对于这个问题&#xff0c;我也是弄了很久才知道&#xff0c;编码格式的问题 在此之前我们要先下载个插件 照这以上步骤&#xff0c;最后按F6运行即可&#xff0c;按F6是利用我们刚刚下载的插件进行编译&#xff0c;唯一有一点不好就是&#xff0c;用这种插件运行的话&#xff…

【算法| 差分 No.1】AcWing 797. 差分 AcWing 798. 差分矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家有所帮…

VMware Ubuntu 共享文件夹

VMware Ubuntu 共享文件夹 flyfish 物理机配置 Network Adapter设置 此处设置为NAT Shared Folders设置 虚拟机配置 vmware-hgfsclient sudo vmhgfs-fuse .host:/ /mnt -o nonempty -o allow_other 或者 sudo vmhgfs-fuse .host:/ /mnt/ -o allow_other第一行命令是查看共…

如何保障企业TikTok直播网络的可靠性?

在这个直播流量爆炸的时代&#xff0c;直播带货的营销方式逐渐走向大众&#xff0c;企业通过直播的方式向消费者展示产品和服务&#xff0c;从而提高品牌知名度。而TikTok作为全球最受欢迎的短视频和直播社交平台&#xff0c;拥有庞大且活跃的用户群体&#xff0c;是不少企业直…

每日一题 --- 力扣318----最大单词长度乘积

这道题时间复杂度我感觉设置的不是很好&#xff0c;应该最好是有一个1000变成10000就行。 因为我在做这道题的时候被误导了&#xff0c;以为双重循环暴力判断一下也能过&#xff0c;因为1000*1000 *26的时间复杂度没有到1亿&#xff0c;那么我刚开始认为是能过的&#xff0c;结…

RPC 原理详解

文章目录 什么是 RPCRPC 基本原理RPC核心功能服务寻址数据编解码网络传输一次RPC的调用过程 实践基于HTTP协议的RPC基于TCP协议的RPC 什么是 RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用&#xff0c;它允许像调用本地服务一样调用远程服…

内涝积水监测仪怎么样?万宾科技城市内涝积水监测的作用

在城市建设发展过程中&#xff0c;道路基础设施的建设永远都占据着重要一席&#xff0c;因为人们出行一旦受阻便会影响城市进展&#xff0c;也会影响经济发展。在城市之中有隧道&#xff0c;下穿式立交桥等容易存积水的地方&#xff0c;一旦出现恶劣暴雨天气&#xff0c;这些地…

腾讯云CVM服务器操作系统镜像大全

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像&#xff0c;公共镜像包含基础操作系统和腾讯云提供的初始化组件&#xff0c;公共镜像分为Windows和Linux两大类操作系统&#xff0c;如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…

chroot

1.chroot技术 在Linux系统中&#xff0c;系统默认的目录结构都是以/&#xff0c;即根(root)开始的。而在使用chroot之后&#xff0c;进程的系统目录结构将以指定的位置作为根(/)位置。chroot实际作用就是将进程描述符中struct fs_struct中的root的值设置为选定的目录。 在经过…

品牌如何长期占领小红书市场,小红书投放复盘怎么规划?

想要实现产品种草与品牌营销&#xff0c;达人投放成了很多品牌的选择。然而随着达人协助成本的水涨船高&#xff0c;提高达人投放结果&#xff0c;就变得迫在眉睫。今天我们将为大家分享下&#xff0c;品牌如何长期占领小红书市场&#xff0c;小红书投放复盘怎么规划&#xff1…

el-select 搜索无选项时 请求接口添加输入的值

el-select 搜索无选项时 请求接口添加输入的值 <template><div class"flex"><el-select class"w250" v-model"state.brand.id" placeholder"请选择" clearable filterable :filter-method"handleQu…

随时随地时时刻刻使用GPT类应用

疑问 很多人说GPT的广泛使用可能会使人们失业&#xff0c;会对一些互联网公司的存活造成挑战&#xff0c;那么这个说法是真的吗&#xff1f; 这个说法并不完全准确。虽然GPT等AI技术的广泛应用可能会对某些行业和职业产生影响&#xff0c;但并不意味着它会导致人们失业或互联网…

【Qt之事件过滤器】使用

介绍 事件过滤器是Qt中一种重要的机制&#xff0c;用于拦截并处理窗口和其他对象的事件。 它可以在不修改已有代码的情况下&#xff0c;动态地增加、删除一些处理事件的代码&#xff0c;并能够对特定对象的事件进行拦截和处理。 在Qt中&#xff0c;事件处理经过以下几个阶段&…

.NET Core 中插件式开发实现

在 .NET Framework 中&#xff0c;通过AppDomain实现动态加载和卸载程序集的效果&#xff1b;但是.NET Core 仅支持单个默认应用域&#xff0c;那么在.NET Core中如何实现【插件式】开发呢&#xff1f; 一、.NET Core 中 AssemblyLoadContext的使用 1、AssemblyLoadContext简…

CodeWhisperer 的安装及体验

文章作者&#xff1a;Pony CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网&#xff1a;https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 在编写代码时&#xff0c…