SpringBoot 设置传入参数非必要的操作

网友投稿 768 2023-02-08

SpringBoot 设置传入参数非必要的操作

SpringBoot 设置传入参数非必要的操作

我就废话不多说了,大家还是直接看代码吧~

设置参数是否为必要参数

@RequestParam(required = false)

补充:SpringBoot 开发案例之参数传递的正确姿势

前言

开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼。

姿势

学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么!

传递

用户登录

前端代码:

var param = {

"username": "admin",

"password": "admin"

}

$.ajax({

url: "/sys/login",

data: param,

type: "post",

dataType: "json",

success: function(data) {

}

});

后端代码:

@RestController

@RequestMapping("/sys")

public class LoginController {

private static final Logger logger = LoggerFactory.getLogger(LoginController.class);

/**

* 登录

*/

@PostMapping("/login")

public Result login(String username, String password){

logger.info("用户登录"+username);

//业务逻辑

return Result.ok("登录成功");

}

}

当然,你也可以这么实现,@RequestParam(value="username", required=true) ,required 默认为 true,如果前台不传递此参数,后台会报错。如果设置为 false,如果不传,默认为 null。

/**

* 登录

* https://blog.52itstyle.vip

*/

@PostMapping("/login")

public Result login(@RequestParam(value="username", required=true) String username,

@RequestParam(value="password", required=true) String password){

logger.info("用户登录"+username);

//业务逻辑

return Result.ok("登录成功");

}

用户注册

前端代码,提交方式与登录基本保持一致。

后端代码:

用一个对象来接收前台参数,一般后端有对应的实体类。

/**

* 注册

* https://blog.52itstyle.vip

*/

@PostMapping("/register")

public Result register(SysUser user){

logger.info("{},用户注册",user.getUsername());

//业务逻辑

return Result.ok("注册成功");

}

多参数无实体一

前端代码:

var param = {

"title": "爪哇笔记",

"author": "小柒2012"

}

param = JSON.stringify(param);

$.ajax({

url: "/sys/multiParameter",

data: param,

type: "post",

contentType: "application/json",

dataType: "json",

success: function(data) {

}

});

后端实现:

/**

* 多参数

* https://blog.52itstyle.vip

*/

@PostMapping("/multiParameter")

public Result register(@RequestBody Map map){

logger.info("多参数传递:{},{}",map.get("title"),map.get("content"));

//业务逻辑

return Result.ok("接收多参数成功");

}

多参数无实体二

前端代码:

var param = {

"title": "爪哇笔记",

"author": "小柒2012"

}

$.ajax({

url: "/sys/multiParameter",

data: param,

type: "post",

dataType: "json",

success: function(data) {

}

});

后端实现:

/**

* 多参数

* https://blog.52itstyle.vip

*/

@PostMapping("/multiParameter")

public Result register(@RequestParam Map map){

logger.info("多参数传递:{},{}",map.get("title"),map.get("content"));

//业务逻辑

return Result.ok("接收多参数成功");

}

传递数组

前端代码:

var param = {

"ids": [1, 2, 3]

}

$.ajax({

url: "/sys/array",

data: param,

type: "post",

dataType: "json",

success: function(data) {

}

});

后端实现:

/**

* 数组

* https://blog.52itstyle.vip

*/

@PostMapping("array")

public Result array(@RequestParam(value = "ids[]") Integer[] ids) {

logger.info("数据{}", Arrays.asList(ids));

//业务逻辑

return Result.ok();

}

传递集合

前端代码与传递数组保持一致。

后端实现:

/**

* 集合

* https://blog.52itstyle.vip

*/

@PostMapping("array")

public Result array(@RequestParamnXptZGIHJ(value = "ids[]") List ids) {

logger.info("数据{}", ids.toString());

//业务逻辑

return Result.ok();

}

传递集合实体对象

比如,后端想接收一个实体对象集合 List

前端代码:

var list = [];

list.push({

"username": "小柒2012",

"mobile": "17762288888"

});

list.push({

"username": "小柒2013",

"mobile": "17762289999"

});

$.ajax({

url: "/sys/listUser",

data: JSON.stringify(list),

type: "post",

contentType: "application/json",

dataType: "json",

success: function(data) {

}

});

后端代码:

/**

* 爪哇笔记

* https://blog.52itstyle.vip

*/

@PostMapping("listUser")

public Result listUser(@RequestBody List list) {

http:// logger.info("数据{}", list.size());

list.forEach(user->{

//输出实体对象

System.out.println(user.getUsername());

});

//业务逻辑

return Result.ok();

}

传递集合实体对象一对多

比如,一个用户有多个角色 List roleList

前端代码:

var roleList = [];

roleList.push({

"roleSign": "admin",

"roleName": "管理员"

});

roleList.push({

"roleSign": "user",

"roleName": "普通用户"

});

var list = [];

var user = {

"username": "小柒2012",

"mobile": "17762288888"

};

user.roleList = roleList;

list.push(user);

$.ajax({

url: "/sys/listUserRole",

data: JSON.stringify(list),

type: "post",

contentType: "application/json",

dataType: "json",

success: function(data) {

}

});

后端实现:

/**

* 爪哇笔记

* https://blog.52itstyle.vip

*/

@PostMapping("listUserRole")

public Result listUserRole(@RequestBody List list) {

logger.info("数据{}", list.size());

list.forEach(user->{

List roleList = user.getRoleList();

roleList.forEach(role->{

System.out.println(role.getRoleName());

});

});

return Result.ok();

}

炒鸡复杂

传输对象有实体,有集合,有各种类型的数据,这时候最简单的方式就是传递 Key-Value 结构的 JSON 字符串,后台 Map 类型接收,然后通过FastJson的 JSON.parseObject() 和 JSON.parseArray() 方法转化为对应的实体或者集合。

String user = parseMap.get("user").toString();

SysUser sysUser = JSON.parseObject(user,SysUser.class);

String contractClause = parseMap.get("rules").toString();

List ruleList = JSON.parseArray(contractClause,Rule.class);

RESTful 风格

比如,访问某篇文章:

/**

* 爪哇笔记

* https://blog.52itstyle.vip

*/

@GetMapping("article/{id}")

public void article(@PathVariable("id") String id) {

logger.info("文章{}",id);

//业务逻辑

}

原则

记住一下几点:

@RequestBody注解,必须与 contentType 类型application/json配合使用。

@RequestParam注解,必须与 contentType 类型application/x-www-form-urlencoded配合使用,其为默认类型。

JSON.stringify() 把对象类型转换为字符串类型,一般配合 @RequestBody注解和contentType 类型application/json使用。

扩展

在以上只涉及了两种 contentType 类型,其实还有两种常见的类型:

multipart/form-data

一般用于表单文件上传,必须让 form 的 enctype 等于这个值。

text/xml

做过微信支付的小伙伴一定会知道,微信就喜欢用这种方式,去年还发生过 XXE 漏洞,在解析XML文档时,解析器通过 ENTITY 扩展的功能,读取本地受保护的文件,并且使用扩展功能将受保护的文件发送到远程地址。

小结

不敢说是最完整的传参方案,但绝对敢保证是最正确的,因为所有的传参方式都经过 360 官方检验。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决IDEA克隆代码后在右下角没有git分支的问题
下一篇:网络安全与前端哪个好(网络安全和后端)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~