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

HttpUtils工具类

前言

一般在开发中,我们对接其他系统,最常用的就是使用http请求,去调用其他接口获取数据,下面记录了一个httputils工具类

一、httputils工具类

示例代码:

package com.centerm.cpay.acps.common.util;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
import org.apache.http.util.EntityUtils;import java.nio.charset.Charset;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** http请求封装** @author lh* @date 2022-09-23*/
@Slf4j
public class HttpUtils {/*** 默认请求类型*/private static final String DEFAULT_CONTENT_TYPE = "application/json";/*** 默认编码*/private static final String DEFAULT_ENCODING = "utf-8";/*** GBK编码*/private static final String GBK_ENCODING = "GBK";/*** 默认超时时间*/private static final int DEFAULT_TIME_OUT = 60;private static PoolingHttpClientConnectionManager manager = null;private static CloseableHttpClient httpClient = null;/*** 获取httpclient对象** @return*/public static synchronized CloseableHttpClient getHttpClient(int timeOut) {if (null == httpClient) {log.info("============================================创建");// 注册访问协议相关的socket工厂Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", SSLConnectionSocketFactory.getSystemSocketFactory()).build();// httpConnection工厂HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory =new ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE, DefaultHttpResponseParserFactory.INSTANCE);// DNS解析器DnsResolver dnsResolver = SystemDefaultDnsResolver.INSTANCE;// 创建池化连接管理器manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, connectionFactory, dnsResolver);// socket配置SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();manager.setDefaultSocketConfig(socketConfig);// 连接池最大连接数manager.setMaxTotal(300);manager.setDefaultMaxPerRoute(200);// 5s检测一次连接池连接manager.setValidateAfterInactivity(5 * 1000);// 默认请求配置RequestConfig requestConfig = RequestConfig.custom()// 连接超时时间.setConnectTimeout(timeOut * 1000)// 等待数据超时时间.setSocketTimeout(timeOut * 1000)// 从连接池获取连接超时时间.setConnectionRequestTimeout(timeOut * 1000).build();// 创建httpclienthttpClient = HttpClients.custom().setConnectionManager(manager)// 连接池不共享.setConnectionManagerShared(false)// 定期回收空闲连接.evictIdleConnections(timeOut, TimeUnit.SECONDS)// 定期回收过期连接.evictExpiredConnections().setConnectionTimeToLive(timeOut, TimeUnit.SECONDS)// 设置默认请求.setDefaultRequestConfig(requestConfig)// 连接重用策略.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)// 长连接配置.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)// 设置重试次数.setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)).build();// jvm停止或重启时,关闭连接池释放连接Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {try {if (null != httpClient) {httpClient.close();}} catch (Exception e) {log.error("httpclient关闭异常:{}", e);}}});}return httpClient;}/*** http请求** @param url* @param params* @return*/public static String httpPost(String url, Map params,Map<String,String> headers) {log.info("POST请求url:{}", url);log.info("POST请求参数:{}",JSON.toJSONString(params));CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);HttpPost httpPost = new HttpPost(url);if (null != headers){for (String key:headers.keySet()){httpPost.setHeader(key,headers.get(key).toString());}}String json = JSON.toJSONString(params);StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);stringEntity.setContentEncoding(DEFAULT_ENCODING);httpPost.setEntity(stringEntity);String result = null;try (CloseableHttpResponse response = httpClient.execute(httpPost);) {HttpEntity entity = response.getEntity();if (null != entity) {result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());EntityUtils.consume(entity);}} catch (Exception e) {log.error("接口请求异常:{}", e);}return result;}/*** http请求(POST请求,GBK编码)** @param url* @param params* @return*/public static String httpPostGBK(String url, Map params,Map<String,String> headers) {log.info("POST请求url:{}", url);log.info("POST请求参数:{}",JSON.toJSONString(params));CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);HttpPost httpPost = new HttpPost(url);if (null != headers){for (String key:headers.keySet()){httpPost.setHeader(key,headers.get(key).toString());}}String json = JSON.toJSONString(params);StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);stringEntity.setContentEncoding(DEFAULT_ENCODING);httpPost.setEntity(stringEntity);String result = null;try (CloseableHttpResponse response = httpClient.execute(httpPost);) {HttpEntity entity = response.getEntity();if (null != entity) {
//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());result = EntityUtils.toString(entity, Charset.defaultCharset());EntityUtils.consume(entity);}} catch (Exception e) {log.error("接口请求异常:{}", e);}return result;}/*** http请求(POST请求,GBK编码)** @param url* @param params* @param headers* @param timeOut 超时时间* @return*/public static String httpPostGBK(String url, Map params, Map<String, String> headers, int timeOut) {log.info("POST请求url:{}", url);log.info("POST请求参数:{}", JSON.toJSONString(params));CloseableHttpClient httpClient = getHttpClient(timeOut);HttpPost httpPost = new HttpPost(url);if (null != headers) {for (String key : headers.keySet()) {httpPost.setHeader(key, headers.get(key).toString());}}String json = JSON.toJSONString(params);StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);stringEntity.setContentEncoding(DEFAULT_ENCODING);httpPost.setEntity(stringEntity);String result = null;try (CloseableHttpResponse response = httpClient.execute(httpPost);) {HttpEntity entity = response.getEntity();if (null != entity) {
//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());result = EntityUtils.toString(entity, Charset.defaultCharset());EntityUtils.consume(entity);}} catch (Exception e) {log.error("接口请求异常:{}", e);}return result;}/*** http请求** @param url* @return*/public static String httpGet(String url) {log.info("请求url:{}", url);CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);HttpGet httpGet = new HttpGet(url);String result = null;try (CloseableHttpResponse response = httpClient.execute(httpGet);) {HttpEntity entity = response.getEntity();if (null != entity) {result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());EntityUtils.consume(entity);}} catch (Exception e) {log.error("接口请求异常:{}", e);}return result;}
}

相关文章:

