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

Spring Cloud Open Feign POST表单编码仅传首个键值对的解决方法

解决Feign Client POST form-url-encoded仅传首个参数的问题

问题原因

你在Feign接口中错误使用了@RequestBody注解处理form-url-encoded请求。@RequestBody用于绑定JSON格式的请求体,而form-url-encoded是键值对形式的请求参数,两者兼容冲突,导致只有第一个参数被解析。

解决方案

1. 修改Feign接口的参数注解

移除@RequestBody,改用@ModelAttribute修饰DTO参数(部分Feign版本可直接传递DTO,无需额外注解):

@FeignClient(
        name = "FeignServer",
        url = "url",
        configuration = FeignProxyConfiguration.class)
public interface ServerFeign {

    @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    ResponseEntity<String> sendCode(@ModelAttribute Dto dto);
}

2. 确保依赖正确引入

确认项目中已添加feign-form相关依赖(以Maven为例):

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version> <!-- 使用与Spring Cloud版本兼容的版本 -->
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.8.0</version>
</dependency>

3. 验证FormEncoder配置

你的FormEncoder配置是正确的,且已通过@FeignClient的configuration属性指定加载,无需修改:

@Bean
@Primary
@Scope(SCOPE_PROTOTYPE)
public FormEncoder feignFormEncoder() {
    return new FormEncoder(new SpringEncoder(this.messageConverters));
}

备选方案:逐个参数传递(适合参数少的场景)

若不想使用DTO,可直接用@RequestParam逐个声明参数:

@PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
ResponseEntity<String> sendCode(
    @RequestParam("val_n1") String valN1,
    @RequestParam("val_n2") String valN2,
    @RequestParam("val_n3") String valN3
);

验证

修改后重新发起请求,接收方即可获取到val_n1、val_n2、val_n3全部三个表单参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:12:27