在 Spring Boot 中,针对表单提交和请求体提交(如 JSON) 两种数据格式,服务器端有不同的接收和处理方式,
在 Spring Boot 中,针对表单提交和请求体提交(如 JSON) 两种数据格式,服务器端有不同的接收和处理方式,核心是通过注解和参数绑定机制实现自动解析。
**表单提交 (Form Submission):**主要用于浏览器向服务器发送数据,如用户登录、搜索等。数据被编码在请求体中,格式为 key=value,通过 application/x-www-form-urlencoded 或 multipart/form-data 类型的请求头告知服务器。
**请求体提交 (Body Submission):**是现代 API 交互(如 RESTful)的标准方式。客户端(如 App、前端 JS)将数据(通常是 JSON 格式)直接放入请求体中,通过 application/json 等类型的请求头告知服务器。
一、接收表单提交数据(application/x-www-form-urlencoded 或 multipart/form-data)
表单提交的数据以键值对形式存在,Spring Boot 主要通过以下方式接收:
1. 简单参数接收(直接绑定到方法参数)
适用于参数较少的场景,使用 @RequestParam 注解(可省略):
@PostMapping("/form/simple")
public String handleSimpleForm(// @RequestParam 可省略,默认按参数名匹配@RequestParam String username,@RequestParam Integer age,// 可选参数,设置默认值@RequestParam(defaultValue = "male") String gender
) {return "接收表单数据:username=" + username + ", age=" + age + ", gender=" + gender;
}
2. 实体类接收(参数较多时推荐)
将表单字段映射到实体类的属性(属性名需与表单字段名一致):
java
运行
// 定义实体类
public class UserForm {private String username;private Integer age;private String gender;// getter/setter
}
// 控制器接收
@PostMapping("/form/entity")
public String handleEntityForm(UserForm user) {return "接收表单实体:" + user.getUsername() + ", " + user.getAge();
}
3. 接收文件(multipart/form-data 格式)
用于文件上传,需使用 @RequestParam(“file”) MultipartFile 接收:
@PostMapping("/form/upload")
public String handleFileUpload(@RequestParam String description, // 普通字段@RequestParam("file") MultipartFile file // 文件字段
) throws IOException {// 保存文件到本地String filename = file.getOriginalFilename();file.transferTo(new File("upload/" + filename));return "文件上传成功:" + description + ",文件名:" + filename;
}
注意:默认情况下,Spring Boot 对文件大小有限制(默认单文件 1MB,总文件 10MB),可在 application.properties 中修改:
properties
单文件大小限制
spring.servlet.multipart.max-file-size=10MB
总文件大小限制
spring.servlet.multipart.max-request-size=100MB
二、接收请求体提交数据(如 application/json)
请求体提交的 JSON 数据需要绑定到实体类,核心是使用 @RequestBody 注解:
- 基本用法(绑定到实体类)
// 定义接收 JSON 的实体类
public class UserJson {private String name;private Integer age;private List<String> hobbies; // 支持数组/集合类型// getter/setter
}
// 控制器接收 JSON 数据
@PostMapping("/body/json")
public String handleJsonBody(@RequestBody UserJson user) {return "接收 JSON 数据:name=" + user.getName() + ", hobbies=" + user.getHobbies();
}
- 复杂 JSON 结构(嵌套对象)
如果 JSON 包含嵌套对象,实体类也需对应嵌套结构:
json
// 客户端发送的 JSON
{"name": "张三","address": {"province": "广东","city": "深圳"}
}
对应的实体类定义:
public class UserJson {private String name;private Address address; // 嵌套对象// getter/setter// 内部类或独立类均可public static class Address {private String province;private String city;// getter/setter}
}
// 控制器接收方式不变
@PostMapping("/body/nested")
public String handleNestedJson(@RequestBody UserJson user) {return "省份:" + user.getAddress().getProvince();
}
- 接收纯文本或其他格式
如果请求体是纯文本(text/plain),可直接绑定到 String:
@PostMapping(value = "/body/text", consumes = "text/plain")
public String handleTextBody(@RequestBody String text) {return "接收文本:" + text;
}
三、核心区别与原理
维度 表单提交(x-www-form-urlencoded) 请求体提交(application/json)
注解 无需特殊注解(或 @RequestParam) 必须使用 @RequestBody
数据来源 请求体中的键值对(或 URL query 参数) 请求体中的原始 JSON 字符串
解析方式 Spring 自动按名称映射到参数 / 实体属性 Spring 通过 HttpMessageConverter 解析 JSON 为实体(默认使用 Jackson)
支持的数据结构 仅支持扁平键值对(不支持嵌套对象) 支持任意复杂结构(嵌套对象、数组等)
四、常见问题与解决方案
参数名不匹配
表单提交:使用 @RequestParam(“表单字段名”) 映射,例如 @RequestParam(“user_name”) String username。
JSON 提交:在实体类属性上用 @JsonProperty(“json字段名”) 映射,例如:
public class UserJson {@JsonProperty("user_name") // 对应 JSON 中的 "user_name"private String username;
}
日期格式转换
表单提交:通过 @DateTimeFormat(pattern = “yyyy-MM-dd”) 注解转换,例如:
public class UserForm {@DateTimeFormat(pattern = "yyyy-MM-dd")private LocalDate birthday;
}
JSON 提交:通过 @JsonFormat 注解指定格式,例如:
public class UserJson {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;
}
400 错误(参数解析失败)
检查参数类型是否匹配(如表单提交的字符串无法转为数字)。
检查 JSON 格式是否正确(如缺少引号、逗号)。
检查实体类是否有默认构造函数(JSON 解析需要)。
通过上述方式,Spring Boot 能灵活处理两种主流的 HTTP 数据提交格式,开发者只需根据前端提交的 Content-Type 选择对应的接收方式即可。