SpringBoot 参数传递的几种方式

简介

说来惭愧,一直对 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 使用。

参考文档

发布了35 篇原创文章 · 获赞 52 · 访问量 1294

猜你喜欢

转载自blog.csdn.net/weixin_40242806/article/details/104345223