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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-X~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值