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

使用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.lryc.cn/news/530006.html

相关文章:

  • 软件工程概论试题五
  • 填充每个节点的下一个右侧节点指针力扣--116,117
  • DBUtils中QueryRunner(空参,传数据源)构造方法的区别及应用场景
  • STM32 TIM输入捕获 测量频率
  • Autosar-以太网是怎么运行的?(Davinci配置部分)
  • 16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)
  • langchain 实现多智能体多轮对话
  • Java-数据结构-优先级队列(堆)
  • C++实现状态模式
  • FreeRTOS学习笔记2:FreeRTOS的基础知识
  • 计算机网络之计算机网络的分类
  • 从理论到实践:Linux 进程替换与 exec 系列函数
  • Flutter常用Widget小部件
  • 微信小程序实战0 设置
  • 2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存
  • 使用 postman 测试思源笔记接口
  • 当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例
  • 阿里最新普通x231 逆向分析
  • php的使用及storm环境部署
  • 高可用 Keepalived 服务部署流程
  • 【新春特辑】2025年1月科技浪潮中的AI最新时事与科技趋势
  • 解决Django非ORM模型提示初始化request问题
  • G. XOUR
  • 有没有个性化的UML图例
  • 【RAG】SKLearnVectorStore 避免使用gpt4all会connection err
  • vue框架技术相关概述以及前端框架整合
  • Spring Boot + Facade Pattern : 通过统一接口简化多模块业务
  • 牛客周赛 Round 78
  • 【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类
  • 02.01 生产者消费者