package org.apache.util; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.CodingErrorAction; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import org.apache.http.Consts; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.ConnectionConfig; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.config.SocketConfig; 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.conn.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; public class HttpUtil { //mime=type public static final String MIME_TYPE_PLAIN="text/plain"; public static final String MIME_TYPE_XML="text/xml"; public static final String MIME_TYPE_HTML="text/html"; public static final String MIME_TYPE_JSON="application/json"; //request method public static final String METHOD_GET="GET"; public static final String METHOD_POST="POST"; //http status public static final int HTTP_RESSTATUS_SUCCESS=200; public static final int HTTP_RESSTATUS_FOUND=404; public static final String DEFAULT_ENCODING="UTF-8"; public static final Charset DEFAULT_CONSTS=Consts.UTF_8; public static final int REQUEST_TIMEOUT=5000; public static final int CONNECTION_TIMEOUT=5000; public static final int SO_TIME_OUT_MS = 5000; public static final int SOCKIT_TIMEOUT=5000; public static final int POOL_MAX_SIZE=200; public static final int POOL_MAX_SIZE_PRE_REUTER=200; public static CloseableHttpClient httpClient=null; private static PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = null; static{ try { //初始化SSL SSLContextBuilder sslContextBuilder=new SSLContextBuilder(); sslContextBuilder.useTLS(); SSLContext sslContext=sslContextBuilder.loadTrustMaterial(null, new TrustStrategy() { // 容許經過全部 @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); //註冊協議 ConnectionSocketFactory plainCSF=PlainConnectionSocketFactory.INSTANCE; ConnectionSocketFactory sslCSF=new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Registry<ConnectionSocketFactory> registry=RegistryBuilder.<ConnectionSocketFactory>create().register("http", plainCSF).register("https", sslCSF).build(); //建立鏈接池 poolingHttpClientConnectionManager=new PoolingHttpClientConnectionManager(registry); // 初始化Socket配置 SocketConfig socketConfig=SocketConfig.custom().setTcpNoDelay(true).setSoTimeout(SO_TIME_OUT_MS).build(); poolingHttpClientConnectionManager.setDefaultSocketConfig(socketConfig); // http鏈接設置 ConnectionConfig connectionConfig=ConnectionConfig.custom() .setCharset(DEFAULT_CONSTS) .setMalformedInputAction(CodingErrorAction.IGNORE) .setUnmappableInputAction(CodingErrorAction.IGNORE).build(); poolingHttpClientConnectionManager.setDefaultConnectionConfig(connectionConfig); poolingHttpClientConnectionManager.setMaxTotal(POOL_MAX_SIZE); poolingHttpClientConnectionManager.setDefaultMaxPerRoute(POOL_MAX_SIZE_PRE_REUTER); RequestConfig requestConfig=RequestConfig.custom() .setConnectionRequestTimeout(REQUEST_TIMEOUT) .setSocketTimeout(SOCKIT_TIMEOUT) .setConnectTimeout(CONNECTION_TIMEOUT) .build(); //建立HttpClient httpClient=HttpClients.custom() .disableAuthCaching() .setConnectionManager(poolingHttpClientConnectionManager) .setDefaultRequestConfig(requestConfig) .build(); HttpConnMonitorThread monitor=new HttpConnMonitorThread(poolingHttpClientConnectionManager); new Thread(monitor).start(); monitor.shutdown(); } catch (Exception e) { e.printStackTrace(); }finally{ if(httpClient!=null){ try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } } package org.apache.util; import java.util.concurrent.TimeUnit; import org.apache.http.conn.HttpClientConnectionManager; public class HttpConnMonitorThread implements Runnable{ private final HttpClientConnectionManager cm; private volatile boolean shutdown; private final static int WATING_TIME=60000; private final static int IDLE_TIME=30; public HttpConnMonitorThread(HttpClientConnectionManager cm){ super(); this.cm=cm; } @Override public void run() { try { while (shutdown) { synchronized (this) { wait(WATING_TIME); cm.closeExpiredConnections(); cm.closeIdleConnections(IDLE_TIME, TimeUnit.SECONDS); } } } catch (Exception e) { e.printStackTrace(); } } public void shutdown(){ shutdown=true; synchronized (this) { notifyAll(); } } } /** * get 提交方式 * * @param uri * @param map * @return */ public static String doGet(String uri, Map<String, String> map) { String responseString = null; HttpResponse response=null; HttpGet httpGet=null; try { RequestConfig requestConfig =requestConfig(); StringBuilder sb = new StringBuilder(); sb.append(uri); int i = 0; for (Entry<String, String> entry : map.entrySet()) { if (i == 0&&!uri.contains("?")) { sb.append("?"); } else { sb.append("&"); } sb.append(entry.getKey()); sb.append("="); String value = entry.getValue(); sb.append(URLEncoder.encode(value, "UTF-8")); i++; } httpGet = new HttpGet(sb.toString()); httpGet.setConfig(requestConfig); response = httpClient.execute(httpGet); HttpEntity httpEntity = response.getEntity(); responseString = EntityUtils.toString(httpEntity); } catch (Exception e) { e.printStackTrace(); }finally{ if(response!=null){ EntityUtils.consumeQuietly(response.getEntity()); }if(httpGet!=null){ httpGet.releaseConnection(); } } return responseString; } /** * post 提交方式 * @param uri * @param map * @return responseString */ public static String doPost(String uri,Map<String, String> map) { String responseString = null; HttpResponse response=null; HttpPost httpPost=new HttpPost(uri); try { RequestConfig requestConfig=requestConfig(); List<NameValuePair> formParams=new ArrayList<NameValuePair>(); httpPost.setConfig(requestConfig); for (Map.Entry<String, String> entry:map.entrySet()) { formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } httpPost.setEntity(new UrlEncodedFormEntity(formParams,Consts.UTF_8)); response=httpClient.execute(httpPost); HttpEntity httpEntity = response.getEntity(); responseString = EntityUtils.toString(httpEntity,Consts.UTF_8); } catch (Exception e) { e.printStackTrace(); }finally{ if(response!=null){ EntityUtils.consumeQuietly(response.getEntity()); } if(httpPost!=null){ httpPost.releaseConnection(); } } return responseString; } /** * json 提交方式 * @param uri * @param map * @return responseString */ public static String doJson(String uri,Map<String, Object> map){ String responseString = null; HttpResponse response=null; HttpPost httpPost=new HttpPost(uri); try { httpPost.setHeader("Content-type", "application/json"); RequestConfig requestConfig=requestConfig(); httpPost.setConfig(requestConfig); String str="json"; StringEntity reqEntity = new StringEntity(str,Consts.UTF_8); httpPost.setEntity(reqEntity); response=httpClient.execute(httpPost); HttpEntity httpEntity = response.getEntity(); responseString=EntityUtils.toString(httpEntity,Consts.UTF_8); } catch (Exception e) { e.printStackTrace(); }finally{ if(response!=null){ EntityUtils.consumeQuietly(response.getEntity()); } if(httpPost!=null){ httpPost.releaseConnection(); } } return responseString; } /** * Request Config 設置 * @return RequestConfig */ public static RequestConfig requestConfig() { RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(CONNECTION_TIMEOUT) .setConnectTimeout(CONNECTION_TIMEOUT) .setConnectionRequestTimeout(CONNECTION_TIMEOUT).build(); return requestConfig; }