HttpClientUtils.java 5.62 KB
package com.bsth.util;

import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
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.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Created by panzhao on 2017/8/2.
 */
public class HttpClientUtils {

    static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class);

    private static String HTTPS = "https://";

    private static SSLConnectionSocketFactory sslConnectionSocketFactory;

    static {
        try {
            SSLContext sslCtx = SSLContext.getInstance("TLSv1.2");
            sslCtx.init(null, new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                        }

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }
                    }
            }, null);
            sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslCtx, new HostnameVerifier() {

                @Override
                public boolean verify(String hostname, SSLSession session) {
                    // TODO Auto-generated method stub
                    return true;
                }
            });
        } catch (Exception e) {
            logger.error("SSL context set fail: {}", e);
        }
    }

    public static CloseableHttpClient defaultHttpClient(String url) {
        if (url.startsWith(HTTPS)) {
            return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();
        }
        return HttpClients.createDefault();
    }

    public static StringBuilder get(String url) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        StringBuilder stringBuffer = null;
        try {
            httpClient = defaultHttpClient(url);
            HttpGet get = new HttpGet(url);
            //超时时间
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(6500).setConnectionRequestTimeout(6000)
                    .setSocketTimeout(6500).build();
            get.setConfig(requestConfig);
            get.addHeader("Content-Encoding", "gzip");

            response = httpClient.execute(get);

            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode != 200){
                get.abort();
                System.out.println("http client status code: " + statusCode);
                return null;
            }

            stringBuffer = getResult(response.getEntity());
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            if (null != httpClient)
                httpClient.close();
            if (null != response)
                response.close();
        }
        return stringBuffer;
    }

    /**
     * raw post data
     * @param url
     * @param data
     * @return
     */
    public static StringBuilder post(String url, String data) throws Exception {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        StringBuilder stringBuffer = null;
        try {
            httpClient = defaultHttpClient(url);
            HttpPost post = new HttpPost(url);

            post.setHeader("Accept", "application/json");
            post.setHeader("Content-Type", "application/json");
            //超时时间
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(3500).setConnectionRequestTimeout(2000)
                    .setSocketTimeout(3500).build();
            post.setConfig(requestConfig);
            post.setEntity((new StringEntity(data, "UTF-8")));

            response = httpClient.execute(post);

            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode != 200){
                post.abort();
                System.out.println("http client status code: " + statusCode);
                return null;
            }

            stringBuffer = getResult(response.getEntity());
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            if (null != httpClient)
                httpClient.close();
            if (null != response)
                response.close();
        }
        return stringBuffer;
    }

    private static StringBuilder getResult(HttpEntity entity) throws IOException {
        StringBuilder stringBuffer = null;
        if (null != entity) {
            BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
            stringBuffer = new StringBuilder();
            String str = "";
            while ((str = br.readLine()) != null)
                stringBuffer.append(str);
        }
        return stringBuffer;
    }
}