@RequestBody、@PathVariable、@RequestParam用法与区别
前言
在使用SpringMVC框架,特别是使用restful风格的时候,@RequestBody、@PathVariable、@RequestParam这三个注解老是搞不清用哪个,有点头大,记录一下。
1. @RequestParam
使用场景:@RequestParam用于接收url地址传参或表单传参
请求链接格式:
当URL地址上是“参数名称=参数值“”的时候,使用这个注解,如果是多个参数用&分隔
http://localhost:8080/dish?ids=1552978624443916290
具体使用:
- 如果页面传入的参数(请求链接上)和类中接收参数一致,不管是一个参数还是多个参数,@RequestParam注解可以省略
@DeleteMapping //这里不许要使用占位符
public R<String> delete(Long[] ids){ //ids参数名称和url地址上一致,可省略
//调用业务层写的删除方法
dishService.removeWithFlavor(ids);
return R.success("删除菜品成功");
}
- 如果页面传入的参数(请求链接上)和类中接收参数不一致,@RequestParam注解不可以省略,且需要使用注解value属性写上页面传入的参数名
@DeleteMapping //这里不需要使用占位符,
//id和url上的ids不一致
public R<String> delete(@RequestParam(value="ids") Long[] id){
//调用业务层写的删除方法
dishService.removeWithFlavor(ids);
return R.success("删除菜品成功");
}
2. @PathVariable
使用场景:@PathVariable用于接收路径参数,使用{参数名称}描述路径参数,这个注解可以实现url请求参数中的占位符到目标方法中参数的映射。
请求链接格式:
http://localhost:8080/dish/1552978624443916290/zhangsan
具体使用:
- 如果页面传入的参数(请求链接上)和类中接收参数不一致,需要使用注解value属性写上页面传入的参数名。
//需要使用占位符,可以不和方法参数中顺序一致,但是名称必须一致
@GetMapping("/{id}/{name}")
public R<DishDto> getById(@PathVariable Long id,@PathVariable("name") String username) {
DishDto dishDto = dishService.getByIdWithFlavor(id);
return R.success(dishDto);
}
- 如果页面传入的参数(请求链接上)和类中接收参数一致,value属性可以不写,但是@PathVariable注解不可省略,否则会导致报错
//需要使用占位符,可以不和方法参数中顺序一致,但是名称必须一致
@GetMapping("/{id}/{name}")
public R<DishDto> getById(@PathVariable Long id,@PathVariable String name) {
DishDto dishDto = dishService.getByIdWithFlavor(id);
return R.success(dishDto);
}
3.@RequestBody
使用场景: 用于接收json数据
json数据格式:
{
"name":"蛋炒饭",
"price":1000,
"code":"",
"image":"da9e1c70-fc32-4781-9510-a1c4ccd2ff59.jpg",
"description":"好吃又实惠",
"status":1,
"categoryId":"1397844357980663809",
//"categoryName":"豫菜",
"flavors":[
{
"name":"辣度",
"value":"[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]"
},
{
"name":"忌口",
"value":"[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]"
}
]
}
具体使用: 只要前台传过来的是json数据,必须加这个注解,否则会接收不到数据
@PostMapping
public R<String> save(@RequestBody DishDto dishDto) {
dishService.saveWithFlavor(dishDto);
return R.success("菜品添加成功");
}
总结
- url格式
- @RequestParam格式:http://localhost:8080/dish?ids=1552978624443916290
- @PathVariable格式:http://localhost:8080/dish/1552978624443916290/zhangsan
- @RequestBody格式:json数据
-
- 在后期开发中,发送请求参数超过1个时,以json格式为主,使用@RequestBody较多
- 如果发送非json格式数据,选用@RequestParam接收请求参数
- 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
- 在GET请求中,可以使用@PathVariable和@RequestParam,但是不能使用
@RequestBody,因为@RequestBody是在请求体中拿数据,而GET请求没有请求体 - 在POST请求中,@RequestBody接收的是json数据,@RequestParam接收的是form表单提交的数据
- 在一个方法中@PathVariable、@RequestParam可以使用多次,@RequestBody只能使用一次