package com.amarsoft.hub.api.utils;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
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.LayeredConnectionSocketFactory;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* http客戶端工具類,用於獲取http客戶端實例(單例)
*/
public class HttpClientUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtils.class);
public static CloseableHttpClient getHttpClient() {
return HttpClientHolder.httpClient;
}
public static RequestConfig createRequestConfig(int timeout) {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(timeout)
.setConnectionRequestTimeout(timeout)
.setConnectTimeout(timeout)
.build();
return requestConfig;
}
private static class HttpClientHolder {
private static final CloseableHttpClient httpClient = createHttpClient();
@SuppressWarnings("resource")
private static CloseableHttpClient createHttpClient() {
PoolingHttpClientConnectionManager cm = null;
SSLContextBuilder builder = new SSLContextBuilder();
//全部信任 不做身份鑑定
try {
builder.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
});
} catch (NoSuchAlgorithmException | KeyStoreException e) {
LOGGER.error("",e);
}
LayeredConnectionSocketFactory sslsf = null;
try {
sslsf = new SSLConnectionSocketFactory(builder.build(),NoopHostnameVerifier.INSTANCE);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
LOGGER.error("", e);
}
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();
cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
cm.setMaxTotal(400);
cm.setDefaultMaxPerRoute(20);
HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
return false;
}
};
CloseableHttpClient httpClient = HttpClients.custom()
.setRetryHandler(retryHandler)
.setConnectionManager(cm)
.build();
return httpClient;
}
}
}