@PostMapping注解中的consumes属性,用于指定该接口能够处理的请求的Content-Type(媒体类型)。当客户端发来的请求头Content-Type不匹配时,服务器会返回415 Unsupported Media Type错误。
你提到的consumes = "multipart/form-data",则明确告诉 Spring:这个接口只接收文件上传类的表单数据。
🎯 核心作用与验证机制
consumes的核心作用是媒体类型映射和过滤。Spring 会根据它来匹配请求,只有当请求的Content-Type与你指定的类型一致时,才会将请求派发到对应的方法。其验证逻辑是:
指定单一类型:
@PostMapping(consumes = "multipart/form-data"),要求请求头必须完全等于multipart/form-data。指定多种类型:
@PostMapping(consumes = {"multipart/form-data", "application/json"}),请求头满足其中任意一种即可。使用通配符:
@PostMapping(consumes = "multipart/*"),匹配所有multipart/子类型。
📤 文件上传场景:multipart/form-data
当你在表单中上传文件时,浏览器会自动将enctype设为multipart/form-data,这意味着请求体会被分割成多个部分(Part),每个表单字段都是一个独立的部分。在 Spring Boot 中,通常会配合@RequestPart来接收文件和数据。
java
@PostMapping(value = "/upload", consumes = "multipart/form-data") public String uploadFile( @RequestPart("file") MultipartFile file, @RequestPart("metadata") String metadata) { // file 包含文件数据,metadata 是普通 JSON 字符串 return "success"; }⚠️ 为何consumes不能完全信任?
关键点:consumes的匹配仅基于请求头Content-Type,但请求头是客户端可以随意构造的。因此,它并不能作为安全过滤手段,核心校验仍需在业务逻辑中完成。
📚 其他常用媒体类型
| 媒体类型 | consumes值 | 适用场景 |
|---|---|---|
| JSON | application/json | RESTful API,前后端分离最常用 |
| XML | application/xml | 旧系统或特定行业接口 |
| 表单提交 | application/x-www-form-urlencoded | 普通 HTML 表单,键值对格式 |
| 文件上传 | multipart/form-data | 文件上传,支持二进制数据 |
| 纯文本 | text/plain | 接收纯文本内容 |
💎 总结
consumes是 Spring MVC 中处理请求内容协商的重要机制。它能让你的接口职责更清晰,避免因Content-Type混乱而导致的错误。使用时要记住:它只负责路由匹配,不负责数据校验。