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

com.gitee.summer9102.develop.common.httpclient.ProxyHttpClientUtil Maven / Gradle / Ivy

package com.gitee.summer9102.develop.common.httpclient;

import org.apache.http.Consts;
import org.apache.http.HttpHost;
import org.apache.http.HttpStatus;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.HttpClientUtils;
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.impl.client.BasicCredentialsProvider;
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.util.EntityUtils;

import javax.net.ssl.SSLContext;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;

public class ProxyHttpClientUtil {

    //发送请求的客户端单例
    private CloseableHttpClient httpClient;
    //连接池管理器
    private PoolingHttpClientConnectionManager connectionManager;
    //请求设置
    private RequestConfig requestConfig;
    //相当于线程锁,用于线程安全
    private final static Object syncLock = new Object();
    //代理
    private HttpHost proxy;
    //凭证
    private CredentialsProvider provider;

    public ProxyHttpClientUtil(String proxyHost, int proxyPort, String proxyUser, String proxyPass, int httpMaxPoolSize, int connectTimeout, int socketTimeout, int maxIdleTime) {
        try {
            Registry socketFactoryRegistry = RegistryBuilder.create()
                    .register("https", new SSLConnectionSocketFactory(SSLContext.getDefault()))
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .build();
            connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            // 最大连接数
            connectionManager.setMaxTotal(httpMaxPoolSize);
            // 路由最大连接数
            connectionManager.setDefaultMaxPerRoute(httpMaxPoolSize);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        proxy = new HttpHost(proxyHost, proxyPort);
        provider = new BasicCredentialsProvider();
        provider.setCredentials(new AuthScope(proxy), new UsernamePasswordCredentials(proxyUser, proxyPass));

        requestConfig = RequestConfig.custom()
                .setProxy(proxy)
                // 获取连接超时时间
                .setConnectionRequestTimeout(connectTimeout)
                // 连接建立超时时间
                .setConnectTimeout(connectTimeout)
                // 获取数据超时时间
                .setSocketTimeout(socketTimeout)
                .build();

        httpClient = initHttpClient(maxIdleTime);
    }

    private CloseableHttpClient initHttpClient(int maxIdleTime) {
        synchronized (syncLock) {
            if (httpClient == null) {
                return HttpClients.custom()
                        .setConnectionManager(connectionManager)
                        .setDefaultRequestConfig(requestConfig)
                        .setDefaultCredentialsProvider(provider)
                        //清理超过空闲时间的连接
                        .evictIdleConnections(maxIdleTime > 0 ? maxIdleTime : 30000, TimeUnit.MILLISECONDS)
                        .build();
            }
            return httpClient;
        }
    }

    public CloseableHttpClient getHttpClient() {
        if (httpClient == null) {
            httpClient = initHttpClient(30000);
        }
        return httpClient;
    }

    public String requestToString(HttpUriRequest request) {
        String result = null;
        CloseableHttpResponse response = null;
        try {
            //开启HttpClient
            response = getHttpClient().execute(request);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                result = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
            }

            return result;
        } catch (Exception e) {
            return null;
        } finally {
            HttpClientUtils.closeQuietly(response);
        }
    }

    public byte[] requestToByteArray(HttpUriRequest request) {
        byte[] result = null;
        CloseableHttpResponse response = null;
        try {
            //开启HttpClient
            response = getHttpClient().execute(request);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                result = EntityUtils.toByteArray(response.getEntity());
            }

            return result;
        } catch (Exception e) {
            return null;
        } finally {
            HttpClientUtils.closeQuietly(response);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy