【问题标题】:How to set Spring HttpComponentsClientHttpRequestFactory with Apache httpcomponent5?如何使用 Apache httpcomponent5 设置 Spring HttpComponentsClientHttpRequestFactory?
【发布时间】:2024-01-08 03:31:01
【问题描述】:

我正在尝试在 Spring 中设置 httpClient5 ...我有以下代码:

PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
                .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
                        .setSslContext(SSLContexts.createSystemDefault())
                        .setTlsVersions(TLS.V_1_3, TLS.V_1_2)
                        .build())
                .setDefaultSocketConfig(SocketConfig.custom()
                        .setSoTimeout(Timeout.ofSeconds(5))
                        .build())
                .setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
                .setConnPoolPolicy(PoolReusePolicy.LIFO)
                .setConnectionTimeToLive(TimeValue.ofMinutes(1L))
                .build();

        CloseableHttpClient client = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setDefaultRequestConfig(RequestConfig.custom()
                        .setConnectTimeout(Timeout.ofSeconds(5))
                        .setResponseTimeout(Timeout.ofSeconds(5))
                        .setCookieSpec(StandardCookieSpec.STRICT)
                        .build())
                .build();

        CookieStore cookieStore = new BasicCookieStore();

        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

        HttpClientContext clientContext = HttpClientContext.create();
        clientContext.setCookieStore(cookieStore);
        clientContext.setCredentialsProvider(credentialsProvider);
        clientContext.setRequestConfig(RequestConfig.custom()
                .setConnectTimeout(Timeout.ofSeconds(5000))
                .setResponseTimeout(Timeout.ofSeconds(5000))
                .build());



        // connect Spring httpComponent (client-side) with Apache httpClient
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setReadTimeout(60000);
        httpRequestFactory.setConnectTimeout(60000);
        httpRequestFactory.setHttpClient(client);

ClosableHttpClient类实现了与setHttpClient(client)不兼容的接口org.apache.hc.client5.http.classic.HttpClient;这是运行时错误:

java.lang.ClassCastException: class org.apache.hc.client5.http.impl.classic.InternalHttpClient cannot be cast to class org.apache.http.client.HttpClient (org.apache.hc.client5.http.impl.classic.InternalHttpClient and org.apache.http.client.HttpClient are in unnamed module of loader 'app')

我正在使用 Spring 5.0 和 HttpComponents-client-5。如何将 HttpClient 4.X 转换为 HttpClient 5 ?

【问题讨论】:

    标签: java spring apache-httpcomponents


    【解决方案1】:

    Apache HttpClient 4.5 和 HttpClient 5.0 经典版非常相似,但完全 API 不兼容

    在 Spring 提供基于 Apache HttpClient 5.x 的 RequestFactory 实现之前,无法将 HttpClient 5.x 与 Spring 集成。

    【讨论】:

    • 我刚刚尝试过这样做,我相信截至 2021 年 6 月,情况仍然如此。