All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.javaclub.monitor.util.HttpClientUtils Maven / Gradle / Ivy

/*
 * @(#)HttpClientUtils.java	2018年12月29日
 *
 * Copyright (c) 2018. All Rights Reserved.
 *
 */

package com.github.javaclub.monitor.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
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.client.methods.HttpRequestBase;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
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.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * HttpClientUtils
 *
 * @author Gerald Chen
 * @version $Id: HttpClientUtils.java 2018年12月29日 14:58:28 Exp $
 */
public class HttpClientUtils {
	
	static final Logger log = LoggerFactory.getLogger(HttpClientUtils.class);

	private final static int CONN_TIMEOUT = 3;
    private final static int SOCK_TIMEOUT = 5;
    private static final int HTTP_SUCCESS = 200;

    private final static RequestConfig config = RequestConfig.custom().setSocketTimeout(SOCK_TIMEOUT * 1000).setConnectTimeout(CONN_TIMEOUT * 1000).build();
    private static HttpClientConnectionManager connectionManager = createHttpClientConnectionManager(100, 100, SOCK_TIMEOUT * 1000);
    
    public static String get(String url) {
        HttpGet method = new HttpGet(url);
        return executeMethod(method, HttpClients.custom().setConnectionManager(connectionManager).build());
    }

    public static String get(String url, Map paramsMap) {
        if (null != paramsMap && paramsMap.size() > 0) {
            Set keySet = paramsMap.keySet();
            StringBuilder sb = new StringBuilder(keySet.size() * 8);
            sb.append("?");
            for (String key : keySet) {
                try {
                    String value = URLEncoder.encode(String.valueOf(paramsMap.get(key)), "UTF-8");
                    sb.append(key).append("=").append(value).append("&");
                } catch (UnsupportedEncodingException e) {
                		log.error(e.getMessage(), e);
                }
            }
            String params = sb.toString();
            url += params.substring(0, params.length() - 1);
        }
        HttpGet method = new HttpGet(url);
        return executeMethod(method, HttpClients.custom().setConnectionManager(connectionManager).build());
    }

    public static String post(String uri, Map params) throws Exception {
		// 创建默认的httpClient实例.
		CloseableHttpClient httpclient = HttpClients.createDefault();
		// 创建httppost
		HttpPost httppost = new HttpPost(uri);
		// 创建参数队列
		List formparams = new ArrayList();
		if (params != null && !params.isEmpty()) {
			for (String key : params.keySet()) {
				formparams.add(new BasicNameValuePair(key, params.get(key)));
			}
		}

		UrlEncodedFormEntity uefEntity;
		try {
			uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
			httppost.setEntity(uefEntity);

			CloseableHttpResponse response = httpclient.execute(httppost);
			try {
				HttpEntity entity = response.getEntity();
				if (entity != null) {
					return EntityUtils.toString(entity, "UTF-8");
				}
			} finally {
				response.close();
			}
		} catch (Exception e) {
			throw e;
		} finally {
			// 关闭连接,释放资源
			try {
				httpclient.close();
			} catch (Exception e) {
				throw e;
			}
		}
		return null;
	}

    public static String postJson(String url, String jsonStr) {
        HttpPost method = new HttpPost(url);
        method.setEntity(new StringEntity(jsonStr, ContentType.create("application/json", "UTF-8")));
        return executeMethod(method, HttpClients.custom().setConnectionManager(connectionManager).build());
    }
    
    private static final String executeMethod(HttpRequestBase method, CloseableHttpClient client) {
        method.setConfig(config);
        CloseableHttpResponse response = null;
        try {
            response = client.execute(method);
            if (HTTP_SUCCESS == response.getStatusLine().getStatusCode()) {
                return EntityUtils.toString(response.getEntity());
            } else {
                log.warn("response code: {}", response.getStatusLine().getStatusCode());
                log.warn(EntityUtils.toString(response.getEntity(), "UTF-8"));
            }
        } catch (Exception e) {
            log.error("#http client post error with reason : {}", e.getMessage());
            log.error(e.getMessage(), e);
        } finally {
            if (null != response) {
                try {
                    response.close();
                } catch (IOException e) {
                    log.error(e.getMessage(), e);
                }
            }
        }
        return null;
    }
    
