Spring后端POST请求报错:不支持application/x-www-form-urlencoded类型
问题解决:Spring后端提示Content-Type不支持的处理方案
这个错误的核心原因是:你的Spring Controller方法默认期望接收application/json类型的请求体,但前端发送的是application/x-www-form-urlencoded(表单编码格式),两者不匹配导致报错。以下是两种直接可行的解决方式:
方案一:后端适配表单编码请求
如果需要保留前端的表单提交方式,可修改Controller的参数接收逻辑:
- 移除方法参数上的
@RequestBody注解,Spring会自动将表单参数绑定到DTO对象(要求DTO字段名与表单参数名完全一致) - 在
@PostMapping中显式声明支持的Content-Type
示例代码:
// 修改后的Controller方法 @PostMapping(value = "/board/writepro", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public ResponseEntity<?> writeBoard(BoardDto boardDto) { // 调用Service层保存逻辑 boardService.saveBoard(boardDto); return ResponseEntity.ok("发布成功"); }
注意:如果DTO包含嵌套对象,这种方式无法自动解析,建议改用方案二。
方案二:前端改为发送JSON格式(推荐)
RESTful接口更推荐使用JSON格式传递数据,只需调整前端请求配置:
在React的请求代码中,指定Content-Type为application/json,并将数据转为JSON字符串发送。
示例代码:
const submitBoard = async (formData) => { try { const res = await fetch('/board/writepro', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formData), }); const result = await res.json(); // 处理响应结果 } catch (err) { console.error('提交失败:', err); } };
此时后端Controller可保持原有@RequestBody的写法不变:
@PostMapping("/board/writepro") public ResponseEntity<?> writeBoard(@RequestBody BoardDto boardDto) { boardService.saveBoard(boardDto); return ResponseEntity.ok("发布成功"); }
额外注意事项
- 确保DTO类的字段名与前端传递的参数名一致,若有大小写差异可使用
@JsonProperty注解指定别名 - 检查全局配置是否禁用了表单编码或JSON的消息转换器
内容的提问来源于stack exchange,提问作者박진후
相关产品推荐
相关产品推荐

