http get或post请求工具类(Java后端)
http get或post请求工具类(Java后端)
package com.libawall.example.fileImage.controller;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
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.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.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
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.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* http get/post请求工具类
*/
public class HttpGetPostUtil {
private static Logger log = LoggerFactory.getLogger(HttpGetPostUtil.class);
private static PoolingHttpClientConnectionManager poolConnManager = null;
private static CloseableHttpClient httpClient =null;
public static synchronized CloseableHttpClient getHttpClient(){
if(null==httpClient){
//注册访问协议相关的Socket工厂
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
.register("http",PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSystemSocketFactory()).build();
//HttpConnection工厂:皮遏制写请求/解析响应处理器
HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory=new
ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE,
DefaultHttpResponseParserFactory.INSTANCE);
//DNS解析器
DnsResolver dnsResolver=SystemDefaultDnsResolver.INSTANCE;
//创建池化连接管理器
poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry,connectionFactory,dnsResolver);
//默认为Socket配置
SocketConfig defaultSocketConfig=SocketConfig.custom().setTcpNoDelay(true).build();
poolConnManager.setDefaultSocketConfig(defaultSocketConfig);
// 设置整个连接池的最大连接数
poolConnManager.setMaxTotal(1000);
// 每个路由的默认最大连接,每个路由实际最大连接默认为DefaultMaxPerRoute控制,maxTotal是整个池子最大数
// DefaultMaxPerRoute设置过小无法支持大并发(ConnectPoolTimeoutException: Timeout waiting for connect from pool) 路由是maxTotal的细分
//每个路由最大连接数
poolConnManager.setDefaultMaxPerRoute(1000);
//在从连接池获取连接时,连接不活跃多长时间后需要一次验证,默认2S
poolConnManager.setValidateAfterInactivity(5*1000);
//默认请求配置
RequestConfig requestConfig = RequestConfig.custom()
//设置连接超时时间
.setConnectTimeout(2*1000)
//设置等待数据超时时间
.setSocketTimeout(5*1000)
//设置从连接池获取连接的等待超时时间
.setConnectionRequestTimeout(2000)
.build();
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setConnectionManager(poolConnManager)
//设置连接池不是共享模式
.setConnectionManagerShared(false)
//定期回调空闲连接
.evictIdleConnections(60, TimeUnit.SECONDS)
//定期回收过期
.evictExpiredConnections()
//连接存活时间,如果不设置,根据长连接信息决定
.setConnectionTimeToLive(60, TimeUnit.SECONDS)
//设置默认请求配置
.setDefaultRequestConfig(requestConfig)
// 连接重试策略,是否能keepalive
.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
//长连接配置,即获取长连接生产多少时间
.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
//设置重试次数,默认是3次;当前是禁用
.setRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
httpClient = httpClientBuilder.build();
//JVM停止或重启时,关闭连接池释放连接
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
try{
httpClient.close();
}catch(IOException e){
log.info(e.getMessage());
}
}
});
}
return httpClient;
}
/**
* 发送 GET 请求(HTTP),不带输入数据
* @param url
* @return
*/
public static String doGet(String url) {
return doGet(url, new HashMap<String, Object>());
}
/**
* 发送 GET 请求(HTTP),K-V形式
* @param url
* @param params
* @return
*/
public static String doGet(String url, Map<String, Object> params) {
long a=System.currentTimeMillis();
String apiUrl = url;
StringBuffer param = new StringBuffer();
int i = 0;
for (String key : params.keySet()) {
if (i == 0) {
param.append("?");
} else {
param.append("&");
}
param.append(key).append("=").append(params.get(key));
i++;
}
apiUrl += param;
String result = null;
CloseableHttpClient httpClient = getHttpClient();
CloseableHttpResponse response = null;
HttpGet httpPost = null;
try {
httpPost = new HttpGet(apiUrl);
response = httpClient.execute(httpPost);
int status = response.getStatusLine().getStatusCode();
if (status ==HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(response.getEntity(), "UTF-8");
}
}else{
//不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
EntityUtils.consume(response.getEntity());
}
return result;
} catch (IOException e) {
try {
if(null !=response )
EntityUtils.consume(response.getEntity());
} catch (IOException e1) {
log.error(e.getMessage(), e1);
}
log.error(e.getMessage(), e);
}
return result;
}
public static String doPost(String url) {
return doPost(url, new HashMap<String, Object>());
}
/**
* 发送 POST 请求(HTTP),K-V形式
*
* @param url
* 接口URL
* @param params
* 参数map
* @return
*/
public static String doPost(String url, Map<String, Object> params) {
long a=System.currentTimeMillis();
String result = null;
HttpPost httpPost = new HttpPost(url);
CloseableHttpClient httpClient = getHttpClient();
CloseableHttpResponse response = null;
try {
List<NameValuePair> pairList = new ArrayList<>(params.size());
for (Map.Entry<String, Object> entry : params.entrySet()) {
NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue().toString());
pairList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
response = httpClient.execute(httpPost);
int status = response.getStatusLine().getStatusCode();
if (status ==HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(response.getEntity(), "UTF-8");
}
}else{
//不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
EntityUtils.consume(response.getEntity());
}
StringBuilder logsb=new StringBuilder();
return result;
} catch (Exception e) {
try {
if(null !=response )
EntityUtils.consume(response.getEntity());
} catch (IOException e1) {
log.error(e.getMessage(), e1);
}
log.error(e.getMessage(), e);
}
return result;
}
/**
* 参数Map格式化
* @param map
* @return
*/
public static String getPlanText(Map<String, Object> map) {
StringBuilder sb=new StringBuilder();
for(Map.Entry<String, Object> entry :map.entrySet()){
sb.append(entry.getKey()).
append("=").
append(entry.getValue())
.append("&");
}
if(sb.length()>0){
sb.deleteCharAt(sb.length()-1);
}
return sb.toString();
}
}
评论区
请写下您的评论...
猜你喜欢
blog
http get和post请求
计算机网络基础
2430
1.区别(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)(2)post发送的数据更大(get有url长度限制)(3)post能发送更多的数据类型
blog
http请求错误码
计算机网络基础
2453
HTTP错误400400请求出错由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。HTTP错误401401.1未授权:登录失败此错误表明传输给服务器的证书与登录服务器所需的
blog
http请求判断来自pc端还是手机端
框架
1514
*@date2018年12月23日下午8:13:51*@versionV1.0*@Description:TODO(辨别请求的设备类型)*/publicclassDeviceTypes{ /*** *判断是否是pc端w
blog
rabbitmq开启http安全认证插件
rabbitmq
915
auth_backends.2=http#认证请求类型auth_http.http_method=post#认证和授权地址,官方提供了SpringBoot示例auth_http.user_path=http
weblog
1549
java判断请求的浏览器类型是否是ie浏览器importjavax.servlet.http.HttpServletRequest;/*** 浏览器类型判断*@author硅谷探秘者(jia
工具
1094
继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:intgetResponseCode();//获取服务器的响应
weblog
1609
javaMD5加密和和javascript加密该加密工具没有加盐java加密工具importjava.security.MessageDigest
blog
java压缩zip工具类
工具
1489
java压缩zip工具类packagecom.dzqc.yx.util;importjava.io.File;importjava.io.FileInputStream
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。