FastHttpClient 基于 apache HttpClient 5.0 进一步封装, 提供方便的API

添加依赖

<dependency>
	<groupId>org.apache.httpcomponents.client5</groupId>
	<artifactId>httpclient5</artifactId>
	<version>5.0</version>
</dependency>

FastHttpClient.java

import org.apache.hc.client5.http.classic.methods.HttpDelete;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.classic.methods.HttpPut;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.cookie.BasicCookieStore;
import org.apache.hc.client5.http.cookie.Cookie;
import org.apache.hc.client5.http.cookie.CookieStore;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.ProtocolVersion;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.util.Asserts;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * FastHttpClient 基于 apache HttpClient 5.0 进一步封装, 提供方便的API
 * 官网: http://hc.apache.org/httpcomponents-client-5.0.x/examples.html
 * <p>
 * 依赖:
 * <dependency>
 * <groupId>org.apache.httpcomponents.client5</groupId>
 * <artifactId>httpclient5</artifactId>
 * <version>5.0</version>
 * </dependency>
 * <p>
 * ------------------------------------------------------- 简单使用如下 -------------------------------------------------------
 * <p>
 * =============== GET ===============
 * FastHttpClient httpClient = FastHttpClient.builder().build();
 * HttpGet httpGet = httpClient.buildGet("https://www.baidu.com");
 * Response<String> result = httpClient.execute(httpGet, ResponseHandler.ofString());
 * String data = result.getData();
 * <p>
 * =============== POST ==============
 * FastHttpClient httpClient = FastHttpClient.builder().build();
 * HttpPost httpPost = httpClient.buildPost("https://search.jd.com/image?op=upload");
 * httpPost.addHeader("cookie", "shshsh1");
 * httpPost.addHeader("referer", "https://search.jd.com/image");
 * httpPost.addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36");
 * <p>
 * HttpEntity entity = MultipartEntityBuilder.create()
 * // 相当于<input type="file" name="file"/>
 * // .addPart("file", new FileBody(new File("C:\\Users\\houyu\\Desktop\\123.jpg"), ContentType.IMAGE_JPEG))
 * .addBinaryBody("file", new File("C:\\Users\\houyu\\Desktop\\123.jpg"), ContentType.IMAGE_JPEG, "123.jpg")
 * // 添加文本内容
 * // .addTextBody("type", "xxx")
 * .build();
 * httpPost.setEntity(entity);
 * Response<String> result = httpClient.execute(httpPost, ResponseHandler.ofString());
 * String data = result.getData();
 *
 * @author for.houyu@qq.com
 */
public class FastHttpClient {

    /***/
    private CloseableHttpClient closeableHttpClient = null;
    /***/
    private final PoolingHttpClientConnectionManager manager;
    private final HttpClientContext context;
    private final RequestConfig requestConfig;
    private final String userAgent;

    private FastHttpClient(FastHttpClientBuilder builder) {
        this.manager = builder.manager;
        this.context = builder.context;
        this.requestConfig = builder.requestConfig;
        this.userAgent = builder.userAgent;
        //
        this.init();
    }

    private void init() {
        /** 自定义参数创建 */
        if (closeableHttpClient == null) {
            closeableHttpClient = HttpClients.custom()
                    // 设置连接池管理器
                    .setConnectionManager(manager)
                    // 设置默认的请求配置
                    .setDefaultRequestConfig(requestConfig)
                    // 设置cookie管理 (这里不在这里使用cookie管理, 而是通过每次请求的时候手动设置context)
                    // .setDefaultCookieStore(cookieStore)
                    // 设置默认的 userAgent
                    .setUserAgent(userAgent)
                    // 构建
                    .build();
        }
    }

