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

为何Spring RestClient设置SimpleClientHttpRequestFactory可解决404错误?

问题:Spring Http Interface + RestClient 切换请求工厂后404问题消失的原因及工厂差异

场景复现代码

@Bean("rest-client-builder")
public RestClient.Builder globalRestClientBuilder() {
    return RestClient.builder();
}

@Bean("device-rest-client")
RestClient restClient(@Qualifier("rest-client-builder") RestClient.Builder builder) {
    return builder.baseUrl("http://127.0.0.1:8585").build();
}

@Bean(name = "deviceCredentialsRestClient")
DeviceCredentialsRestInterface provideDeviceCredentialsRestClient(
        @Qualifier("device-rest-client") RestClient restClient
) {
    RestClientAdapter adapter = RestClientAdapter.create(restClient);
    HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
    return factory.createClient(DeviceCredentialsRestInterface.class);
}

问题现象

未显式配置requestFactory时,RestClient默认使用HttpComponentsClientHttpRequestFactory,发起请求后返回404 [no body]错误;显式设置requestFactory为SimpleClientHttpRequestFactory后,请求正常返回结果。


现象原因分析

最核心的原因是两个请求工厂对URI路径的拼接、规范化处理逻辑不同:

  • 当RestClient配置的baseUrl(如示例中的http://127.0.0.1:8585)与DeviceCredentialsRestInterface中方法注解的路径(如@GetMapping("/api/xxx"))组合时,HttpComponentsClientHttpRequestFactory会严格遵循URI标准规则处理路径,若两者的路径格式(如末尾/开头是否带斜杠)不匹配,可能生成错误的请求路径(比如重复斜杠、路径截断等),导致目标服务返回404。
  • 而SimpleClientHttpRequestFactory的路径处理逻辑更简单直接,对路径格式的兼容性更强,能正确拼接出符合目标服务预期的请求路径,因此请求成功。

除此之外,也可能存在次要因素:比如HttpComponents对某些请求头的默认处理(如Content-Length、Transfer-Encoding)与目标服务要求不兼容,或者请求体的编码/传输方式存在差异,但路径拼接问题是此类场景下最常见的诱因。

两个请求工厂的核心区别

  • 底层依赖与定位

    • HttpComponentsClientHttpRequestFactory:基于Apache HttpComponents HttpClient库实现,是Spring提供的增强型HTTP客户端工厂,适合需要高级HTTP特性的场景。
    • SimpleClientHttpRequestFactory:基于JDK原生的HttpURLConnection实现,是轻量级基础HTTP客户端工厂,无额外依赖,仅满足基础HTTP请求需求。
  • 功能特性差异

    • HttpComponents支持连接池管理、精细的超时配置(连接超时、读取超时、连接请求超时)、HTTPS自定义配置(如自定义SSL上下文)、请求重试机制、代理配置等高级功能。
    • SimpleClientHttpRequestFactory仅支持基础的超时配置,无连接池,不支持上述高级特性。
  • URI处理逻辑

    • HttpComponents严格遵循URI规范进行路径解析、拼接与规范化,对不符合规范的路径组合容错性低。
    • SimpleClientHttpRequestFactory采用更宽松的路径拼接逻辑,对非标准的路径格式兼容性更好。
  • 性能与资源占用

    • HttpComponents的连接池可以复用HTTP连接,减少TCP握手开销,高并发场景下性能更优,但会占用一定内存资源维护连接池。
    • SimpleClientHttpRequestFactory每次请求创建新连接,低并发场景下足够使用,但高并发时性能较差,资源开销波动大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:33:16