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->{ List roleList=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。