HttpClientUtil

package com.hshbic.cloudapp.thirdserver.utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
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.ssl.SSLContexts;
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.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 
 * @author jff
 * 
 */
public class HttpClientUtil {

    private final static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
    /** 读取超时 */
    private final static int SOCKET_TIMEOUT = 60000;

    /** 连接超时 */
    private final static int CONNECTION_TIMEOUT = 10000;

    private final static int CONNECTION_REQUEST_TIMEOUT = 10000;

    /** 每个HOST的最大连接数量 */
    private final static int MAX_CONN_PRE_HOST = 20;

    /** 连接池的最大连接数 */
    private final static int MAX_CONN = 60;

    private final static String JSON_CHARSET = "application/json; charset=UTF-8";
    
    
/**
 * 
 * @param url
 * @param headers
 * @param jsonData
 * @return
 * @throws Exception
 */
    public static String doPost(String url,Map<String,String> headers,String  jsonData)throws Exception {
           if(url==null){
               throw new Exception("请求URL为空");
           }
        CloseableHttpClient httpClient = getHttpClient();
           HttpEntity responseEntity = null;
           HttpPost httppost = null;
           CloseableHttpResponse response = null;           
           httppost = new HttpPost(url);
           try{
               httppost.addHeader(HttpHeaders.CONTENT_TYPE, JSON_CHARSET);
               if (jsonData == null || jsonData.trim().length() <= 0) {
                   throw new Exception("请求body为空");
            }
               StringEntity stringEntity= new StringEntity(jsonData, "UTF-8");
               httppost.setEntity(stringEntity);
               
               if (headers != null && headers.size() > 0) {
                for (Map.Entry<String, String> entry : headers.entrySet()) {
                    httppost.addHeader(entry.getKey(), entry.getValue());
                }
            }
               response = httpClient.execute(httppost);
               responseEntity = response.getEntity();
            int statusCode = response.getStatusLine().getStatusCode();
            if (HttpStatus.SC_OK == statusCode) {
                return EntityUtils.toString(responseEntity);
            } else {
                throw new Exception("请求响应异常。 StatusCode=" + statusCode);
            }
           }catch(Exception e){
               logger.error("POST请求  url= " + url + " 异常信息:"
                    + e);
            throw new Exception("POST请求异常  url=" + url, e);
           }finally{
               if (httppost != null) {
                   httppost.releaseConnection();
               }

               if (responseEntity != null) {
                   try {
                       responseEntity.getContent().close();
                   } catch (IOException e) {
                   }
               }

               if (response != null) {
                   try {
                       response.close();
                   } catch (IOException e) {
                   }
               }
           }
           
        
    }
    /**
     * 
     * @param url
     * @param headers
     * @param requestParas 表单提交方式
     * @return
     * @throws Exception
     */
    public static String doPost(String url,Map<String,String> headers,Map<String,String> requestParas)throws Exception {
        if(url==null){
            throw new Exception("请求URL为空");
        }
     CloseableHttpClient httpClient = getHttpClient();
        HttpEntity responseEntity = null;
        HttpPost httppost = null;
        CloseableHttpResponse response = null;           
        httppost = new HttpPost(url);
        try{
            httppost.addHeader(HttpHeaders.CONTENT_TYPE, JSON_CHARSET);
            
              List<NameValuePair> form = new ArrayList<>();
                
                if(requestParas!=null&&requestParas.size()>0){
                    for(String key: requestParas.keySet()){
                        if(key!=null&&key.length()>0){
                            form.add(new BasicNameValuePair(key, requestParas.get(key)));
                        }
                    }
                    
                }
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, Consts.UTF_8);
            
            
            httppost.setEntity(entity);
            
            if (headers != null && headers.size() > 0) {
                for (Map.Entry<String, String> entry : headers.entrySet()) {
                    httppost.addHeader(entry.getKey(), entry.getValue());
                }
            }
            response = httpClient.execute(httppost);
            responseEntity = response.getEntity();
            int statusCode = response.getStatusLine().getStatusCode();
            if (HttpStatus.SC_OK == statusCode) {
                return EntityUtils.toString(responseEntity);
            } else {
                throw new Exception("请求响应异常。 StatusCode=" + statusCode);
            }
        }catch(Exception e){
            logger.error("POST请求  url= " + url + " 异常信息:"
                    + e);
            throw new Exception("POST请求异常  url=" + url, e);
        }finally{
            if (httppost != null) {
                httppost.releaseConnection();
            }

            if (responseEntity != null) {
                try {
                    responseEntity.getContent().close();
                } catch (IOException e) {
                }
            }

            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                }
            }
        }
        
        
    }

/**
 * 
 * @param url
 * @param headers
 * @return
 * @throws Exception
 */
    
    public static String doGet(String url,Map<String,String> headers)throws Exception {
        if(url==null){
            throw new Exception("请求URL为空");
        }
     CloseableHttpClient httpClient = getHttpClient();
        HttpEntity responseEntity = null;
        HttpGet httpGet = null;
        CloseableHttpResponse response = null;           
        httpGet = new HttpGet(url);
        try{
            httpGet.addHeader(HttpHeaders.CONTENT_TYPE, JSON_CHARSET);
            
            
            if (headers != null && headers.size() > 0) {
                for (Map.Entry<String, String> entry : headers.entrySet()) {
                    httpGet.addHeader(entry.getKey(), entry.getValue());
                }
            }
            response = httpClient.execute(httpGet);
            responseEntity = response.getEntity();
            int statusCode = response.getStatusLine().getStatusCode();
            if (HttpStatus.SC_OK == statusCode) {
                //logger.info(String.valueOf(statusCode));
                return EntityUtils.toString(responseEntity);
            } else {
                throw new Exception("请求响应异常。 StatusCode=" + statusCode);
            }
        }catch(Exception e){
            logger.error("请求  url= " + url + " 异常信息:"
                    + e);
            throw new Exception("请求异常  url=" + url, e);
        }finally{
            if (httpGet != null) {
                httpGet.releaseConnection();
            }

            if (responseEntity != null) {
                try {
                    responseEntity.getContent().close();
                } catch (IOException e) {
                }
            }

            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                }
            }
        }
        
        
    }


/**
 * 初始化 CloseableHttpClient
 * @return CloseableHttpClient对象
 */
    public static CloseableHttpClient getHttpClient() {

        PoolingHttpClientConnectionManager connManager = null;
        RequestConfig requestConfig = null;
        try {
            SSLContext sslContext = SSLContexts.createSystemDefault();

            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE)
                    .register("https", new SSLConnectionSocketFactory(sslContext)).build();
            connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            connManager.setMaxTotal(MAX_CONN);
            connManager.setDefaultMaxPerRoute(MAX_CONN_PRE_HOST);
            requestConfig = RequestConfig.custom().setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT)
                    .setConnectTimeout(CONNECTION_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
        } catch (Exception e) {
            logger.error("初始化【PoolingHttpClientConnectionManager、RequestConfig】异常:" + e);

        }
        return HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig).build();
    }
}
原文地址:https://www.cnblogs.com/peak911/p/9192345.html