  • base64字符串空格问题
  • 【智能算法】目标检测算法
  • doris集群物理部署保姆级教程
  • 深入理解 RabbitMQ、RocketMQ等常⽤的消息中间件进⾏消息的异步数据处理
  • 使用 PHP 和 Selenium WebDriver 实现爬虫
  • 数据质量管理-可访问性管理
  • 从零搭建Prometheus到Grafana告警推送
  • Ansible自动化部署
  • pdf拆分,pdf拆分在线使用,pdf拆分多个pdf
  • 主干网络篇 | YOLOv5/v7 更换骨干网络之 MobileNetV3 | 基于神经网络搜索的轻量级网络
  • Ubuntu20.04安装vimplus插件
  • 多任务学习和迁移学习的原理
  • Windows传统DOS路径有效性检测(资源篇)
  • 服务器是否稳定怎么看
  • 将excel表格转换为element table(上)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Electron入门介绍
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript学习总结——原型
  • java小心机(3)| 浅析finalize()
  • Logstash 参考指南(目录)
  • Magento 1.x 中文订单打印乱码
  • miaov-React 最佳入门
  • Python连接Oracle
  • springMvc学习笔记(2)
  • STAR法则
  • Swoft 源码剖析 - 代码自动更新机制
  • webgl (原生)基础入门指南【一】
  • 彻底搞懂浏览器Event-loop
  • 前端知识点整理(待续)
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 人脸识别最新开发经验demo
  • 实战|智能家居行业移动应用性能分析
  • 使用权重正则化较少模型过拟合
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 函数计算新功能-----支持C#函数
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ###STL(标准模板库)
  • #if 1...#endif
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #NOIP 2014#Day.2 T3 解方程
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)fgets与fputs函数详解
  • (windows2012共享文件夹和防火墙设置
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (剑指Offer)面试题34:丑数
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (新)网络工程师考点串讲与真题详解