SpringBoot 设置传入参数非必要的操作
我就废话不多说了,大家还是直接看代码吧~
设置参数是否为必要参数
@RequestParam(required=false)
补充:SpringBoot开发案例之参数传递的正确姿势
前言
开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼。
姿势
学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么!
传递
用户登录
前端代码:
varparam={
"username":"admin",
"password":"admin"
}
$.ajax({
url:"/sys/login",
data:param,
type:"post",
dataType:"json",
success:function(data){
}
});
后端代码:
@RestController
@RequestMapping("/sys")
publicclassLoginController{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(LoginController.class);
/**
*登录
*/
@PostMapping("/login")
publicResultlogin(Stringusername,Stringpassword){
logger.info("用户登录"+username);
//业务逻辑
returnResult.ok("登录成功");
}
}
当然,你也可以这么实现,@RequestParam(value="username",required=true),required默认为true,如果前台不传递此参数,后台会报错。如果设置为false,如果不传,默认为null。
/**
*登录
*https://blog.52itstyle.vip
*/
@PostMapping("/login")
publicResultlogin(@RequestParam(value="username",required=true)Stringusername,
@RequestParam(value="password",required=true)Stringpassword){
logger.info("用户登录"+username);
//业务逻辑
returnResult.ok("登录成功");
}
用户注册
前端代码,提交方式与登录基本保持一致。
后端代码:
用一个对象来接收前台参数,一般后端有对应的实体类。
/**
*注册
*https://blog.52itstyle.vip
*/
@PostMapping("/register")
publicResultregister(SysUseruser){
logger.info("{},用户注册",user.getUsername());
//业务逻辑
returnResult.ok("注册成功");
}
多参数无实体一
前端代码:
varparam={
"title":"爪哇笔记",
"content":"一个有趣的公众号",
"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")
publicResultregister(@RequestBodyMapmap){
logger.info("多参数传递:{},{}",map.get("title"),map.get("content"));
//业务逻辑
returnResult.ok("接收多参数成功");
}
多参数无实体二
前端代码:
varparam={
"title":"爪哇笔记",
"content":"一个有趣的公众号",
"author":"小柒2012"
}
$.ajax({
url:"/sys/multiParameter",
data:param,
type:"post",
dataType:"json",
success:function(data){
}
});
后端实现:
/**
*多参数
*https://blog.52itstyle.vip
*/
@PostMapping("/multiParameter")
publicResultregister(@RequestParamMapmap){
logger.info("多参数传递:{},{}",map.get("title"),map.get("content"));
//业务逻辑
returnResult.ok("接收多参数成功");
}
传递数组
前端代码:
varparam={
"ids":[1,2,3]
}
$.ajax({
url:"/sys/array",
data:param,
type:"post",
dataType:"json",
success:function(data){
}
});
后端实现:
/**
*数组
*https://blog.52itstyle.vip
*/
@PostMapping("array")
publicResultarray(@RequestParam(value="ids[]")Integer[]ids){
logger.info("数据{}",Arrays.asList(ids));
//业务逻辑
returnResult.ok();
}
传递集合
前端代码与传递数组保持一致。
后端实现:
/**
*集合
*https://blog.52itstyle.vip
*/
@PostMapping("array")
publicResultarray(@RequestParam(value="ids[]")Listids){
logger.info("数据{}",ids.toString());
//业务逻辑
returnResult.ok();
}
传递集合实体对象
比如,后端想接收一个实体对象集合List
前端代码:
varlist=[];
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")
publicResultlistUser(@RequestBodyListlist){
logger.info("数据{}",list.size());
list.forEach(user->{
//输出实体对象
System.out.println(user.getUsername());
});
//业务逻辑
returnResult.ok();
}
传递集合实体对象一对多
比如,一个用户有多个角色List
前端代码:
varroleList=[];
roleList.push({
"roleSign":"admin",
"roleName":"管理员"
});
roleList.push({
"roleSign":"user",
"roleName":"普通用户"
});
varlist=[];
varuser={
"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")
publicResultlistUserRole(@RequestBodyListlist){
logger.info("数据{}",list.size());
list.forEach(user->{
ListroleList=user.getRoleList();
roleList.forEach(role->{
System.out.println(role.getRoleName());
});
});
returnResult.ok();
}
炒鸡复杂
传输对象有实体,有集合,有各种类型的数据,这时候最简单的方式就是传递Key-Value结构的JSON字符串,后台Map类型接收,然后通过FastJson的JSON.parseObject()和JSON.parseArray()方法转化为对应的实体或者集合。
Stringuser=parseMap.get("user").toString();
SysUsersysUser=JSON.parseObject(user,SysUser.class);
StringcontractClause=parseMap.get("rules").toString();
ListruleList=JSON.parseArray(contractClause,Rule.class);
RESTful风格
比如,访问某篇文章:
/**
*爪哇笔记
*https://blog.52itstyle.vip
*/
@GetMapping("article/{id}")
publicvoidarticle(@PathVariable("id")Stringid){
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等于这个值。
Submit
text/xml
做过微信支付的小伙伴一定会知道,微信就喜欢用这种方式,去年还发生过XXE漏洞,在解析XML文档时,解析器通过ENTITY扩展的功能,读取本地受保护的文件,并且使用扩展功能将受保护的文件发送到远程地址。
小结
不敢说是最完整的传参方案,但绝对敢保证是最正确的,因为所有的传参方式都经过360°官方检验。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。