Spring Boot获取application/x-www-form-urlencoded请求数据及报错解决
解决Spring Boot获取form-urlencoded请求数据的问题
你遇到的这个Unsupported Media Type错误,核心原因是:@RequestBody注解默认只支持JSON、XML这类格式的请求体绑定,它没办法直接把application/x-www-form-urlencoded(也就是表单URL编码格式)的数据绑定到Map上,所以才会报错。
下面给你几个简单好用的解决办法:
方法一:用@RequestParam接收参数
这是最直接的方式,不管是单个参数还是所有参数都能搞定:
接收所有参数到Map里
如果不确定参数有哪些,或者想一次性拿到所有表单参数,可以直接用@RequestParam Map<String, String>:
@PostMapping(value = "/res", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public Map<String, Object> postResponse(@RequestParam Map<String, String> params) { // params里就包含了所有表单键值对,直接用就行 return Collections.singletonMap("receivedParams", params); }
逐个接收指定参数
如果参数是固定的,也可以明确指定每个参数的名称,这样更清晰:
@PostMapping(value = "/res", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public Map<String, Object> postResponse(@RequestParam("name") String userName, @RequestParam("email") String userEmail) { Map<String, Object> result = new HashMap<>(); result.put("name", userName); result.put("email", userEmail); return result; }
方法二:用实体类接收参数
如果参数比较多,或者想让代码更规整,可以定义一个实体类来对应表单参数,Spring会自动帮你绑定数据:
第一步:定义实体类
记得要给字段加上getter和setter(或者用Lombok的@Data注解简化代码):
public class UserForm { private String name; private String email; private Integer age; // 生成getter和setter方法,或者用@Data注解替代 public String getName() { return name; } public void setName(String name) { this.name = name; } // 其他字段的getter/setter同理 }
第二步:控制器方法中使用实体类
直接把实体类作为方法参数就行,Spring会自动把表单参数映射到实体的对应字段上:
@PostMapping(value = "/res", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public Map<String, Object> postResponse(UserForm userForm) { Map<String, Object> result = new HashMap<>(); result.put("userName", userForm.getName()); result.put("userEmail", userForm.getEmail()); return result; }
额外说明:不推荐的复杂方式
如果非要用@RequestBody结合Map来接收,那需要自定义HttpMessageConverter并注册到Spring容器中,让它支持application/x-www-form-urlencoded格式到Map的转换。但这种方式配置繁琐,除非有特殊业务需求,否则完全没必要——前面两种方法足够解决问题。
内容的提问来源于stack exchange,提问作者user8765332
相关产品推荐
相关产品推荐

