| package com.dsh.guns.modular.system.controller.util; | 
|   | 
| 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 请求参数 | 
|      */ | 
|     public 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(); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
| } |