升级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
相关产品推荐
相关产品推荐

