You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级apache.httpclient5至5.4后RestClient返回403问题求助

问题

基于SpringBoot 3.3.6开发应用,使用RestClient.Builder构建带有基于apache.httpclient5的自定义请求工厂的RestClient实例。最初使用apache.httpclient 5.3.1时一切正常,将依赖升级至5.4后,所有发起的请求均返回403 [No body]响应,降级回5.3.1则问题解决。

构建代码如下:

ClientHttpRequestFactorySettings settings = 
    ClientHttpRequestFactorySettings.DEFAULTS
        .withConnectTimeout(Duration.ofSeconds(120))
        .withReadTimeout(Duration.ofSeconds(120));
var requestFactory = ClientHttpRequestFactories.get(settings);

// RestClient.Builder restClientBuilder

var restClient = restClientBuilder
    .requestFactory(requestFactory)
    .baseUrl(url)
    .build();

问题原因

Apache HttpClient 5.4版本默认启用了严格的Content-Length校验,当请求体实际长度与声明的Content-Length不匹配时,会触发请求异常,或被服务端判定为非法请求返回403;而5.3.1版本无此严格校验逻辑。

同时,Spring的ClientHttpRequestFactories.get(settings)在适配HttpClient 5.4时,存在请求头(尤其是Content-Length)处理的兼容性问题,导致服务端识别到异常请求并拒绝访问。

修复方案

方案1:禁用HttpClient 5.4的严格Content-Length校验

手动创建HttpClient实例并关闭严格校验,再包装为Spring的请求工厂:

// 创建自定义HttpClient实例
CloseableHttpClient httpClient = HttpClients.custom()
    .disableContentLengthValidation() // 禁用严格的Content-Length校验
    .build();

// 包装成Spring兼容的请求工厂
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setConnectTimeout(Duration.ofSeconds(120));
requestFactory.setReadTimeout(Duration.ofSeconds(120));

// 构建RestClient
var restClient = restClientBuilder
    .requestFactory(requestFactory)
    .baseUrl(url)
    .build();

方案2:显式使用兼容的请求工厂实现

跳过ClientHttpRequestFactories的自动适配,直接使用HttpComponentsClientHttpRequestFactory:

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setConnectTimeout(Duration.ofSeconds(120));
requestFactory.setReadTimeout(Duration.ofSeconds(120));

// 配置默认HttpClient,规避兼容性问题
requestFactory.setHttpClient(HttpClients.createDefault());

var restClient = restClientBuilder
    .requestFactory(requestFactory)
    .baseUrl(url)
    .build();

方案3:升级Spring Boot版本

等待Spring Boot发布适配HttpClient 5.4的版本(如Spring Boot 3.4+),官方会修复底层兼容性问题,届时直接升级Spring Boot即可解决。

内容的提问来源于stack exchange,提问作者Sergei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:21:04