java非必传参数怎么处理_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": "爪哇笔记",

"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")

public Result register(@RequestBody Map map){

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

//业务逻辑

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

}

多参数无实体二

前端代码:

var param = {

"title": "爪哇笔记",

"content": "一个有趣的公众号",

"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(@RequestParam(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) {

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 等于这个值。

Submit

text/xml

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

小结

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值