• 07_SpingBoot 实现 RESTful 风格


    一、认识 RESTFul

    REST(英文:Representational State Transfer,简称REST)

    一种互联网软件架构设计的风格,但它并不是标准,它只是提出了一组客户端和服务器交互时的架构理念和设计原则,基于这种理念和原则设计的接口可以更简洁,更有层次,REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

    以前:访问资源(图片,servlet程序),请求资源同时带上请求方式,如果get请求直接访问到doget方法上,如果post请求直接访问到dopost

    rest理念访问资源:请求资源,然后按照请求的方式进行处理,如果是get方式,查询操作,如果是put方式 更新操作,如果是delete方式 删除资源,如果是post方式 添加资源。

    任何的技术都可以实现这种rest理念,如果一个架构符合REST原则,就称它为RESTFul架构

    外在体现:

    比如我们要访问一个http接口:http://localhost:8080/boot/order?id=1021&status=1

    质询参数?id=1021&status=1

    采用RESTFul风格则http地址为:http://localhost:8080/boot/order/1021/1

    二、Spring Boot 开发 RESTFul

    Spring boot开发RESTFul 主要是几个注解实现

    1. @PathVariable

    获取url中的数据

    该注解是实现RESTFul最主要的一个注解

    2. @PostMapping

    接收和处理Post方式的请求

    ​​​​​​​3. @DeleteMapping

    接收delete方式的请求,可以使用GetMapping代替

    ​​​​​​​4. @PutMapping

    接收put方式的请求,可以用PostMapping代替

    ​​​​​​​5. @GetMapping

    接收get方式的请求

    三、​​​​​​​RESTful的优点

    • 轻量,直接基于http,不再需要任何别的诸如消息协议

    get/post/put/delete为CRUD操作

    • 面向资源一目了然,具有自解释性
    • 数据描述简单,一般以xml,json做数据交换。
    • 无状态,在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。
    • 简单、低耦合

    四、使用RESTful风格模拟实现对学生的增删改查操作 

    ​​​​​​​1. 创建RESTfulController,并编写代码

    1. @RestController
    2. public class RESTfulController {
    3. /*
    4. * 添加学生
    5. * 请求地址:http://localhost:9094/004-springboot-springmvc/springBoot/student/suke/119
    6. * 请求方式:POST
    7. * @param name
    8. * @param age
    9. * @return
    10. * */
    11. @PostMapping(value = "/springBoot/student/{name}/{age}")
    12. public Object addStudent(@PathVariable("name") String name,
    13. @PathVariable("age") Integer age) {
    14. Map<String, Object> retMap = new HashMap<String, Object>();
    15. retMap.put("name", name);
    16. retMap.put("age", age);
    17. return retMap;
    18. }
    19. /*
    20. * 删除学生
    21. * 请求地址:http://localhost:9094/004-springboot-springmvc/springBoot/student/110
    22. * 请求方式:Delete
    23. *
    24. * @param id
    25. * @return
    26. * */
    27. @DeleteMapping(value = "/springBoot/student/{id}")
    28. public Object removeStudent(@PathVariable("id") Integer id) {
    29. return "删除的学生id为:" + id;
    30. }
    31. /*
    32. * 修改学生信息
    33. * 请求地址:http://localhost:9094/004-springboot-springmvc/springBoot/student/120
    34. * 请求方式:Put
    35. *
    36. * @param id
    37. * @return
    38. * */
    39. @PutMapping(value = "/springBoot/student/{id}")
    40. public Object modifyStudent(@PathVariable("id") Integer id) {
    41. return "修改学生的id为" + id;
    42. }
    43. @GetMapping(value = "/springBoot/student/{id}")
    44. public Object queryStudent(@PathVariable("id") Integer id) {
    45. return "查询学生的id为" + id;
    46. }
    47. }

    2. 使用Postman模拟发送请求,进行测试

    (1)@PostMapping(value = "/springBoot/student/{name}/{age}")

    添加学生
    请求地址:http://localhost:9004/004-springboot-springmvc/springBoot/student/ls/119
    请求方式:POST

    (2)@DeleteMapping(value = "/springBoot/student/{id}")

    删除学生
    请求地址:http://localhost:9004/004-springboot-springmvc/springBoot/student/110
    请求方式:Delete

    (3)@PutMapping(value = "/springBoot/student/{id}")

    修改学生信息
    请求地址:http://localhost:9004/004-springboot-springmvc/springBoot/student/120
    请求方式:Put

    (4)@GetMapping(value = "/springBoot/student/{id}")

    查询学生信息
    请求地址:http://localhost:9004/004-springboot-springmvc/springBoot/student/123
    请求方式:Get

    (5)总结:其实这里我们能感受到的好处​​​​​​​

    传递参数变简单了

    服务提供者对外只提供了一个接口服务,而不是传统的CRUD四个接口

    ​​​​​​​3. 请求冲突的问题

    • 改路径
    • 改请求方式

    (1)创建RESTfulController类

    1. /*
    2. * queryOrder1和queryOrder2两个请求路径会发生请求路径冲突问题
    3. * queryOrder3与queryOrder1和queryOrder2发生请求不冲突
    4. * 注意:虽然两个路径写法改变了,但是由于传递的两个参数都是int值,所以不知道该交给哪个请求进行处理
    5. * 就会出现匹配模糊不清的异常,所以要想解决冲突,有两种方式:
    6. * 1.修改请求路径
    7. * 2.修改请求方式
    8. * */
    9. @RestController
    10. public class RESTfulController2 {
    11. @GetMapping(value = "/springBoot/order/{id}/{status}")
    12. public Object queryOrder(@PathVariable("id") Integer id,
    13. @PathVariable("status") Integer status) {
    14. System.out.println("-----queryOrder--------");
    15. Map<String, Object> map = new HashMap<String, Object>();
    16. map.put("id", id);
    17. map.put("status", status);
    18. return map;
    19. }
    20. @GetMapping(value = "/springBoot/{id}/order/{status}")
    21. public Object queryOrder1(@PathVariable("id") Integer id,
    22. @PathVariable("status") Integer status) {
    23. System.out.println("-----queryOrder1--------");
    24. Map<String, Object> map = new HashMap<String, Object>();
    25. map.put("id", id);
    26. map.put("status", status);
    27. return map;
    28. }
    29. @GetMapping(value = "/springBoot/{status}/order/{id}")
    30. public Object queryOrder2(@PathVariable("id") Integer id,
    31. @PathVariable("status") Integer status) {
    32. Map<String, Object> map = new HashMap<String, Object>();
    33. map.put("id", id);
    34. map.put("status", status);
    35. return map;
    36. }
    37. @PostMapping(value = "/springBoot/{status}/order/{id}")
    38. public Object queryOrder3(@PathVariable("id") Integer id,
    39. @PathVariable("status") Integer status) {
    40. Map<String, Object> map = new HashMap<String, Object>();
    41. map.put("id", id);
    42. map.put("status", status);
    43. return map;
    44. }
    45. }

    (2)结合Postman进行测试说明

    @GetMapping(value = "/springBoot/order/{id}/{status}")

    解决:改路径

    @GetMapping(value = "/springBoot/{id}/order/{status}")

    @GetMapping(value = "/springBoot/{status}/order/{id}")

    报错:出现请求冲突

    @PostMapping(value = "/springBoot/{status}/order/{id}")

    解决:改post请求方式

    五、RESTful原则

    ① 增post请求、删delete请求、改put请求、查get请求

    ② 请求路径不要出现动词

    例如:查询订单接口

    /boot/order/1021/1(推荐)

    /boot/queryOrder/1021/1(不推荐) 

    User/name/age/sex? page=1&sort=desc

    ③ 分页、排序等操作,不需要使用斜杠传参数

    例如:订单列表接口

    /boot/orders?page=1&sort=desc

    一般传的参数不是数据库表的字段,可以不采用斜杠

    ④ REST:

    • 请求资源
    • 请求方式
    • 根据参数操作
    • 不是资源的信息(参数),一般不用斜杠传参数,采用质询参数
  • 相关阅读:
    MVC 、MVP、MVVM
    Wireshark过滤器的使用
    sed使用技巧-在replacement块获取pattern匹配的值
    多线程的知识补充
    2023年阿里云新用户云服务器价格表
    Mysql按照中文首字母排序
    【学生网页设计作品 】关于HTML公益主题网页设计——谨防电信诈骗网
    Nginx的配置
    IDEA插件推荐:Apipost-Helper
    锐龙r7 5700X和5800X区别
  • 原文地址:https://blog.csdn.net/qq_45037155/article/details/125439254