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

