importjava.io.IOException;importjava.io.InputStream;importjava.nio.charset.Charset;importjava.security.GeneralSecurityException;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.net.ssl.HostnameVerifier;importjavax.net.ssl.SSLContext;importjavax.net.ssl.SSLSession;importorg.apache.commons.io.IOUtils;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.NameValuePair;importorg.apache.http.client.HttpClient;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.conn.ssl.SSLConnectionSocketFactory;importorg.apache.http.conn.ssl.TrustStrategy;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.impl.conn.PoolingHttpClientConnectionManager;importorg.apache.http.message.BasicNameValuePair;importorg.apache.http.ssl.SSLContextBuilder;importorg.apache.http.util.EntityUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;import com.core.ServiceException; //自定义的一个异常类。
public classHttpsUtils {private staticPoolingHttpClientConnectionManager connMgr;private staticRequestConfig requestConfig;private static final int MAX_TIMEOUT = 7000;private static final Logger logger = LoggerFactory.getLogger(HttpsUtils.class);static{//设置连接池
connMgr = newPoolingHttpClientConnectionManager();//设置连接池大小
connMgr.setMaxTotal(100);
connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());//Validate connections after 1 sec of inactivity
connMgr.setValidateAfterInactivity(1000);
RequestConfig.Builder configBuilder=RequestConfig.custom();//设置连接超时
configBuilder.setConnectTimeout(MAX_TIMEOUT);//设置读取超时
configBuilder.setSocketTimeout(MAX_TIMEOUT);//设置从连接池获取连接实例的超时
configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
requestConfig=configBuilder.build();
}/*** 发送 GET 请求(HTTP),不带输入数据
*
*@paramurl
*@return
*/
public staticJSONObject doGet(String url) {return doGet(url, new HashMap());
}/*** 发送 GET 请求(HTTP),K-V形式
*
*@paramurl
*@paramparams
*@return
*/
public static JSONObject doGet(String url, Mapparams) {
String apiUrl=url;
StringBuffer param= newStringBuffer();int i = 0;for(String key : params.keySet()) {if (i == 0)
param.append("?");elseparam.append("&");
param.append(key).append("=").append(params.get(key));
i++;
}
apiUrl+=param;
String result= null;
HttpClient httpClient= null;if (apiUrl.startsWith("https")) {
httpClient=HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory())
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
}else{
httpClient=HttpClients.createDefault();
}try{
HttpGet httpGet= newHttpGet(apiUrl);
HttpResponse response=httpClient.execute(httpGet);
HttpEntity entity=response.getEntity();if (entity != null) {
InputStream instream=entity.getContent();
result= IOUtils.toString(instream, "UTF-8");
}
}catch(IOException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}returnJSON.parseObject(result);
}/*** 发送 POST 请求(HTTP),不带输入数据
*
*@paramapiUrl
*@return
*/
public staticJSONObject doPost(String apiUrl) {return doPost(apiUrl, new HashMap());
}/*** 发送 POST 请求,K-V形式
*
*@paramapiUrl
* API接口URL
*@paramparams
* 参数map
*@return
*/
public static JSONObject doPost(String apiUrl, Mapparams) {
CloseableHttpClient httpClient= null;if (apiUrl.startsWith("https")) {
httpClient=HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory())
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
}else{
httpClient=HttpClients.createDefault();
}
String httpStr= null;
HttpPost httpPost= newHttpPost(apiUrl);
CloseableHttpResponse response= null;try{
httpPost.setConfig(requestConfig);
List pairList = new ArrayList<>(params.size());for (Map.Entryentry : params.entrySet()) {
NameValuePair pair= newBasicNameValuePair(entry.getKey(), entry.getValue().toString());
pairList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
response=httpClient.execute(httpPost);
HttpEntity entity=response.getEntity();
httpStr= EntityUtils.toString(entity, "UTF-8");
}catch(IOException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}finally{if (response != null) {try{
EntityUtils.consume(response.getEntity());
}catch(IOException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}
}
}returnJSON.parseObject(httpStr);
}/*** 发送 POST 请求,JSON形式
*
*@paramapiUrl
*@paramjson
* json对象
*@return
*/
public staticJSONObject doPost(String apiUrl, Object json) {
CloseableHttpClient httpClient= null;if (apiUrl.startsWith("https")) {
httpClient=HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory())
.setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();
}else{
httpClient=HttpClients.createDefault();
}
String httpStr= null;
HttpPost httpPost= newHttpPost(apiUrl);
CloseableHttpResponse response= null;try{
httpPost.setConfig(requestConfig);
StringEntity stringEntity= new StringEntity(json.toString(), "UTF-8");//解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
response=httpClient.execute(httpPost);
HttpEntity entity=response.getEntity();
httpStr= EntityUtils.toString(entity, "UTF-8");
}catch(IOException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}finally{if (response != null) {try{
EntityUtils.consume(response.getEntity());
}catch(IOException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}
}
}returnJSON.parseObject(httpStr);
}/*** 创建SSL安全连接
*
*@return
*/
private staticSSLConnectionSocketFactory createSSLConnSocketFactory() {
SSLConnectionSocketFactory sslsf= null;try{
SSLContext sslContext= new SSLContextBuilder().loadTrustMaterial(null, newTrustStrategy() {public boolean isTrusted(X509Certificate[] chain, String authType) throwsCertificateException {return true;
}
}).build();
sslsf= new SSLConnectionSocketFactory(sslContext, newHostnameVerifier() {
@Overridepublic booleanverify(String arg0, SSLSession arg1) {return true;
}
});
}catch(GeneralSecurityException e) {
LoggerUtils.error(logger, e, e.getMessage());throw newServiceException(e.getMessage());
}returnsslsf;
}
}