普通视图

Received before yesterday

一个通用的CloseableHttpClient工厂类

2023年1月1日 00:00

一个CloseableHttpClient工厂,基于java知名开源库apache-httpclient,能够忽略SSL,并且超时和状态异常时可以重试

<dependencies>    <dependency>        <groupId>org.apache.httpcomponents</groupId>        <artifactId>httpclient</artifactId>        <version>4.5.9</version>    </dependency>    <dependency>        <groupId>org.apache.httpcomponents</groupId>        <artifactId>httpmime</artifactId>        <version>4.5.9</version>    </dependency></dependencies>
package util;import lombok.extern.slf4j.Slf4j;import org.apache.http.ConnectionClosedException;import org.apache.http.HttpResponse;import org.apache.http.NoHttpResponseException;import org.apache.http.client.CookieStore;import org.apache.http.client.ServiceUnavailableRetryStrategy;import org.apache.http.conn.ConnectTimeoutException;import org.apache.http.conn.ssl.NoopHostnameVerifier;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.protocol.HttpContext;import org.apache.http.ssl.SSLContextBuilder;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLHandshakeException;import java.net.SocketTimeoutException;@Slf4jpublic class HttpClientUtil {    public static CloseableHttpClient createSSLClientDefault() {        try {            SSLContextBuilder sslContextBuilder = new SSLContextBuilder();            SSLContext sslContext = sslContextBuilder.loadTrustMaterial(null, (chain, authType) -> true).build();            SSLConnectionSocketFactory ssl = new SSLConnectionSocketFactory(                    sslContext,                    new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"},                    null,                    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);            return HttpClients.custom()                    .setSSLSocketFactory(ssl)                    .setRetryHandler((e, executionCount, context) -> {                        if (executionCount <= 20) {                            if (e instanceof NoHttpResponseException                                    || e instanceof ConnectTimeoutException                                    || e instanceof SocketTimeoutException                                    || e instanceof SSLHandshakeException) {                                log.info("{} 异常, 重试 {}", e.getMessage(), executionCount);                                return true;                            }                        }                        return false;                    })                    .setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {                        @Override                        public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {                            int statusCode = response.getStatusLine().getStatusCode();                            if (statusCode != 200) {                                if (executionCount <= 20) {                                    log.info("{} 状态码异常, 重试 {}", statusCode, executionCount);                                    return true;                                }                            }                            return false;                        }                        @Override                        public long getRetryInterval() {                            return 0;                        }                    })                    .build();        }        catch (Exception e) {            throw new RuntimeException(e);        }    }}
❌