• 一文解读如何应用 REST 对资源进行访问?



    一、REST 简介

    REST (Representational State Transfer) ,表现形式状态转换

    描述传统风格REST风格
    查询用户http://localhost/user/getById?id=1http://localhost/user/1
    保存用户http://localhost/user/saveUserhttp://localhost/user

    优点:书写简化;隐藏资源的访问行为,无法通过地址得知对资源是何种操作

    按照 REST 风格访问资源时使用 行为动作 区分对资源进行了何种操作。

    描述访问路径方式
    查询全部用户信息http://localhost/usersGET (查询)
    查询指定用户信息http://localhost/users/1GET (查询)
    添加用户信息http://localhost/usersPOST(新增/保存)
    修改用户信息http://localhost/usersPUT(修改/更新)
    删除用户信息http://localhost/users/1DELETE (删除)

    注:① 上述行为是约定方式,约定不是规范,可以打破,所以称 REST 风格,而不是 REST 规范。
         ② 描述模块的名称通常使用复数,也就是加 s 的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…

    根据 REST 风格对资源进行访问称为 RESTFUL。


    二、涉及注解

    2.1 @RequestMapping

    • 类型方法注解
    • 位置:SpringMVC 控制器上方、控制器方法上方
    • 作用:设置当前控制器方法请求访问路径
    • 属性value (默认):请求访问路径
          method :http 请求动作,标准动作(GET/POST/PUT/DELETE)
    • 举例
      @RequestMapping(value = "/users", method = RequestMethod.POST)
      @ResponseBody
      public String save(@RequestBody User user){
          System.out.println("user save ... " + user);
          return "{'module':'user save'}";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    2.2 @PathVariable

    • 类型方形参注解
    • 位置:SpringMVC 控制器方法形参定义前面
    • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
    • 举例
      @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
      @ResponseBody
      public String delete(@PathVariable Integer id){
          System.out.println("user delete ... " + id);
          return "{'module':'user delete'}";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    2.3 @RestController

    • 类型类注解
    • 位置:SpringMVC 控制器定义上方
    • 作用设置当前控制器类为 RESTFUL 风格,等同于 @Controller 与 @ResponseBody 两个注解组合功能
    • 举例
      @RestController
      @RequestMapping("/users")
      public class UserController2 {
      	...
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

    2.4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

    • 类型方法注解
    • 位置:SpringMVC 的 RESTFUL 开发的控制器方法定义上方
    • 作用:设置当前控制器方法 请求访问路径与请求动作,每种对应一个请求动作。
    • 举例:GetMapping 对应 GET请求
      @GetMapping("/{id}")
      public String getById(@PathVariable Integer id){
          System.out.println("user getById ... " + id);
          return "{'module':'user getById'}";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

    注: @GetMapping(“/{id}”) 的作用相当于 @RequestMapping(value = “/{id}”, method = RequestMethod.GET)(当注解里面要定义两个属性时,value 这个属性名要写出来),其余注解同理。


    补充:@PathVariable、@RequestBody、@RequestParam 区别与应用

    • 区别:① @RequestParam 用于接收 url 地址传参或表单传参
         ② @RequestBody 用于接收 json 数据
         ③ @PathVariable 用于接收路径参数,使用(参数名称)描述路径参数
    • 应用:① 当请求参数数量较少时,可以采用 @Pathvariable 接收请求路径变量,通常用于传递 id 值。
         ② 当请求参数超过 1 个时,以 json 格式为主,通常使用 @RequestBody。
         ③ 如果发送非 json 格式数据,选用 @RequestParam 接收请求参数。

    三、REST风格案例

    REST 风格案例1:

    @Controller
    public class UserController {
    
        @RequestMapping(value = "/users", method = RequestMethod.POST)
        @ResponseBody // 返回 json 形式
        public String save(@RequestBody User user){
            System.out.println("user save ... " + user);
            return "{'module':'user save'}";
        }
    
        @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
        @ResponseBody
        public String delete(@PathVariable Integer id){
            System.out.println("user delete ... " + id);
            return "{'module':'user delete'}";
        }
    
        @RequestMapping(value = "/users", method = RequestMethod.PUT)
        @ResponseBody
        public String update(@RequestBody User user){
            System.out.println("user update ... " + user);
            return "{'module':'user update'}";
        }
    
        @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
        @ResponseBody
        public String getById(@PathVariable Integer id){
            System.out.println("user getById ... " + id);
            return "{'module':'user getById'}";
        }
    
        @RequestMapping(value = "/users", method = RequestMethod.GET)
        @ResponseBody
        public String getAll(){
            System.out.println("user getAll");
            return "{'module':'user getAll'}";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    基于案例1的改造:

    @RestController
    @RequestMapping("/users")
    public class UserController2 {
    
        //@RequestMapping(value = "/users", method = RequestMethod.POST)
        @PostMapping
        public String save(@RequestBody User user){
            System.out.println("user save ... " + user);
            return "{'module':'user save'}";
        }
    
        //@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
        @DeleteMapping("/{id}")
        public String delete(@PathVariable Integer id){
            System.out.println("user delete ... " + id);
            return "{'module':'user delete'}";
        }
    
        //@RequestMapping(value = "/users", method = RequestMethod.PUT)
        @PutMapping
        public String update(@RequestBody User user){
            System.out.println("user update ... " + user);
            return "{'module':'user update'}";
        }
    
        //@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
        @GetMapping("/{id}")
        public String getById(@PathVariable Integer id){
            System.out.println("user getById ... " + id);
            return "{'module':'user getById'}";
        }
    
        //@RequestMapping(value = "/users", method = RequestMethod.GET)
        @GetMapping
        public String getAll(){
            System.out.println("user getAll");
            return "{'module':'user getAll'}";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    参考链接:黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)

  • 相关阅读:
    redis高可用的哨兵模式实现
    C#中的事件聚合器实现方法
    【RTAB-Map】
    Git如何上传代码至GitHub
    集成学习-树模型
    获取dom元素
    HTML5-画布使用教程
    解决mysql去掉字段空格:中间空格,左侧空格,右侧空格,两端空格,水平制表符(tab键或者\t)空格,换行键(\n)空格,回车键(Enter键)空格
    Vue3留言墙项目——头部和底部静态页面搭建
    【超硬核】-1万字详尽大厂团队SQL开发规范,Review没人能笑着出来
  • 原文地址:https://blog.csdn.net/weixin_43819566/article/details/133846008