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

Feign发送无请求体GET请求时Content-Length设为0,如何移除?

解决Feign + Apache HttpClient5发送GET请求时多余的Content-Length:0请求头问题

问题描述

我使用以下Feign客户端代码向ALB前置的端点发起请求:

Feign.builder()
        .logger(Slf4jLogger(MyApi::class.java))
        .logLevel(feign.Logger.Level.FULL)
        .encoder(JacksonEncoder(objectMapper))
        .decoder(JacksonDecoder(objectMapper))
        .requestInterceptor { template -> template.header("X-Api-Key", apiKey) }
        .client(ApacheHttp5Client())
        .target(Target.HardCodedTarget(MyApi::class.java, apiUrl))

通过该客户端发送无请求体的GET请求到/api/service/account/xxxx时,接收端发现请求带有值为0的Content-Length请求头,这不符合RFC7230规范。当前使用版本为Feign 12.3、HttpClient5 5.2.1,需要移除这个多余的请求头。

解决方案

方案一:添加Feign请求拦截器针对性移除

在现有请求拦截器之后新增一个拦截器,判断请求方法为GET时直接移除Content-Length头:

Feign.builder()
        .logger(Slf4jLogger(MyApi::class.java))
        .logLevel(feign.Logger.Level.FULL)
        .encoder(JacksonEncoder(objectMapper))
        .decoder(JacksonDecoder(objectMapper))
        .requestInterceptor { template -> template.header("X-Api-Key", apiKey) }
        // 新增拦截器处理Content-Length
        .requestInterceptor { template ->
            if ("GET".equals(template.method(), ignoreCase = true)) {
                template.removeHeader("Content-Length")
            }
        }
        .client(ApacheHttp5Client())
        .target(Target.HardCodedTarget(MyApi::class.java, apiUrl))

方案二:配置Apache HttpClient5禁用自动添加Content-Length:0

HttpClient5默认会为无请求体的请求自动添加Content-Length:0,可以通过配置客户端关闭这个行为:

// 配置HttpClient5,禁用自动添加Content-Length头
val httpClient = HttpClients.custom()
        .setRequestConfig(RequestConfig.custom()
                .setContentLengthHeaderDisabled(true)
                .build())
        .build()

// 使用配置后的HttpClient构建Feign客户端
Feign.builder()
        .logger(Slf4jLogger(MyApi::class.java))
        .logLevel(feign.Logger.Level.FULL)
        .encoder(JacksonEncoder(objectMapper))
        .decoder(JacksonDecoder(objectMapper))
        .requestInterceptor { template -> template.header("X-Api-Key", apiKey) }
        .client(ApacheHttp5Client(httpClient))
        .target(Target.HardCodedTarget(MyApi::class.java, apiUrl))

方案三:检查Feign接口定义是否有误

确认MyApi接口中对应的GET方法没有错误声明请求体参数(比如误用@RequestBody注解),如果接口定义错误,Feign会误以为需要发送请求体,从而触发Content-Length头的添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:49:57