Spring Boot REST API未指定Content-Type:application/json时POST/PUT报错如何解决
问题解答
是否必须指定Content-Type: application/json请求头?
严格来说不是强制要求,但这是REST API的最佳实践,也是Spring Boot默认行为逻辑导致的:
- 当你用
@RequestBody注解接收JSON格式请求体时,Spring MVC需要通过Content-Type请求头选择对应的HttpMessageConverter(比如MappingJackson2HttpMessageConverter)来解析请求体。 - 如果没指定
Content-Type,Spring无法确定请求体格式,就会返回415 Unsupported Media Type错误。
如何在不指定该请求头时让接口正常工作?
可以通过配置Spring MVC,让它在请求无Content-Type时默认按JSON格式解析请求体,常用两种方式:
方式1:自定义消息转换器的默认媒体类型
创建Web配置类,修改MappingJackson2HttpMessageConverter的默认媒体类型,让它在无Content-Type时生效:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); // 设置默认媒体类型为application/json jsonConverter.setDefaultContentType(MediaType.APPLICATION_JSON); // 将转换器放到列表最前面,确保优先被使用 converters.add(0, jsonConverter); } }
方式2:通过@RequestMapping的consumes属性兼容多种情况
如果接口需要同时支持带和不带Content-Type的请求,可在注解中指定允许的媒体类型,包括*/*(匹配任意类型):
@PostMapping(value = "/your-api", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.ALL_VALUE}) public ResponseEntity<?> yourApi(@RequestBody YourDto dto) { // 接口业务逻辑 return ResponseEntity.ok(dto); }
这种配置下,只要请求体是合法JSON格式,即使没有Content-Type,Spring也会尝试用合适的转换器解析。
注意事项
虽然上述配置能解决问题,但仍建议要求客户端指定Content-Type: application/json——这符合HTTP协议规范,能避免请求体格式歧义导致的潜在问题,也让接口行为更清晰可控。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

