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

使用HttpClient和HttpRequest发送HTTP请求

项目中经常会用到向第三方系统发送请求来传递数据或者获得信息,一般用的比较多的为HttpClient 和 HttpRequest,这里简要总结一下 HttpClient 和 HttpRequest 的用法

一、HttpClient

1. 发送get请求

public static String get(String url, Map<String, String> headMap, int timeout) {
    String result = null;
    CloseableHttpClient httpclient = HttpClients.createDefault();
    CloseableHttpResponse response = null;
    try {
        HttpGet httpGet = new HttpGet(url);
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout).build();
        httpGet.setConfig(requestConfig);
        setHead(httpGet, headMap);
        response = httpclient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity, "UTF-8");
        EntityUtils.consume(entity);
    } catch (Exception e) {
        LOG.error("HttpGet [{}] error: {}", url, e.getMessage(), e);
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        try {
            if (null != response) {
                response.close();  
            }
            httpclient.close();
        } catch (IOException e) {
            LOG.error("HttpGet [{}] httpclient close error: {}", url, e.getMessage(), e);
        }
    }
    return result;
}

1. 发送post请求

public static String postJson(String url, String body, Map<String, String> headMap, int timeout) {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    CloseableHttpResponse response = null;
    try {
        HttpPost httpPost = new HttpPost(url);
        httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
        setHead(httpPost, headMap);
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout).build();
        httpPost.setConfig(requestConfig);
        httpPost.setEntity(new StringEntity(body, "UTF-8"));
        response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        String responseContent = EntityUtils.toString(entity, "UTF-8");
        EntityUtils.consume(entity);
        return responseContent;
    } catch (Exception e) {
        LOG.error("HttpPostJson [{}] error: {}", url, e.getMessage(), e);
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        try {
            response.close();
            httpClient.close();
        } catch (IOException e) {
            LOG.error("HttpPostJson [{}] httpclient close error: {}", url, e.getMessage(), e);
        }
    }
}
private static void setHead(HttpRequestBase httpRequestBase, Map<String, String> headMap) {
    if (headMap != null && headMap.size() > 0) {
        Set<String> keySet = headMap.keySet();
        for (String key : keySet) {
            httpRequestBase.addHeader(key, headMap.get(key));
        }
    }
}

优点:连接池(复用HTTP连接)、重试、代理机制,社区活跃,性能更加优异

缺点:配置和API使用较为复杂

二、HttpRequest

1. 发送get请求

public static String get(String methodName, String url, Map<String, Object> paramMap, Map<String, String> headers){
    return HttpRequest.get(url).addHeaders(headers).form(paramMap).execute().body();
}

2. 发送post请求

public static String postForm(String methodName, String url, Map<String, Object> paramMap, Map<String, String> headers, String paramStr){
    return HttpRequest.post(url).addHeaders(headers).form(paramMap).body(paramStr).execute().body();
}

优点:功能简单,整体比较易用

缺点:性能一般,社区支持较弱

三、对比

hutool 的 HttpRequest 底层是基于 HttpClient 的,是对其进行了封装,提供了更加简便的API请求,使用 HttpRequest 可在一行代码中实现发送简单的HTTP请求,如果需要使用 HttpClient 更加复杂的操作,则可以通过自定义 HttpClient 并通过 setHttpClient() 方法传入 HttpClient

例如通过自定义Httpclient实现设置最大连接数量

// 创建连接池管理器
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100); // 设置最大连接数
connectionManager.setDefaultMaxPerRoute(20); // 设置每个路由的最大连接数

// 创建自定义的HttpClient
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create()
        .setConnectionManager(connectionManager);

// 使用 Hutool 的 HttpRequest 发送请求
HttpResponse response = HttpRequest.get("https://example.com")
        .timeout(5000) // 设置超时时间
        .setHttpClient(httpClientBuilder.build()) // 设置自定义的HttpClient
        .execute();

总结

  1. 小型简单项目可使用 HttpRequest 快速请求,较大型复杂项目适合使用 HttpClient
  2. HttpClient 引入 httpclient 依赖,HttpRequest 引入 hutool 依赖
  3. 如果有连接池、重试、代理等机制的需求则可使用 HttpClient
  4. 高性能,高并发,有复杂Http操作的场景则可使用 HttpClient

http://www.kler.cn/a/528490.html

相关文章:

  • [Linux]从零开始的STM32MP157 U-Boot移植
  • git基础使用--1--版本控制的基本概念
  • 剑指offer 数组 持续更新中...
  • 主流的AEB标准有哪些?
  • HTML<hgroup>标签
  • SSM开发(三) spring与mybatis整合(含完整运行demo源码)
  • 软件工程中的需求工程
  • 电脑优化大师-解决电脑卡顿问题
  • FFmpeg(7.1版本)编译:Ubuntu18.04交叉编译到ARM
  • Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍
  • 深入理解linux中的文件(上)
  • C++——缺省参数、函数重载、引用、inline
  • 海外问卷调查之渠道查,对企业经营的重要价值有哪些表现
  • 3.5.5 基于横盘结构的分析体系——缠论(走势类型)
  • abc 390 D(暴搜 复杂度用 bell数 证明 n 的集合的划分方法的数目)
  • [EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
  • 牛客网 除2!(详解)c++
  • JavaScript 入门教程
  • BW AO/工作簿权限配置
  • 本地部署 DeepSeek-R1
  • 面试问题知识
  • 数据库优化:提升性能的关键策略
  • numpy 中的各种用法(笔记向)
  • 【Docker】dockerfile识别当前构建的镜像平台
  • QT知识点复习
  • OpenCV 图像旋转