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

develop.toolkit.base.components.HttpClientHelper Maven / Gradle / Ivy

The newest version!
package develop.toolkit.base.components;

import develop.toolkit.base.struct.http.HttpClientGlobalOptions;
import develop.toolkit.base.struct.http.HttpPostProcessor;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.http.HttpClient;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.time.Duration;
import java.util.Map;
import java.util.concurrent.Executor;

/**
 * Http发送助手
 *
 * @author qiushui on 2020-09-10.
 */
@SuppressWarnings("unused")
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class HttpClientHelper {

    private final HttpClient httpClient;

    private final HttpClientGlobalOptions options;

    public static Builder builder() {
        return new Builder();
    }

    public static HttpClientHelper buildDefault() {
        return builder().build();
    }

    public HttpClientSender request(String method, String url) {
        return new HttpClientSender(httpClient, method, url, options);
    }

    public HttpClientSender get(String url) {
        return request("GET", url);
    }

    public HttpClientSender post(String url) {
        return request("POST", url);
    }

    public HttpClientSender put(String url) {
        return request("PUT", url);
    }

    public HttpClientSender delete(String url) {
        return request("DELETE", url);
    }

    public static class Builder {

        private SSLContext sslContext;

        private Duration connectTimeout = Duration.ofSeconds(10L);

        private InetSocketAddress proxyAddress;

        private Executor executor;

        private final HttpClientGlobalOptions globalOptions = new HttpClientGlobalOptions();

        public Builder onlyPrintFailed(boolean onlyPrintFailed) {
            globalOptions.onlyPrintFailed = onlyPrintFailed;
            return this;
        }

        public Builder connectTimeout(Duration connectTimeout) {
            this.connectTimeout = connectTimeout;
            return this;
        }

        public Builder proxyAddress(InetSocketAddress proxyAddress) {
            this.proxyAddress = proxyAddress;
            return this;
        }

        public Builder executor(Executor executor) {
            this.executor = executor;
            return this;
        }

        public Builder readTimeout(Duration readTimeout) {
            globalOptions.readTimeout = readTimeout;
            return this;
        }

        public Builder addGlobalPostProcessor(HttpPostProcessor globalPostProcessor) {
            globalOptions.postProcessors.add(globalPostProcessor);
            return this;
        }

        public Builder constant(String key, String value) {
            globalOptions.constants.putConstant(key, value);
            return this;
        }

        public Builder constantMap(Map constantMap) {
            globalOptions.constants.putConstantMap(constantMap);
            return this;
        }

        public Builder ssl(InputStream pkcs12, String password) {
            try {
                KeyStore ks = KeyStore.getInstance("PKCS12");
                char[] passwordChars = password.toCharArray();
                ks.load(pkcs12, passwordChars);
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                kmf.init(ks, passwordChars);
                sslContext = SSLContext.getInstance("SSL");
                sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
            } catch (Exception e) {
                throw new IllegalStateException(e.getMessage());
            }
            return this;
        }

        public HttpClientHelper build() {
            final HttpClient.Builder builder = HttpClient.newBuilder()
                    .version(HttpClient.Version.HTTP_1_1)
                    .followRedirects(HttpClient.Redirect.NEVER)
                    .connectTimeout(connectTimeout);
            if (sslContext != null) {
                builder.sslContext(sslContext);
            }
            if (proxyAddress != null) {
                builder.proxy(ProxySelector.of(proxyAddress));
            }
            if (executor != null) {
                builder.executor(executor);
            }
            return new HttpClientHelper(builder.build(), globalOptions);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy