spring boot (通过spring mvc) 提供了强大的机制来处理不同 content-type 的http请求体。这主要依赖于 httpmessageconverter 接口的各种实现,它们能够自动将请求体内容转换成java方法参数。
一、核心机制:httpmessageconverter
spring mvc会根据请求头中的 content-type 和controller方法参数的类型,选择一个合适的 httpmessageconverter 来执行数据转换。常见的转换器包括:
- mappingjackson2httpmessageconverter: 处理 application/json,将json数据绑定到pojo。
- formhttpmessageconverter: 处理 application/x-www-form-urlencoded,可以将表单数据绑定到pojo或 multivaluemap。
- jaxb2rootelementhttpmessageconverter: 处理 application/xml,将xml数据绑定到用jaxb注解的pojo。
- bytearrayhttpmessageconverter: 处理原始字节流,绑定到 byte[]。
- stringhttpmessageconverter: 处理纯文本,绑定到 string。
- standardservletmultipartresolver (配合相关转换器): 处理 multipart/form-data,通常用于文件上传,将文件部分绑定到 multipartfile。
二、按content-type处理详解
1. application/json
- 注解: @requestbody
- 目标类型: pojo (plain old java object)
- 示例:
// pojo // public class user { // private string username; // private string email; // // getters and setters // } @postmapping("/users") public user createuser(@requestbody user user) { // user 对象已从json填充 return userservice.save(user); }
说明: 请求体中的json字符串会被自动映射到 user 对象的字段。
2. application/x-www-form-urlencoded
- 方式一:使用 @requestparam 逐个接收
- 注解: @requestparam("paramname")
- 目标类型: 基本类型 (string, int, etc.)
- 示例:
@postmapping("/login") public string login(@requestparam string username, @requestparam string password) { // username 和 password 从表单数据填充 // ... }
- 方式二:直接绑定到pojo (无需 @requestbody)
- 目标类型: pojo
- 说明: 表单字段名需与pojo属性名匹配。
- 示例:
// pojo // public class registrationform { // private string username; // private string password; // // getters and setters // } @postmapping("/register") public string register(registrationform form) { // form 对象已从表单数据填充 // ... }
3. multipart/form-data (常用于文件上传)
- 注解: @requestparam 或 @requestpart
- 目标类型: multipartfile (用于文件), 其他表单字段可以是基本类型或pojo。
- 配置: 可能需要在 application.properties 中启用和配置multipart处理:
spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10mb spring.servlet.multipart.max-request-size=10mb
示例:
@postmapping("/upload/profile") public string uploadprofile(@requestparam("userid") long userid, @requestparam("image") multipartfile imagefile) throws ioexception { // userid 是普通表单字段 // imagefile 是上传的文件 string filename = imagefile.getoriginalfilename(); // ... 保存文件 ... return "file " + filename + " uploaded for user " + userid; } // 使用 @requestpart 处理复杂multipart (例如,一个部分是json) @postmapping("/upload/advanced") public string advancedupload(@requestpart("metadata") usermetadata metadata, // usermetadata 是一个pojo @requestpart("document") multipartfile document) { // metadata 从一个json part解析 // document 是文件 part // ... return "advanced upload successful."; }
4. text/plain
- 注解: @requestbody
- 目标类型: string
- 示例:
@postmapping("/logs") public void submitlog(@requestbody string logentry) { // logentry 包含请求体中的纯文本 system.out.println(logentry); }
5. application/xml
- 注解: @requestbody
- 目标类型: 用jaxb注解的pojo (e.g., @xmlrootelement)
- 依赖: 通常需要 jaxb-api 和实现 (如 org.glassfish.jaxb:jaxb-runtime)。spring boot的 spring-boot-starter-web 默认可能不直接包含完整的jaxb运行时,需要时可添加。
- 示例:
// pojo (用jaxb注解) // @xmlrootelement(name = "item") // public class item { // @xmlelement public string name; // @xmlelement public double price; // } @postmapping(value = "/items", consumes = "application/xml", produces = "application/xml") public item createitem(@requestbody item item) { // item 对象已从xml填充 return itemservice.save(item); }
6. application/octet-stream (或其他二进制数据)
- 注解: @requestbody
- 目标类型: byte[]
- 示例:
@postmapping(value = "/data", consumes = "application/octet-stream") public string processbinarydata(@requestbody byte[] data) { // data 包含原始二进制数据 system.out.println("received " + data.length + " bytes."); return "binary data processed."; }
或者直接使用 inputstream (通常不带 @requestbody):
@postmapping(value = "/data-stream", consumes = "application/octet-stream") public string processdatastream(inputstream inputstream) throws ioexception { // 手动从 inputstream 读取数据 // ... return "stream processed."; }
三、错误处理
如果请求的 content-type 不被支持,或者请求体格式错误(如无效的json),spring boot 通常会返回:
- http 415 unsupported media type: 如果没有httpmessageconverter能处理该 content-type。
- http 400 bad request: 如果选择的httpmessageconverter无法解析请求体 (例如,json语法错误)。
四、自定义与扩展
开发者可以注册自定义的 httpmessageconverter 来支持非标准或特定的数据格式,通过配置 webmvcconfigurer。
// @configuration // public class webconfig implements webmvcconfigurer { // @override // public void configuremessageconverters(list<httpmessageconverter<?>> converters) { // converters.add(new mycustommessageconverter()); // } // // @override // public void extendmessageconverters(list<httpmessageconverter<?>> converters) { // // 用来添加转换器,同时不影响默认注册的转换器 // // 或者调整已注册转换器的顺序 // } // }
理解这些机制对于构建健壮和灵活的spring boot api至关重要。
到此这篇关于spring boot controller 如何处理http请求体的文章就介绍到这了,更多相关spring boot controller http请求体内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论