package com.dsh.other.util.httpClinet;
|
|
import com.alibaba.fastjson.JSON;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
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.conn.ssl.SSLConnectionSocketFactory;
|
import org.apache.http.entity.ContentType;
|
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.ssl.SSLContexts;
|
import org.apache.http.util.EntityUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import javax.net.ssl.SSLContext;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.InputStream;
|
import java.nio.charset.Charset;
|
import java.security.KeyStore;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* http工具类
|
*/
|
public class HttpClientUtil {
|
|
private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
|
|
private static PoolingHttpClientConnectionManager connectionManager;
|
|
|
{
|
//1.创建连接池管理器
|
connectionManager = new PoolingHttpClientConnectionManager(60000,
|
TimeUnit.MILLISECONDS);
|
connectionManager.setMaxTotal(1000);
|
connectionManager.setDefaultMaxPerRoute(50);
|
}
|
|
/**
|
* 创建一个httpClient对象
|
*/
|
private static CloseableHttpClient getHttpCline() {
|
return HttpClients.custom()
|
.setConnectionManager(connectionManager)
|
.disableAutomaticRetries()
|
.build();
|
}
|
|
private static RequestConfig getRequestConfig() {
|
RequestConfig.Builder builder = RequestConfig.custom();
|
builder.setSocketTimeout(60000)//3.1设置客户端等待服务端返回数据的超时时间
|
.setConnectTimeout(30000)//3.2设置客户端发起TCP连接请求的超时时间
|
.setExpectContinueEnabled(true)
|
.setConnectionRequestTimeout(30000);//3.3设置客户端从连接池获取链接的超时时间
|
return builder.build();
|
}
|
|
|
/**
|
* 创建一个POST请求实例
|
*
|
* @param url 请求地址
|
* @param params 请求参数
|
*/
|
private static CloseableHttpResponse setPostHttpRequset(String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception {
|
HttpPost httpPost = new HttpPost(url);
|
httpPost.setConfig(getRequestConfig());
|
if (null != header) {
|
for (String key : header.keySet()) {
|
httpPost.setHeader(key, header.get(key));
|
}
|
}
|
List<NameValuePair> list = new ArrayList<>();
|
if (null != params) {
|
Set<String> keys = params.keySet();
|
for (String key : keys) {
|
list.add(new BasicNameValuePair(key, null == params.get(key) ? null : params.get(key).toString()));
|
}
|
}
|
switch (contentType) {
|
case "form":
|
httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
|
break;
|
case "json":
|
ObjectMapper objectMapper = new ObjectMapper();
|
String s = objectMapper.writeValueAsString(params);
|
httpPost.setEntity(new StringEntity(s, ContentType.create(ContentType.APPLICATION_JSON.getMimeType(), Charset.forName("UTF-8"))));
|
break;
|
}
|
return getHttpCline().execute(httpPost);
|
}
|
|
|
/**
|
* 获取get请求实例
|
*
|
* @param url 请求地址
|
* @param params 请求参数
|
*/
|
private static CloseableHttpResponse setGetHttpRequset(String url, Map<String, Object> params, Map<String, String> header) throws Exception {
|
StringBuffer sb = new StringBuffer();
|
String p = "";
|
if (null != params) {
|
Set<String> keys = params.keySet();
|
for (String key : keys) {
|
sb.append(key + "=" + params.get(key) + "&");
|
}
|
p = "?" + sb.substring(0, sb.length() - 1);
|
}
|
HttpGet httpGet = new HttpGet(url + p);
|
httpGet.setConfig(getRequestConfig());
|
if (null != header) {
|
for (String key : header.keySet()) {
|
httpGet.setHeader(key, header.get(key));
|
}
|
}
|
return getHttpCline().execute(httpGet);
|
}
|
|
|
/**
|
* 发送http请求
|
*
|
* @param mothed "GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS"
|
* @param url 请求地址
|
* @param params 请求参数
|
* @param header 请求头
|
* @param contentType 参数请求方式form/json
|
* @return
|
*/
|
public static HttpResult pushHttpRequset(String mothed, String url, Map<String, Object> params, Map<String, String> header, String contentType) throws Exception {
|
String randome = UUID.randomUUID().toString();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
|
logger.info(sdf.format(new Date()) + "----(" + randome + ")请求参数:" + JSON.toJSONString(params));
|
CloseableHttpResponse httpResponse = null;
|
switch (mothed) {
|
case "GET":
|
httpResponse = setGetHttpRequset(url, params, header);
|
break;
|
case "POST":
|
httpResponse = setPostHttpRequset(url, params, header, contentType);
|
break;
|
}
|
int statusCode = httpResponse.getStatusLine().getStatusCode();
|
String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
|
logger.info(sdf.format(new Date()) + "----(" + randome + ")返回结果:" + content);
|
HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
|
close(httpResponse);
|
return httpResult;
|
}
|
|
|
/**
|
* 发送XML请求
|
*
|
* @param url 请求地址
|
* @param xml XML数据
|
* @param header 自定义请求头
|
* @return
|
*/
|
public static HttpResult pushHttpRequsetXml(String url, String xml, Map<String, String> header) throws Exception {
|
HttpPost httpPost = new HttpPost(url);
|
httpPost.setConfig(getRequestConfig());
|
for (String key : header.keySet()) {
|
httpPost.setHeader(key, header.get(key));
|
}
|
httpPost.setHeader("Content-Type", "application/xml");
|
httpPost.setEntity(new StringEntity(xml, "UTF-8"));
|
CloseableHttpResponse httpResponse = getHttpCline().execute(httpPost);
|
int statusCode = httpResponse.getStatusLine().getStatusCode();
|
String content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
|
HttpResult httpResult = HttpResult.getHttpResult(statusCode, content);
|
close(httpResponse);
|
return httpResult;
|
}
|
|
|
/**
|
* 请求https发送XML请求
|
*
|
* @param url 接口路径
|
* @param xml 内容
|
* @param header 请求头
|
* @param certPassword 证书密码
|
* @param certPath 证书路径
|
* @param certType 证书类型
|
* @return
|
* @throws Exception
|
*/
|
public static String pushHttpsRequsetXml(String url, String xml, Map<String, String> header, String certPassword, String certPath, String certType) throws Exception {
|
HttpPost httpPost = new HttpPost(url);
|
for (String key : header.keySet()) {
|
httpPost.setHeader(key, header.get(key));
|
}
|
httpPost.setHeader("Content-Type", "application/xml");
|
httpPost.setEntity(new StringEntity(xml, "UTF-8"));
|
CloseableHttpClient httpCline = initCert(certPassword, certPath, certType);
|
CloseableHttpResponse httpResponse = httpCline.execute(httpPost);
|
String content = null;
|
if (httpResponse.getStatusLine().getStatusCode() == 200) {
|
content = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
|
} else {
|
content = "返回状态码:" + httpResponse.getStatusLine() + "。" + EntityUtils.toString(httpResponse.getEntity());
|
}
|
close(httpResponse);
|
httpCline.close();
|
return content;
|
}
|
|
|
/**
|
* 初始化https对象(带证书)
|
*
|
* @param key 证书密码
|
* @param certPath 证书路径
|
* @param certType 证书类型
|
* @throws Exception
|
*/
|
private static CloseableHttpClient initCert(String key, String certPath, String certType) throws Exception {
|
KeyStore keyStore = KeyStore.getInstance(certType);
|
InputStream inputStream = new FileInputStream(new File(certPath));
|
try {
|
keyStore.load(inputStream, key.toCharArray());
|
} finally {
|
inputStream.close();
|
}
|
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
|
SSLConnectionSocketFactory sslsf =
|
new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
|
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
|
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
|
}
|
|
|
/**
|
* 关闭资源
|
*/
|
private static void close(CloseableHttpResponse httpResponse) {
|
try {
|
if (null != httpResponse) {
|
EntityUtils.consume(httpResponse.getEntity());//此处高能,通过源码分析,由EntityUtils是否回收HttpEntity
|
httpResponse.close();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
try {
|
if (null != httpResponse) {
|
httpResponse.close();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
|
}
|