Feign使用@QueryMap传MultiValueMap报400缺失参数该如何修复?
问题根因
你当前的写法存在两处核心矛盾:
@QueryMap注解的作用是将参数全部拼接在请求URL的查询串中(即URL中?后面的部分),不属于请求体内容- 你接口声明了
consumes = MediaType.APPLICATION_JSON_VALUE,说明服务端期望接收JSON格式的请求体参数,会优先解析请求体内容,完全不会读取URL上的查询参数,自然识别不到你传入的entityId等参数。
对应修复方案
场景1:服务端要求参数以JSON格式放在请求体中
直接把@QueryMap替换为@RequestBody,不需要改动参数构造逻辑:
@FeignClient(name = "Staging", url = "https://test.com") public interface Client { @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) // 把@QueryMap改为@RequestBody,参数可以直接用MultiValueMap也可以转成普通Map SaleResponse performSaleTransaction(@RequestBody MultiValueMap<String, String> params); }
如果不需要同参数多值的场景,也可以在调用时转为单值Map传入:
client.performSaleTransaction(map.toSingleValueMap());
场景2:服务端要求参数以表单形式提交
如果服务端要求application/x-www-form-urlencoded格式的表单参数,修改consumes类型即可:
@FeignClient(name = "Staging", url = "https://test.com") public interface Client { @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) SaleResponse performSaleTransaction(@RequestBody MultiValueMap<String, String> params); }
场景3:服务端确实要求参数放在URL查询串中
需要移除consumes = MediaType.APPLICATION_JSON_VALUE的声明,同时如果你的Spring Cloud版本低于2020.0,Spring自带的@QueryMap默认不支持MultiValueMap,可以替换为Feign原生的@QueryMap注解:
import feign.QueryMap; @FeignClient(name = "Staging", url = "https://test.com") public interface Client { @RequestMapping(method = RequestMethod.POST) SaleResponse performSaleTransaction(@QueryMap MultiValueMap<String, String> params); }
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