    /**
     * @see com.aliyun.oss.ClientConfiguration
     * @see com.aliyun.oss.common.comm.DefaultServiceClient#createHttpClientConnectionManager()
     * @param maxTotal
     * @param maxPerRoute
     * @return
     */
    private static HttpClientConnectionManager createHttpClientConnectionManager(int maxTotal, 
    			int maxPerRoute, 
    			int socketTimeout) {
    		SSLContext sslContext = null;
        try {
            sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {

                public boolean isTrusted(X509Certificate[] chain, String authType)
                        throws CertificateException {
                    return true;
                }

            }).build();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }

        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        Registry socketFactoryRegistry = RegistryBuilder. create()
        							.register("http", PlainConnectionSocketFactory.getSocketFactory())
        							.register("https", sslSocketFactory)
        							.build();

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        connectionManager.setDefaultMaxPerRoute(maxPerRoute);
        connectionManager.setMaxTotal(maxTotal);
        connectionManager.setValidateAfterInactivity(2000);
        connectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(socketTimeout).setTcpNoDelay(true).build());
        IdleConnectionReaper.setIdleConnectionTime(60 * 1000);
        IdleConnectionReaper.registerConnectionManager(connectionManager);
        return connectionManager;
    }

    private static final class IdleConnectionReaper extends Thread {
    	
        private static long idleConnectionTime = 60 * 1000;
        private static final int REAP_INTERVAL_MILLISECONDS = 5 * 1000;

        private volatile boolean shuttingDown;
        private static IdleConnectionReaper instance;
        private static final ArrayList connectionManagers = new ArrayList();

        private IdleConnectionReaper() {
            super("idle_connection_reaper");
            setDaemon(true);
        }

        public static synchronized boolean registerConnectionManager(HttpClientConnectionManager connectionManager) {
            if (instance == null) {
                instance = new IdleConnectionReaper();
                instance.start();
            }
            return connectionManagers.add(connectionManager);
        }

        public static synchronized boolean removeConnectionManager(HttpClientConnectionManager connectionManager) {
            boolean b = connectionManagers.remove(connectionManager);
            if (connectionManagers.isEmpty()) {
                shutdown();
            }
            return b;
        }

        private void markShuttingDown() {
            shuttingDown = true;
        }

        @SuppressWarnings("unchecked")
        @Override
        public void run() {
            while (true) {
                if (shuttingDown) {
                    System.out.println("Shutting down reaper thread.");
                    return;
                }

                try {
                    Thread.sleep(REAP_INTERVAL_MILLISECONDS);
                } catch (InterruptedException e) {
                }

                try {
                    List connectionManagers = null;
                    synchronized (IdleConnectionReaper.class) {
                        connectionManagers = (List)IdleConnectionReaper.connectionManagers.clone();
                    }
                    for (HttpClientConnectionManager connectionManager : connectionManagers) {
                        try {
                            connectionManager.closeExpiredConnections();
                            connectionManager.closeIdleConnections(idleConnectionTime, TimeUnit.MILLISECONDS);
                        } catch (Exception ex) {
                            System.err.println("Unable to close idle connections");
                            ex.printStackTrace();
                        }
                    }
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
        }

        public static synchronized boolean shutdown() {
            if (instance != null) {
                instance.markShuttingDown();
                instance.interrupt();
                connectionManagers.clear();
                instance = null;
                return true;
            }
            return false;
        }

        public static synchronized int size() {
            return connectionManagers.size();
        }

        public static synchronized void setIdleConnectionTime(long idletime) {
            idleConnectionTime = idletime;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy