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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chapter9 更复杂的光照——Shader入门精要学习笔记

Chapter9 更复杂的光照 一、Unity的渲染路径1.渲染路径的概念2.渲染路径的类型①前向渲染路径a. 前向渲染路径的原理b. Unity中的前向渲染c. 两种Pass ②延迟渲染路径a. 延迟渲染路径的原理b. Unity中的延迟渲染c. 两种Pass ③顶点照明渲染路径 二、Unity的光源类型1.光源类型①…

如何找BMS算法、BMS软件的实习

之前一直忙&#xff0c;好久没有更新了&#xff0c;今天就来写一篇文章来介绍如何找BMS方向的实习&#xff0c;以及需要具备哪些条件&#xff0c;我的实习经历都是在读研阶段找的&#xff0c;读研期间两段的实习经历再加上最高影响因子9.4分的论文&#xff0c;我的秋招可以说是…

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程&#xff0c;它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行&#xff1a;图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除…

《昇思25天学习打卡营第9天|onereal》

继续学习昨天的 基于MindNLPMusicGen生成自己的个性化音乐 生成音乐 MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采样模式得到的结果要显著优于贪心模式。因此我们默认启…

DP:子序列问题

文章目录 什么是子序列子序列的特点举例说明常见问题 关于子序列问题的几个例题1.最长递增子序列2.摆动序列3.最长递增子序列的个数4.最长数对链5.最长定差子序列 总结 什么是子序列 在计算机科学和数学中&#xff0c;子序列&#xff08;Subsequence&#xff09;是指从一个序列…

【JavaEE精炼宝库】多线程进阶(2)synchronized原理、JUC类——深度理解多线程编程

一、synchronized 原理 1.1 基本特点&#xff1a; 结合上面的锁策略&#xff0c;我们就可以总结出&#xff0c;synchronized 具有以下特性(只考虑 JDK 1.8)&#xff1a; 开始时是乐观锁&#xff0c;如果锁冲突频繁&#xff0c;就转换为悲观锁。 开始是轻量级锁实现&#xff…

维护Nginx千字经验总结

Hello , 我是恒 。 维护putty和nginx两个项目好久了&#xff0c;用面向底层的思路去接触 在nginx社区的收获不少&#xff0c;在这里谈谈我的感悟 Nginx的夺冠不是偶然 高速:一方面&#xff0c;在正常情况下&#xff0c;单次请求会得到更快的响应&#xff1b;另一方面&#xff0…

Linux:网络基础1

文章目录 前言1. 协议1.1 为什么要有协议&#xff1f;1.2 什么是协议&#xff1f; 2. 网络2.1 网络通信的问题2.2 网络的解决方案——网络的层状结构2.3 网络和系统的关系2.4 网络传输基本流程2.5 简单理解IP地址2.6 跨网络传输 总结 前言 在早期的计算机发展中&#xff0c;一开…

免费翻译API及使用指南——百度、腾讯

目录 一、百度翻译API 二、腾讯翻译API 一、百度翻译API 百度翻译API接口免费翻译额度&#xff1a;标准版&#xff08;5万字符免费/每月&#xff09;、高级版&#xff08;100万字符免费/每月-需个人认证&#xff0c;基本都能通过&#xff09;、尊享版&#xff08;200万字符免…

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…

cesium 聚合

cesium 聚合(下面附有源码) 示例代码 <html lang="en"><head><!-- Use correct character set. -->

python系列30:各种爬虫技术总结

1. 使用requests获取网页内容 以巴鲁夫产品为例&#xff0c;可以用get请求获取内容&#xff1a; https://www.balluff.com.cn/zh-cn/products/BES02YF 对应的网页为&#xff1a; 使用简单方法进行解析即可 import requests r BES02YF res requests.get("https://www.…

JSON JOLT常用示例整理

JSON JOLT常用示例整理 1、什么是jolt Jolt是用Java编写的JSON到JSON转换库&#xff0c;其中指示如何转换的"specification"本身就是一个JSON文档。以下文档中&#xff0c;我统一以 Spec 代替如何转换的"specification"json文档。以LHS(left hand side)代…

云计算基础技术

网络类技术 网络的作用 网络是设备间、虚拟机之间通信的桥梁。因此&#xff0c;在ICT基础设施中&#xff0c;网络是必不可少的。 传统网络的基本概念 广播和单播&#xff1a;两个设备通信就好像是人们之间的对话一样。如果一个人对另外一个人说话&#xff0c;那么用网络技术的…

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

容器内存

一、容器内存概述 容器本质上还是一个进程&#xff0c;是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的&#xff0c;这块主要涉及三部分内容&#xff1a;RSS&#xff0c;page cache和swap这三部分&#xff0c;容器基于memory Cgroup对内存进行限制…

HSRP热备份路由协议(VRRP虚拟路由冗余协议)配置以及实现负载均衡

1、相关原理 在网络中&#xff0c;如果一台作为默认网关的三层交换机或者路由器损坏&#xff0c;所有使用该网关为下一跳的主机通信必然中断&#xff0c;即使配置多个默认网关&#xff0c;在不重启终端的情况下&#xff0c;也不能彻底换到新网关。Cisco提出了HSRP热备份路由协…

Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好

macOS系统虽然以稳定、安全系数高等优点著称&#xff0c;但因其封闭性&#xff0c;不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac&#xff08;点击获取激活码&#xff09;和Tuxera NTFS&#xff08;点击获取激活码&#xff0…

消防认证-防火卷帘

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

springboot学习,如何用redission实现分布式锁

目录 一、springboot框架介绍二、redission是什么三、什么是分布式锁四、如何用redission实现分布式锁 一、springboot框架介绍 Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware的一部分&#xff09;于2013年推出。它旨在简化Spring应用程序…