• Spring MVC——Rest风格


    REST(Representational State Transfer)

    • 当我们想表示一个网络资源的时候,可以使用两种方式:
      我们分别用查询id为1的用户信息保存用户信息举例
    • 传统风格资源描述形式
      • http://localhost/user/getById?id=1
      • http://localhost/user/saveUser
    • REST风格描述形式
      • http://localhost/user/1
      • http://localhost/user

    对比很明显吧,传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为我们可以通过读取请求url地址,就大概知道该url实现的是一个什么样的操作。而REST风格的描述,请求地址变的简单了,并且光看请求URL并不能猜出来该URL的具体功能,总结一下无非两个优点:

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

    随之而来我们又有了一个新的问题,一个相同的url地址即可以是新增也可以是修改或者查询,那么到底我们该如何区分该请求到底是什么操作。

    • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
      • http://localhost/users 查询全部用户信息 GET(查询)
      • http://localhost/users/1 查询指定用户信息 GET(查询)
      • http://localhost/users 添加用户信息 POST(新增/保存)
      • http://localhost/users 修改用户信息 PUT(修改/更新)
      • http://localhost/users/1 删除用户信息 DELETE(删除)

    请求的方式比较多,但是比较常用的就4种,分别是GET:用来做查询,POST:用来做新增,PUT:用来做修改,DELETE:用来做删除。

    注意注意注意注意

    • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
      • REST提供了对应的架构方式,按照这种架构设计项目可以降低开发的复杂性,提高系统的可伸缩性
      • REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除,但是我们如果非要用GET请求做删除,这点在程序上运行是可以实现的
    • 但是如果绝大多数人都遵循这种风格,你写的代码让别人读起来就有点莫名其妙了。
    • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts…

    既然清楚了什么是REST风格后,现在我们提一个新的概念RESTful根据REST风格对资源进行访问称为RESTful

    对比一下请求吧一个是放在页面url路径里,一个是使用一些请求参数方法修改
    在这里插入图片描述

    名称@PathVariable
    类型形参注解
    位置SpringMVC控制器方法形参定义前面
    作用绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

    关于接收参数,三个注解@RequestBody@RequestParam@PathVariable

    • 区别
      • @RequestParam用于接收url地址传参或表单传参
      • @RequestBody用于接收json数据
      • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
    • 应用
      • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
      • 如果发送非json格式数据,选用@RequestParam接收请求参数
      • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

    其实我们实际开发REST风格并没有这么繁琐,我们看个例子就很明显了:

    package com.taro.controller;
    
    import com.taro.domain.Book;
    import org.springframework.web.bind.annotation.*;
    
    //@Controller
    //@ResponseBody配置在类上可以简化配置,表示设置当前每个方法的返回值都作为响应体
    //@ResponseBody
    @RestController     //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
    @RequestMapping("/books")
    public class BookController {
    
    //    @RequestMapping( method = RequestMethod.POST)
        @PostMapping        //使用@PostMapping简化Post请求方法对应的映射配置
        public String save(@RequestBody Book book){
            System.out.println("book save..." + book);
            return "{'module':'book save'}";
        }
    
    //    @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)
        @DeleteMapping("/{id}")     //使用@DeleteMapping简化DELETE请求方法对应的映射配置
        public String delete(@PathVariable Integer id){
            System.out.println("book delete..." + id);
            return "{'module':'book delete'}";
        }
    
    //    @RequestMapping(method = RequestMethod.PUT)
        @PutMapping         //使用@PutMapping简化Put请求方法对应的映射配置
        public String update(@RequestBody Book book){
            System.out.println("book update..."+book);
            return "{'module':'book update'}";
        }
    
    //    @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)
        @GetMapping("/{id}")    //使用@GetMapping简化GET请求方法对应的映射配置
        public String getById(@PathVariable Integer id){
            System.out.println("book getById..."+id);
            return "{'module':'book getById'}";
        }
    
    //    @RequestMapping(method = RequestMethod.GET)
        @GetMapping             //使用@GetMapping简化GET请求方法对应的映射配置
        public String getAll(){
            System.out.println("book getAll...");
            return "{'module':'book 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
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    名称@RestController
    类型类注解
    位置基于SpringMVC的RESTful开发控制器类定义上方
    作用设置当前控制器类为RESTful风格,
    等同于@Controller与@ResponseBody两个注解组合功能
    名称@GetMapping @PostMapping @PutMapping @DeleteMapping
    类型方法注解
    位置基于SpringMVC的RESTful开发控制器方法定义上方
    作用设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,
    例如@GetMapping对应GET请求
    相关属性value(默认):请求访问路径
  • 相关阅读:
    互联网摸鱼日报(2023-10-20)
    JVM第十四讲:调试排错 - Java 内存分析之堆内存和MetaSpace内存
    QT QDoubleSpinBox 浮点计数器控件(使用详解)
    【flutter】flutter SDK的下载与安装以及如何检测Flutter SDK 安装成功
    (Matlab)基于网格搜素优化的支持向量机实现电力负荷预测
    Kubernetes集群部署
    如何借助this指向实现精确判断类型和将类数组对象转数组
    mmdetection ValueError: need at least one array to concatenate解决方案
    铜九铁十快来上分:vite+ts+vue3搭建你的组件库
    基于Spring Boot的ERP仓储管理信息系统设计与实现毕业设计源码150958
  • 原文地址:https://blog.csdn.net/weixin_45696320/article/details/130296315