@RequestBody、@PathVariable、@RequestParam三个注解用法与区别

@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("菜品添加成功");
    }

总结

  1. 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值
  2. 在GET请求中,可以使用@PathVariable和@RequestParam,但是不能使用
    @RequestBody,因为@RequestBody是在请求体中拿数据,而GET请求没有请求体
  3. 在POST请求中,@RequestBody接收的是json数据,@RequestParam接收的是form表单提交的数据
  4. 在一个方法中@PathVariable、@RequestParam可以使用多次,@RequestBody只能使用一次
  • 30
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值