了解

  • 对于 GET 方法,会将数据转换为 query string。例如 { name: ‘name’, age: 18 } 转换后的结果是 name=name&age=18。

  • 对于 POST 方法且 header[‘content-type’] 为 application/json 的数据,会进行 JSON 序列化。

  • 对于 POST 方法且 header[‘content-type’] 为 application/x-www-form-urlencoded 的数据,会将数据转换为 query string。

如果前端是 post 请求,后端直接指定请求字段,那么前端发送的需要 qs 包装一下
this.$qs.stringify({ acc: this.form.acc, pwd: this.form.pwd })

方法 1

1
2
3
4
5
6
7
8
9
@RequestMapping("/method01")
public String method01(String name, Integer age, Double mon) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setMoney(mon);
return JSON.toJSONString(user);
}

这种格式接收的是 method01?name=zhangsan&age=15&mon=20.0 格式的传参,并且要求参数名与 url 地址中携带的参数名完全一致;

这种形式传参与请求方式无关,get post .put 等皆可;

方法 2

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/method02")
public String method02(@RequestParam("name") String name,
@RequestParam("age") Integer age,
@RequestParam(value = "money", required = false) Double mon) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setMoney(mon);
return JSON.toJSONString(user);
}

方式原理上与第一种一致,都是接收请求 url 地址种的参数,所以与请求方式无关;

这种方式注解种的 value 值会去映射请求 url 中的同名参数取参然后赋值给加注解的形参,所以注解中的参数名必须与 url 中一致,而方法形参名可以根据自身需求灵活变更;

注意加此注解的 required 属性 默认为 true,也就是接收请求时会根据 value 去 url 寻找同名参数,如果没找到会报错;

所以如果有某一参数可能不传的情况,需要将 required 属性设为 false

方法 3

1
2
3
4
@RequestMapping(value = "/method03")
public String method03(@RequestBody User user) {
return JSON.toJSONString(user);
}

@RequestBody 则是接收请求体中的 JSON 字符串参数直接映射实体对象,所以 body 类型必须是 JSON 字符串

注意实体类中的属性名称必须与JOSN串中的参数 key 名称完全一致,不同命参数无法正确接收;;

Post 请求携带 body 参数

通常 get 请求通过 url 携带参数可以根据 url 作为 key 缓存资源,常用的静态资源服务器都是这种原理,如果参数在 body 中这种方式就失效了

方法 4

1
2
3
4
@RequestMapping(value = "/method04")
public String method04(User user) {
return JSON.toJSONString(user);
}

这种方式要求请求中的参数名与实体中的属性名一致即可自动映射到实体属性中;

支持 url 拼接的多个 params 传参

支持 post 请求 的 form 类型传参(form-data,x-www-form-urlencoded), 不支持 JSON 传参

方法 5

1
2
3
4
5
6
7
8
9
@RequestMapping("/method06")
public String method06(HttpServletRequest request) {
User user = new User();
user.setName(request.getParameter("name"));
user.setAge(Integer.valueOf(request.getParameter("age")));
user.setMoney(Double.parseDouble(request.getParameter("money")));
return JSON.toJSONString(user);
}

传统的接收参数方式,可以接收 url params 传参,支持 post from 类型传参,不支持 JSON 传参

注意如果请求中未传递指定名称的参数,取参时会报错

方法 6

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = {"/method07/{name}/{age}/{money}","/method07/{name}/{money}"})
public String method07(@PathVariable("name") String name,
@PathVariable(value = "age", required = false) Integer age,
@PathVariable("money") Double money) {
User user = new User();
user.setName(name);
user.setMoney(money);
user.setAge(age);
return JSON.toJSONString(user);
}

通过@PathVariable 实现 restFul 风格传参,直接将参数拼接到 url 地址中,支持 get,post,put delete 等多种请求

required 属性默认为 true ,不传递参数会报错;

如果出现某个参数未传递的情况可以通过设置 required 属性为 false 并设置多个 value 字符串的形式实现

方法 7

1
2
3
4
5
6
7
8
@GetMapping("/list")
@RequiresPermissions("sys:config:list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = sysConfigService.queryPage(params);

return R.ok().put("page", page);
}

方法 8

1
2
3
4
5
6
7
@GetMapping("/info/{id}")
@RequiresPermissions("sys:config:info")
public R info(@PathVariable("id") Long id){
SysConfigEntity config = sysConfigService.getById(id);

return R.ok().put("config", config);
}

方法 9

1
2
3
4
5
6
7
8
9
10
@SysLog("保存配置")
@PostMapping("/save")
@RequiresPermissions("sys:config:save")
public R save(@RequestBody SysConfigEntity config){
ValidatorUtils.validateEntity(config);

sysConfigService.saveConfig(config);

return R.ok();
}

方法 10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.7</version>
</dependency>


@PostMapping("/login")
public ResultVO loginHome(@RequestBody JSONObject obj) {
String userAcc = obj.getString("userAcc");
// List<String> ids = obj.getList("ids",String.class);
//// Date date = obj.getDate("date");
String userPwd = obj.getString("userPwd");
return indexService.login(userAcc, userPwd);
}