Spring POST接口接收x-www-form-urlencoded报415错误排查
问题原因及解决方案
问题根源
你用@RequestBody注解接收application/x-www-form-urlencoded格式的请求体是错误用法。Spring中@RequestBody负责读取请求体原始内容,并通过对应HttpMessageConverter转换为目标对象,但默认情况下Spring没有提供将x-www-form-urlencoded键值对直接转为自定义对象(如你的FilterObj)的转换器,因此返回415 Unsupported Media Type错误。
x-www-form-urlencoded本质是键值对参数,需要用Spring的参数绑定机制处理,而非@RequestBody的请求体解析机制。
解决方案
将@RequestBody替换为@ModelAttribute(或直接省略注解,Spring会默认用@ModelAttribute做参数绑定),修改后的控制器代码如下:
@PostMapping(value = "/v1/contracts", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<Object> fetchFilteredContracts( @ModelAttribute FilterObj body, @RequestParam(required = false) String number, @RequestParam(required = false) String supplierNumber ) { List<DataTableFilter.ColumnFilter> columnFilters = new ArrayList<>(); if (number != null) { columnFilters.add(new DataTableFilter.ColumnFilter("number", number)); } if (supplierNumber != null) { columnFilters.add(new DataTableFilter.ColumnFilter("supplierNumber", supplierNumber)); } // Additional code not implemented yet return new ResponseEntity<>(HttpStatus.OK); }
也可以直接省略注解,写法如下(效果完全一致):
public ResponseEntity<Object> fetchFilteredContracts( FilterObj body, @RequestParam(required = false) String number, @RequestParam(required = false) String supplierNumber ) { // ... 原有逻辑不变 }
额外注意事项
确保Postman请求配置正确:
- 请求方法选择POST
- 请求头
Content-Type设置为application/x-www-form-urlencoded - Body选项卡选择
x-www-form-urlencoded类型,添加search_mode参数及对应值
内容的提问来源于stack exchange,提问作者BluePrint
相关产品推荐
相关产品推荐

