package com.songtsam.framework.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.songtsam.framework.exception.SongtsamException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author jack.zhang
* description Http工具
*/
public class HttpClientUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static final String CHARSET = "UTF-8";
private static final int SYSTEM_ERROR_CODE = 500;
private static CloseableHttpClient httpClient;
private static final int CONNECTTIMEOUT_DEFAULT = 5000;
private static final int SOCKETTIMEOUT_DEFAULT = 5000;
static {
// 设置httpclient的连接池大小
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(500);// 连接池最大并发连接数
cm.setDefaultMaxPerRoute(200);// 单路由最大并发数
RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build();
httpClient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(config).build();
}
/**
* 发送post请求,使用map封装请求数据
*
* @param apiURL 请求地址
* @param requestDataMap 请求数据
* @return 响应信息
*/
public static Map<String, String> doPost(String apiURL, Map<String, String> requestDataMap) throws Exception {
return doPost(apiURL, requestDataMap, null);
}
/**
* 发送post请求,使用map封装请求数据,可指定http请求头信息
*
* @param apiURL 请求地址
* @param requestDataMap 请求数据
* @param requestHeaderMap 请求头header
* @return 响应信息
*/
public static Map<String, String> doPost(String apiURL, Map<String, String> requestDataMap, Map<String, String> requestHeaderMap)
throws Exception {
return doPost(apiURL, requestDataMap, requestHeaderMap, null, CHARSET);
}
/**
* 发送post请求,使用map封装请求数据,可指定http请求头信息
*
* @param apiURL 请求地址
* @param requestDataMap 请求数据
* @param requestHeaderMap 请求头header
* @param options 请求可选参数
* @return 响应信息
*/
public static Map<String, String> doPost(String apiURL, Map<String, String> requestDataMap, Map<String, String> requestHeaderMap,
Map<String, Object> options) throws Exception {
return doPost(apiURL, requestDataMap, requestHeaderMap, options, CHARSET);
}
/**
* 发送post请求,使用map封装请求数据,可指定http请求头信息和定制化请求,并指定字符集
*
* @param apiURL 请求地址
* @param requestDataMap 请求数据
* @param requestHeaderMap 请求头header
* @param options 请求可选参数
* @param charset 字符集
* @return 响应信息
*/
public static Map<String, String> doPost(String apiURL, Map<String, String> requestDataMap, Map<String, String> requestHeaderMap,
Map<String, Object> options, String charset) throws Exception {
// 返回对象
Map<String, String> retInfo = new HashMap<String, String>();
try {
// 设置请求数据
List<NameValuePair> pairs = null;
if (requestDataMap != null && !requestDataMap.isEmpty()) {
pairs = new ArrayList<NameValuePair>(requestDataMap.size());
for (Map.Entry<String, String> entry : requestDataMap.entrySet()) {
String value = entry.getValue();
if (value != null) {
pairs.add(new BasicNameValuePair(entry.getKey(), value));
}
}
}
// 设置请求参数
HttpPost httpPost = new HttpPost(apiURL);
Builder custom = RequestConfig.custom();
if (options != null) {
int socketTimeout = options.get("socketTimeout") != null ? Integer.parseInt(options.get("socketTimeout").toString()) : -1;
int connectTimeout = options.get("connectTimeout") != null ? Integer.parseInt(options.get("connectTimeout").toString())
: -1;
// 设置socket超时时长
if (socketTimeout > 0) {
custom.setSocketTimeout(socketTimeout);
}
// 设置连接超时时长
if (connectTimeout > 0) {
custom.setConnectTimeout(connectTimeout);
}
} else {
//设置默认的超时时间
int socketTimeout = SOCKETTIMEOUT_DEFAULT;
int connectTimeout = CONNECTTIMEOUT_DEFAULT;
custom.setSocketTimeout(socketTimeout);
custom.setConnectTimeout(connectTimeout);
}
RequestConfig requestConfig = custom.build();
httpPost.setConfig(requestConfig);
if (pairs != null && pairs.size() > 0) {
httpPost.setEntity(new UrlEncodedFormEntity(pairs, charset));
}
// 设置请求头
if (requestHeaderMap != null && !requestHeaderMap.isEmpty()) {
for (Map.Entry<String, String> entry : requestHeaderMap.entrySet()) {
String value = entry.getValue();
if (value != null) {
httpPost.addHeader(entry.getKey(), entry.getValue());
}
}
}
// 发送请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 处理异常返回
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpPost.abort();
throw new Exception(HttpClientUtil.formatExceptionMsg(statusCode, response.getStatusLine().getReasonPhrase(), apiURL));
}
// 解析返回结果
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
// 释放连接
EntityUtils.consume(entity);
response.close();
// 正常返回
retInfo.put("errorNo", "0");
retInfo.put("errorMsg", response.getStatusLine().getReasonPhrase());
retInfo.put("responseBody", result);
retInfo.put("apiUrl", apiURL);
return retInfo;
} catch (Throwable e) {
logger.error("Http


weixin_37289240
- 粉丝: 1
- 资源: 9
会员权益专享
最新资源
- 特斯拉Tesla Model3 OBD实车数据和DBC解析文件
- 程序员简历模板,高级软件工程师,软件工程师,前后端程序员专业模板,非常简介直观的简历模板,行业通用,设计美观,模板合集大全
- 《信息系统密码应用高风险判定指引》(中国密码学会密评联委会2021)
- 基于java的文本编辑器的设计与实现(源代码+毕设文档).zip
- java+sql企业固定资产管理系统(毕设+系统+开题报告+任务书+中期考核报告+任务书+评语表+答辩PPT).zip
- ASP网站整站程序PHP源码-菁菁二级域名系统实例开发程序-毕设源码实例.zip
- mingw64最新版13.1.0
- mingw64最新版本13.1.0
- 【ChatGPT教程】chatgpt-web-main.zip
- train.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论0