    public <T> Response<T> execute(ClassicHttpRequest request, ResponseHandler<T> responseHandler) {
        handleCookie(request);
        try (CloseableHttpResponse response = this.closeableHttpClient.execute(request, this.context)) {
            return responseHandler.handle(response, this);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public <T> Response<T> execute(HttpHost target, ClassicHttpRequest request, ResponseHandler<T> responseHandler) {
        handleCookie(request);
        try (CloseableHttpResponse response = this.closeableHttpClient.execute(target, request, this.context)) {
            return responseHandler.handle(response, this);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private ClassicHttpRequest handleCookie(ClassicHttpRequest request) {
        String cookie;
        if (this.context != null && !request.containsHeader("cookie") && (cookie = this.getCookie()) != null) {
            request.addHeader("cookie", cookie);
        }
        return request;
    }

    

    /**
     * 创建建造者
     *
     * @return
     */
    public static FastHttpClientBuilder builder() {
        return new FastHttpClientBuilder();
    }

    /**
     * 编码uri
     *
     * @param uri     uri
     * @param charset charset
     */
    public static String encodeUri(String uri, Charset charset) {
        if (uri.contains("?")) {
            String[] split = uri.split("\\?", 2);
            return split[0] + "?" + Arrays.stream(split[1].split("&"))
                    .map(v -> v.split("=", 2))
                    .map(v -> v[0] + "=" + encodeURLText(v[1], charset))
                    .collect(Collectors.joining("&"));
        }
        return uri;
    }

    public static String encodeURLText(String text, Charset charset) {
        try {
            return URLEncoder.encode(text, charset.name());
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    public static String decodeURLText(String text, Charset charset) {
        try {
            return URLDecoder.decode(text, charset.name());
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    

    private String fixUri(String uri) {
        if (uri.startsWith("//")) {
            return "http:" + uri;
        } else if (uri.startsWith("://")) {
            return "http" + uri;
        } else if (!uri.toLowerCase().startsWith("http")) {
            return "http://" + uri;
        }
        return uri;
    }

    public HttpGet buildGet(String uri) {
        return new HttpGet(fixUri(uri));
    }

    public HttpPost buildPost(String uri) {
        return new HttpPost(fixUri(uri));
    }

    public HttpPut buildPut(String uri) {
        return new HttpPut(fixUri(uri));
    }

    public HttpDelete buildDelete(String uri) {
        return new HttpDelete(fixUri(uri));
    }

    

    public CloseableHttpClient getCloseableHttpClient() {
        return closeableHttpClient;
    }

    public PoolingHttpClientConnectionManager getManager() {
        return manager;
    }

    public HttpClientContext getContext() {
        return context;
    }

    public RequestConfig getRequestConfig() {
        return requestConfig;
    }

    public String getCookie() {
        return Optional.ofNullable(this.getContext())
                .map(HttpClientContext::getCookieStore)
                .map(CookieStore::getCookies)
                .map(c -> c.stream().map(v -> v.getName() + "=" + v.getValue()).collect(Collectors.joining("; "))).orElse(null);
    }

    public Map<String, String> getCookieAsMap() {
        return Optional.ofNullable(this.getContext())
                .map(HttpClientContext::getCookieStore)
                .map(CookieStore::getCookies)
                .map(c -> c.stream().collect(Collectors.toMap(Cookie::getName, Cookie::getValue))).orElse(Collections.emptyMap());
    }

    

    /**
     * 响应处理器处理器
     *
     * @param <T>
     */
    public interface ResponseHandler<T> {
        /**
         * 下载回调
         *
         * @param response 响应
         * @param client   fastHttpClient
         * @return
         * @throws RuntimeException
         */
        Response<T> handle(ClassicHttpResponse response, FastHttpClient client) throws RuntimeException;

        

        /**
         * 返回字符串
         *
         * @param defaultCharset 默认字符集
         */
        static ResponseHandler<String> ofString(Charset... defaultCharset) {
            return (response, client) -> {
                try {
                    Charset charset = defaultCharset != null && defaultCharset.length > 0 ? defaultCharset[0] : Charset.defaultCharset();
                    return Response.build(response, EntityUtils.toString(response.getEntity(), charset));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            };
        }

        /**
         * 保存为文件
         *
         * @param path    保存文件路径
         * @param options StandardCopyOption: REPLACE_EXISTING(替换更新), COPY_ATTRIBUTES(复制属性), ATOMIC_MOVE(原子移动)
         */
        static ResponseHandler<File> ofFile(Path path, CopyOption... options) {
            return (response, client) -> {
                File file = path.toFile();
                if (!file.exists()) {
                    file.getParentFile().mkdirs();
                }
                try (InputStream in = response.getEntity().getContent()) {
                    Files.copy(in, path, options);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                return Response.build(response, file);
            };
        }
    }

    /**
     * 响应结果
     *
     * @param <T>
     */
    public static class Response<T> {

        private final int code;
        private final HttpEntity entity;
        private final T data;
        private final ProtocolVersion version;
        private final Locale locale;
        private final String reasonPhrase;

        public Response(int code, HttpEntity entity, T data, ProtocolVersion version, Locale locale, String reasonPhrase) {
            this.code = code;
            this.entity = entity;
            this.data = data;
            this.version = version;
            this.locale = locale;
            this.reasonPhrase = reasonPhrase;
        }

        public static <T> Response<T> build(ClassicHttpResponse response, T data) {
            return new Response<T>(response.getCode(), response.getEntity(), data, response.getVersion(), response.getLocale(), response.getReasonPhrase());
        }

        public int getCode() {
            return code;
        }

        public HttpEntity getEntity() {
            return entity;
        }

        public T getData() {
            return data;
        }

        public ProtocolVersion getVersion() {
            return version;
        }

        public Locale getLocale() {
            return locale;
        }

        public String getReasonPhrase() {
            return reasonPhrase;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Response{");
            sb.append("code=").append(code);
            sb.append(", entity=").append(entity);
            sb.append(", data=").append(data);
            sb.append(", version=").append(version);
            sb.append(", locale=").append(locale);
            sb.append(", reasonPhrase='").append(reasonPhrase).append('\'');
            sb.append('}');
            return sb.toString();
        }
    }

    /**
     * 建造者
     */
    public static class FastHttpClientBuilder {

        private PoolingHttpClientConnectionManager manager;
        private HttpClientContext context;
        private CookieStore cookieStore;
        private RequestConfig requestConfig;
        private String userAgent;

        public FastHttpClientBuilder() {
            /** 创建连接池管理器 */
            manager = new PoolingHttpClientConnectionManager();
            // 设置总的连接最大数
            manager.setMaxTotal(100);
            // 设置单独路由的连接最大数
            manager.setDefaultMaxPerRoute(manager.getMaxTotal() / 2);
            /** 创建上下文 */
            context = HttpClientContext.create();
            cookieStore = new BasicCookieStore();
            context.setCookieStore(cookieStore);
            /** 创建默认的请求配置 */
            requestConfig = RequestConfig.custom()
                    // 设置启用重定向
                    .setRedirectsEnabled(true)
                    // 设置最大重定向次数
                    .setMaxRedirects(30)
                    // 设置默认的cookie
                    // .setCookieSpec(cookie)
                    // 设置连接超时
                    .setConnectTimeout(2, TimeUnit.MINUTES)
                    // 设置响应超时
                    .setResponseTimeout(2, TimeUnit.MINUTES)
                    // 设置请求参数
                    .setConnectionRequestTimeout(2, TimeUnit.MINUTES)
                    // 构建
                    .build();
            /** 设置默认的userAgent */
            userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36";
        }

        public FastHttpClient build() {
            return new FastHttpClient(this);
        }

        public FastHttpClientBuilder setManager(PoolingHttpClientConnectionManager manager) {
            Asserts.notNull(manager, "manager");
            this.manager = manager;
            return this;
        }

        public FastHttpClientBuilder setContext(HttpClientContext context) {
            // Asserts.notNull(context, "context");
            this.context = context;
            return this;
        }

        public FastHttpClientBuilder setRequestConfig(RequestConfig requestConfig) {
            Asserts.notNull(requestConfig, "requestConfig");
            this.requestConfig = requestConfig;
            return this;
        }

        public FastHttpClientBuilder setUserAgent(String userAgent) {
            Asserts.notNull(userAgent, "userAgent");
            this.userAgent = userAgent;
            return this;
        }

        public FastHttpClientBuilder setCookie(String cookie) {
            Asserts.notNull(cookie, "cookie");
            Asserts.notNull(context, "context");
            //
            if (!cookie.trim().isEmpty()) {
                this.cookieStore = context.getCookieStore() == null ? this.cookieStore : context.getCookieStore();
                Arrays.stream(cookie.split("; ")).map(v -> v.split("=", 2)).forEach(v -> this.cookieStore.addCookie(new BasicClientCookie(v[0], v[1])));
                context.setCookieStore(this.cookieStore);
            }
            return this;
        }
    }

    
}

/*
public class ClientWithResponseHandler {

    public static void main(final String[] args) throws Exception {
        try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
            final HttpGet httpget = new HttpGet("http://httpbin.org/get");

            System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());

            // Create a custom response handler
            final HttpClientResponseHandler<String> responseHandler = new HttpClientResponseHandler<String>() {

                @Override
                public String handleResponse(
                        final ClassicHttpResponse response) throws IOException {
                    final int status = response.getCode();
                    if (status >= HttpStatus.SC_SUCCESS && status < HttpStatus.SC_REDIRECTION) {
                        final HttpEntity entity = response.getEntity();
                        try {
                            return entity != null ? EntityUtils.toString(entity) : null;
                        } catch (final ParseException ex) {
                            throw new ClientProtocolException(ex);
                        }
                    } else {
                        throw new ClientProtocolException("Unexpected response status: " + status);
                    }
                }

            };
            final String responseBody = httpclient.execute(httpget, responseHandler);
            System.out.println("----------------------------------------");
            System.out.println(responseBody);
        }
    }

}
 */

/*
public class ClientConfiguration {

    public final static void main(final String[] args) throws Exception {

        // Use custom message parser / writer to customize the way HTTP
        // messages are parsed from and written out to the data stream.
        final HttpMessageParserFactory<ClassicHttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {

            @Override
            public HttpMessageParser<ClassicHttpResponse> create(final Http1Config h1Config) {
                final LineParser lineParser = new BasicLineParser() {

                    @Override
                    public Header parseHeader(final CharArrayBuffer buffer) {
                        try {
                            return super.parseHeader(buffer);
                        } catch (final ParseException ex) {
                            return new BasicHeader(buffer.toString(), null);
                        }
                    }

                };
                return new DefaultHttpResponseParser(lineParser, DefaultClassicHttpResponseFactory.INSTANCE, h1Config);
            }

        };
        final HttpMessageWriterFactory<ClassicHttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();

        // Create HTTP/1.1 protocol configuration
        final Http1Config h1Config = Http1Config.custom()
                .setMaxHeaderCount(200)
                .setMaxLineLength(2000)
                .build();
        // Create connection configuration
        final CharCodingConfig connectionConfig = CharCodingConfig.custom()
                .setMalformedInputAction(CodingErrorAction.IGNORE)
                .setUnmappableInputAction(CodingErrorAction.IGNORE)
                .setCharset(StandardCharsets.UTF_8)
                .build();

        // Use a custom connection factory to customize the process of
        // initialization of outgoing HTTP connections. Beside standard connection
        // configuration parameters HTTP connection factory can define message
        // parser / writer routines to be employed by individual connections.
        final HttpConnectionFactory<ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
                h1Config, connectionConfig, requestWriterFactory, responseParserFactory);

        // Client HTTP connection objects when fully initialized can be bound to
        // an arbitrary network socket. The process of network socket initialization,
        // its connection to a remote address and binding to a local one is controlled
        // by a connection socket factory.

        // SSL context for secure connections can be created either based on
        // system or application specific properties.
        final SSLContext sslcontext = SSLContexts.createSystemDefault();

        // Create a registry of custom connection socket factories for supported
        // protocol schemes.
        final Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.INSTANCE)
            .register("https", new SSLConnectionSocketFactory(sslcontext))
            .build();

        // Use custom DNS resolver to override the system DNS resolution.
        final DnsResolver dnsResolver = new SystemDefaultDnsResolver() {

            @Override
            public InetAddress[] resolve(final String host) throws UnknownHostException {
                if (host.equalsIgnoreCase("myhost")) {
                    return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };
                } else {
                    return super.resolve(host);
                }
            }

        };

        // Create a connection manager with custom configuration.
        final PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
                socketFactoryRegistry, PoolConcurrencyPolicy.STRICT, PoolReusePolicy.LIFO, TimeValue.ofMinutes(5),
                null, dnsResolver, null);

        // Create socket configuration
        final SocketConfig socketConfig = SocketConfig.custom()
            .setTcpNoDelay(true)
            .build();
        // Configure the connection manager to use socket configuration either
        // by default or for a specific host.
        connManager.setDefaultSocketConfig(socketConfig);
        // Validate connections after 1 sec of inactivity
        connManager.setValidateAfterInactivity(TimeValue.ofSeconds(10));

        // Configure total max or per route limits for persistent connections
        // that can be kept in the pool or leased by the connection manager.
        connManager.setMaxTotal(100);
        connManager.setDefaultMaxPerRoute(10);
        connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);

        // Use custom cookie store if necessary.
        final CookieStore cookieStore = new BasicCookieStore();
        // Use custom credentials provider if necessary.
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // Create global request configuration
        final RequestConfig defaultRequestConfig = RequestConfig.custom()
            .setCookieSpec(StandardCookieSpec.STRICT)
            .setExpectContinueEnabled(true)
            .setTargetPreferredAuthSchemes(Arrays.asList(StandardAuthScheme.NTLM, StandardAuthScheme.DIGEST))
            .setProxyPreferredAuthSchemes(Arrays.asList(StandardAuthScheme.BASIC))
            .build();

        // Create an HttpClient with the given custom dependencies and configuration.

        try (final CloseableHttpClient httpclient = HttpClients.custom()
                .setConnectionManager(connManager)
                .setDefaultCookieStore(cookieStore)
                .setDefaultCredentialsProvider(credentialsProvider)
                .setProxy(new HttpHost("myproxy", 8080))
                .setDefaultRequestConfig(defaultRequestConfig)
                .build()) {
            final HttpGet httpget = new HttpGet("http://httpbin.org/get");
            // Request configuration can be overridden at the request level.
            // They will take precedence over the one set at the client level.
            final RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
                    .setConnectionRequestTimeout(Timeout.ofSeconds(5))
                    .setConnectTimeout(Timeout.ofSeconds(5))
                    .setProxy(new HttpHost("myotherproxy", 8080))
                    .build();
            httpget.setConfig(requestConfig);

            // Execution context can be customized locally.
            final HttpClientContext context = HttpClientContext.create();
            // Contextual attributes set the local context level will take
            // precedence over those set at the client level.
            context.setCookieStore(cookieStore);
            context.setCredentialsProvider(credentialsProvider);

            System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
            try (final CloseableHttpResponse response = httpclient.execute(httpget, context)) {
                System.out.println("----------------------------------------");
                System.out.println(response.getCode() + " " + response.getReasonPhrase());
                System.out.println(EntityUtils.toString(response.getEntity()));

                // Once the request has been executed the local context can
                // be used to examine updated state and various objects affected
                // by the request execution.

                // Last executed request
                context.getRequest();
                // Execution route
                context.getHttpRoute();
                // Auth exchanges
                context.getAuthExchanges();
                // Cookie origin
                context.getCookieOrigin();
                // Cookie spec used
                context.getCookieSpec();
                // User security token
                context.getUserToken();

            }
        }
    }

}
 */

/*
public class ClientFormLogin {

    public static void main(final String[] args) throws Exception {
        final BasicCookieStore cookieStore = new BasicCookieStore();
        try (final CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCookieStore(cookieStore)
                .build()) {
            final HttpGet httpget = new HttpGet("https://someportal/");
            try (final CloseableHttpResponse response1 = httpclient.execute(httpget)) {
                final HttpEntity entity = response1.getEntity();

                System.out.println("Login form get: " + response1.getCode() + " " + response1.getReasonPhrase());
                EntityUtils.consume(entity);

                System.out.println("Initial set of cookies:");
                final List<Cookie> cookies = cookieStore.getCookies();
                if (cookies.isEmpty()) {
                    System.out.println("None");
                } else {
                    for (int i = 0; i < cookies.size(); i++) {
                        System.out.println("- " + cookies.get(i).toString());
                    }
                }
            }

            final ClassicHttpRequest login = ClassicRequestBuilder.post()
                    .setUri(new URI("https://someportal/"))
                    .addParameter("IDToken1", "username")
                    .addParameter("IDToken2", "password")
                    .build();
            try (final CloseableHttpResponse response2 = httpclient.execute(login)) {
                final HttpEntity entity = response2.getEntity();

                System.out.println("Login form get: " + response2.getCode() + " " + response2.getReasonPhrase());
                EntityUtils.consume(entity);

                System.out.println("Post logon cookies:");
                final List<Cookie> cookies = cookieStore.getCookies();
                if (cookies.isEmpty()) {
                    System.out.println("None");
                } else {
                    for (int i = 0; i < cookies.size(); i++) {
                        System.out.println("- " + cookies.get(i).toString());
                    }
                }
            }
        }
    }
}
 */

/*
public class ClientCustomSSL {

    public final static void main(final String[] args) throws Exception {
        // Trust standard CA and those trusted by our custom strategy
        final SSLContext sslcontext = SSLContexts.custom()
                .loadTrustMaterial(new TrustStrategy() {

                    @Override
                    public boolean isTrusted(
                            final X509Certificate[] chain,
                            final String authType) throws CertificateException {
                        final X509Certificate cert = chain[0];
                        return "CN=httpbin.org".equalsIgnoreCase(cert.getSubjectDN().getName());
                    }

                })
                .build();
        // Allow TLSv1.2 protocol only
        final SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
                .setSslContext(sslcontext)
                .setTlsVersions(TLS.V_1_2)
                .build();
        final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
                .setSSLSocketFactory(sslSocketFactory)
                .build();
        try (CloseableHttpClient httpclient = HttpClients.custom()
                .setConnectionManager(cm)
                .build()) {

            final HttpGet httpget = new HttpGet("https://httpbin.org/");

            System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());

            final HttpClientContext clientContext = HttpClientContext.create();
            try (CloseableHttpResponse response = httpclient.execute(httpget, clientContext)) {
                System.out.println("----------------------------------------");
                System.out.println(response.getCode() + " " + response.getReasonPhrase());
                System.out.println(EntityUtils.toString(response.getEntity()));

                final SSLSession sslSession = clientContext.getSSLSession();
                if (sslSession != null) {
                    System.out.println("SSL protocol " + sslSession.getProtocol());
                    System.out.println("SSL cipher suite " + sslSession.getCipherSuite());
                }
            }
        }
    }

}
 */

/*
public class ClientExecuteProxy {

    public static void main(final String[] args)throws Exception {
        try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
            final HttpHost target = new HttpHost("https", "httpbin.org", 443);
            final HttpHost proxy = new HttpHost("http", "127.0.0.1", 8080);

            final RequestConfig config = RequestConfig.custom()
                    .setProxy(proxy)
                    .build();
            final HttpGet request = new HttpGet("/get");
            request.setConfig(config);

            System.out.println("Executing request " + request.getMethod() + " " + request.getUri() +
                    " via " + proxy);

            try (final CloseableHttpResponse response = httpclient.execute(target, request)) {
                System.out.println("----------------------------------------");
                System.out.println(response.getCode() + " " + response.getReasonPhrase());
                System.out.println(EntityUtils.toString(response.getEntity()));
            }
        }
    }

}
 */

/*
public class ClientMultiThreadedExecution {

    public static void main(final String[] args) throws Exception {
        // Create an HttpClient with the PoolingHttpClientConnectionManager.
        // This connection manager must be used if more than one thread will
        // be using the HttpClient.
        final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(100);

        try (final CloseableHttpClient httpclient = HttpClients.custom()
                .setConnectionManager(cm)
                .build()) {
            // create an array of URIs to perform GETs on
            final String[] urisToGet = {
                    "http://hc.apache.org/",
                    "http://hc.apache.org/httpcomponents-core-ga/",
                    "http://hc.apache.org/httpcomponents-client-ga/",
            };

            // create a thread for each URI
            final GetThread[] threads = new GetThread[urisToGet.length];
            for (int i = 0; i < threads.length; i++) {
                final HttpGet httpget = new HttpGet(urisToGet[i]);
                threads[i] = new GetThread(httpclient, httpget, i + 1);
            }

            // start the threads
            for (final GetThread thread : threads) {
                thread.start();
            }

            // join the threads
            for (final GetThread thread : threads) {
                thread.join();
            }

        }
    }

    static class GetThread extends Thread {

        private final CloseableHttpClient httpClient;
        private final HttpContext context;
        private final HttpGet httpget;
        private final int id;

        public GetThread(final CloseableHttpClient httpClient, final HttpGet httpget, final int id) {
            this.httpClient = httpClient;
            this.context = new BasicHttpContext();
            this.httpget = httpget;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                System.out.println(id + " - about to get something from " + httpget.getUri());
                try (CloseableHttpResponse response = httpClient.execute(httpget, context)) {
                    System.out.println(id + " - get executed");
                    // get the response body as an array of bytes
                    final HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        final byte[] bytes = EntityUtils.toByteArray(entity);
                        System.out.println(id + " - " + bytes.length + " bytes read");
                    }
                }
            } catch (final Exception e) {
                System.out.println(id + " - error: " + e);
            }
        }

    }

}
 */

/*
public class ClientInterceptors {

    public static void main(final String[] args) throws Exception {
        try (final CloseableHttpClient httpclient = HttpClients.custom()

                // Add a simple request ID to each outgoing request

                .addRequestInterceptorFirst(new HttpRequestInterceptor() {

                    private final AtomicLong count = new AtomicLong(0);

                    @Override
                    public void process(
                            final HttpRequest request,
                            final EntityDetails entity,
                            final HttpContext context) throws HttpException, IOException {
                        request.setHeader("request-id", Long.toString(count.incrementAndGet()));
                    }
                })

                // Simulate a 404 response for some requests without passing the message down to the backend

                .addExecInterceptorAfter(ChainElement.PROTOCOL.name(), "custom", new ExecChainHandler() {

                    @Override
                    public ClassicHttpResponse execute(
                            final ClassicHttpRequest request,
                            final ExecChain.Scope scope,
                            final ExecChain chain) throws IOException, HttpException {

                        final Header idHeader = request.getFirstHeader("request-id");
                        if (idHeader != null && "13".equalsIgnoreCase(idHeader.getValue())) {
                            final ClassicHttpResponse response = new BasicClassicHttpResponse(HttpStatus.SC_NOT_FOUND, "Oppsie");
                            response.setEntity(new StringEntity("bad luck", ContentType.TEXT_PLAIN));
                            return response;
                        } else {
                            return chain.proceed(request, scope);
                        }
                    }

                })
                .build()) {

            for (int i = 0; i < 20; i++) {
                final HttpGet httpget = new HttpGet("http://httpbin.org/get");

                System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());

                try (final CloseableHttpResponse response = httpclient.execute(httpget)) {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getCode() + " " + response.getReasonPhrase());
                    System.out.println(EntityUtils.toString(response.getEntity()));
                }
            }
        }
    }

}

 */

/*
public class ClientMultipartFormPost {

    public static void main(final String[] args) throws Exception {
        if (args.length != 1)  {
            System.out.println("File path not given");
            System.exit(1);
        }
        try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
            final HttpPost httppost = new HttpPost("http://localhost:8080" +
                    "/servlets-examples/servlet/RequestInfoExample");

            final FileBody bin = new FileBody(new File(args[0]));
            final StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);

            final HttpEntity reqEntity = MultipartEntityBuilder.create()
                    .addPart("bin", bin)
                    .addPart("comment", comment)
                    .build();


            httppost.setEntity(reqEntity);

            System.out.println("executing request " + httppost);
            try (final CloseableHttpResponse response = httpclient.execute(httppost)) {
                System.out.println("----------------------------------------");
                System.out.println(response);
                final HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    System.out.println("Response content length: " + resEntity.getContentLength());
                }
                EntityUtils.consume(resEntity);
            }
        }
    }

}
 */

/*
private static void test1() throws IOException, URISyntaxException, ParseException {
    try (CloseableHttpClient httpClient = HttpClients.createDefault()){
        final HttpPost httppost = new HttpPost("https://search.jd.com/image?op=upload");
        // final HttpPost httppost = new HttpPost("http://localhost:8888/test");

        httppost.addHeader("cookie", "__jXLEMQAG6LTE");
        httppost.addHeader("referer", "https://search.jd.com/image");
        httppost.addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36");

        final File file = new File("C:\\Users\\houyu\\Desktop\\1.jpg");
        FileBody bin = new FileBody(file, ContentType.IMAGE_JPEG);

        HttpEntity reqEntity = MultipartEntityBuilder.create()
                // 相当于<input type="file" name="file"/>
                .addPart("file", bin)
                .build();

        httppost.setEntity(reqEntity);

        System.out.println("Executing request " + httppost.getMethod() + " " + httppost.getUri());
        try (final CloseableHttpResponse response = httpClient.execute(httppost)) {
            System.out.println("----------------------------------------");
            System.out.println(response.getCode() + " " + response.getReasonPhrase());
            System.out.println(EntityUtils.toString(response.getEntity()));
        }

    }
}
 */



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值