使用HttpClient和HttpRequest发送HTTP请求

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

一、HttpClient

  1. 发送get请求
java 复制代码
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请求
java 复制代码
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);
        }
    }
}
java 复制代码
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请求
java 复制代码
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();
}
  1. 发送post请求
java 复制代码
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实现设置最大连接数量

java 复制代码
// 创建连接池管理器
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
相关推荐
kangkang-3 小时前
PC端基于SpringBoot架构控制无人机(三):系统架构设计
java·架构·无人机
界面开发小八哥5 小时前
「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)
java·ide·java-ee·myeclipse
idolyXyz6 小时前
[java: Cleaner]-一文述之
java
一碗谦谦粉6 小时前
Maven 依赖调解的两大原则
java·maven
netyeaxi6 小时前
Java:使用spring-boot + mybatis如何打印SQL日志?
java·spring·mybatis
收破烂的小熊猫~6 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
小七mod6 小时前
【MyBatis】MyBatis与Spring和Spring Boot整合原理
spring boot·spring·mybatis
猴哥源码7 小时前
基于Java+SpringBoot的动物领养平台
java·spring boot
老任与码7 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
小兵张健7 小时前
武汉拿下 23k offer 经历
java·面试·ai编程