简介
说来惭愧,一直对 SpringBoot 的参数传递方式摸棱两可的,昨天看到了一篇博客,自己验证了下,记下来,彻底弄明白。
情景一:登录、注册
前端代码:
var param = {
"username": "coderyang",
"password": "123456"
}
$.ajax({
url: "/sys/login",
data: param,
type: "post",
success: function(data) {
}
});
后端代码:
- 方式一:没有封装实体类,直接通过参数名来匹配参数。
@PostMapping("/login")
public Result login(@RequestParam(value="username", required=true) String username,
@RequestParam(value="password", required=true) String password){
//业务逻辑 ...
return Result.ok("登录成功");
}
- 方式二:封装了实体类,直接通过一个实体接收所有参数。
@PostMapping("/register")
public Result register(SysUser user){
logger.info("{},用户注册",user.getUsername());
//业务逻辑。。。
return Result.ok("注册成功");
}
情景二:接收多个参数,无对应实体类(一)
前端代码:
var param = {
"title": "标题",
"content": "内容",
"author": "coderyang"
}
param = JSON.stringify(param);
$.ajax({
url: "/sys/multiParameter",
data: param,
type: "post",
contentType: "application/json",
success: function(data) {
}
});
后端代码:
@PostMapping("/multiParameter")
public Result register(@RequestBody Map<String,Object> map){
logger.info("多参数传递:{},{}",map.get("title"),map.get("content"));
//业务逻辑
return Result.ok("接收多参数成功");
}
情景三:接收多个参数,无对应实体类(二)
前端代码:
var param = {
"title": "标题",
"content": "内容",
"author": "coderyang"
}
$.ajax({
url: "/sys/multiParameter",
data: param,
type: "post",
contentType: "application/json",
success: function(data) {
}
});
后端代码:
@PostMapping("/multiParameter")
public Result register(@RequestParam Map<String,Object> map){
String title = map.get("title");
String content = map.get("content");
//业务逻辑。。。
return Result.ok("接收多参数成功");
}
情景四:接收数组
前端代码:
var param = {
"ids": [1, 2, 3]
}
$.ajax({
url: "/sys/array",
data: param,
type: "post",
success: function(data) {
}
});
后端代码:
@PostMapping("array")
public Result array(@RequestParam(value = "ids[]") Integer[] ids) {
List<Integer> list = Arrays.asList(ids);
//业务逻辑
return Result.ok();
}
情景五:接收集合
前端代码:
var param = {
"ids": [1, 2, 3]
}
$.ajax({
url: "/sys/array",
data: param,
type: "post",
success: function(data) {
}
});
后端代码:
@PostMapping("array")
public Result array(@RequestParam(value = "ids[]") List<Integer> ids) {
List<Integer> list = = ids;
//业务逻辑。。。
return Result.ok();
}
情景六:接收集合实体对象
前端代码:
var list = [];
list.push({
"username": "coderyang1号",
"mobile": "17762288888"
});
list.push({
"username": "coderyang2号",
"mobile": "17762289999"
});
$.ajax({
url: "/sys/listUser",
data: JSON.stringify(list),
type: "post",
contentType: "application/json",
success: function(data) {
}
});
后端代码:
@PostMapping("listUser")
public String listUser(@RequestBody List<SysUser> list) {
logger.info("数据{}", list.size());
list.forEach(user->{
//输出实体对象
System.out.println(user.getUsername());
});
//业务逻辑。。。
return "ok";
}
情景七:接收集合实体对象(一对多)
前端代码:
var roleList = [];
roleList.push({
"roleSign": "admin",
"roleName": "管理员"
});
roleList.push({
"roleSign": "user",
"roleName": "普通用户"
});
var list = [];
var user = {
"username": "coderyang",
"mobile": "1776228XXXX"
};
user.roleList = roleList;
list.push(user);
$.ajax({
url: "/sys/listUserRole",
data: JSON.stringify(list),
type: "post",
contentType: "application/json",
success: function(data) {
}
});
后端代码:
@PostMapping("listUserRole")
public String listUserRole(@RequestBody List<SysUser> list) {
list.forEach(user->{
List<SysRole> roleList = user.getRoleList();
roleList.forEach(role->{
System.out.println(role.getRoleName());
});
});
return "OK!";
}
情景八:接收复杂类型参数
传输对象有实体,有集合,有各种类型的数据,用 Key-value 格式的 Json 字符串传参,后台用 map 接收,然后用 FastJson 转换。
public Result register(@RequestParam Map<String,Object> map){
String user = map.get("user").toString();
SysUser sysUser = JSON.parseObject(user,SysUser.class);
String rules = parseMap.get("rules").toString();
List<Rule> ruleList = JSON.parseArray(rules, Rule.class);
}
情景九:RESTful 风格
@GetMapping("article/{id}")
public void article(@PathVariable("id") String id) {
//业务逻辑。。。
}
使用原则
- @RequestBody 注解,必须与 contentType 类型 application/json 配合使用。
- @RequestParam 注解,必须与 contentType 类型 application/x-www-form-urlencoded 配合使用,其为默认类型。
- JSON.stringify() 把对象类型转换为字符串类型,一般配合 @RequestBody 注解和 contentType 类型 application/json 使用。