5. RESTful

空~2022年9月7日
  • SpringBoot
大约 4 分钟

5. RESTful

接口: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP 接口),或指软件系统open in new window不同组成部分衔接的约定. 用来提供应用程序open in new window与开发人员基于某软件open in new window或硬件得以访问的一组例程open in new window,而又无需访问源码,或理解内部工作机制open in new window的细节.

接口(API): 可以指访问 servlet, controller 的 url, 或调用其他程序的函数.

架构风格: api 组织方式(样子, 格式)

传统的风格: http://localhost:9002/mytrans/addStudent?name=lisi&age=26open in new window

在地址上提供了 访问的资源名称 addStudent, 在其后使用了 get 方式传递参数.

REST 架构风格

REST: (英文: Representational State Transfer, 中文: 表现层状态转移)是一种接口的架构风格和设计的理念, 不是标准.

优点: 更简洁,更有层次

表现层状态转移:

表现层:

表现层就是视图层, 显示资源的, 通过视图页面, jsp 等等显示操作资源的结果.

状态:

资源变化

转移:

资源可以变化的, 资源能创建, new 状态, 资源创建后可以查询资源, 能看到资源的内容, 这个资源内容,可以被修改, 修改后资源 和之前的不一样.

REST 中的要素:

用 REST 表示资源和对资源的操作. 在互联网中, 表示一个资源或者一个操作.

资源使用 url 表示的, 在互联网, 使用的图片, 视频, 文本, 网页等等都是资源.

对资源的操作:

查询资源: 看, 通过 url 找到资源.

创建资源: 添加资源.

更新资源: 更新资源, 编辑.

删除资源: 去除.

在 url 中,使用名词表示资源, 以及访问资源的信息, 在 url 中,使用“ / " 分隔对资源的信息

http://localhost:8080/myboot/student/1001open in new window

使用 http 中的动作(请求方式), 表示对资源的操作(CURD)

GET: 查询资源 -- sql select

处理单个资源: 用他的单数方式

http://localhost:8080/myboot/student/1001open in new window

http://localhost:8080/myboot/student/1001/1open in new window

处理多个资源: 使用复数形式

http://localhost:8080/myboot/students/1001/1002open in new window

POST: 创建资源 -- sql insert

http://localhost:8080/myboot/studentopen in new window

在 post 请求中传递数据

<form action="http://localhost:8080/myboot/student" method="post">
  姓名:<input type="text" name="name" /> 年龄:<input type="text" name="age" />
</form>

PUT: 更新资源 -- sql update

<form action="http://localhost:8080/myboot/student/1" method="post">
    姓名:<input type="text" name="name" />
    年龄:<input type="text" name="age" />
    <input type="hidden" name="_method" value="PUT" />
</form>

DELETE: 删除资源 -- sql delete

<a href="http://localhost:8080/myboot/student/1">删除 1 的数据</a>

需要的分页,排序等参数,依然放在 url 的后面, 例如

http://localhost:8080/myboot/students?page=1&pageSize=20open in new window

一句话说明 REST:

使用 url 表示资源 ,使用 http 动作操作资源.

注解

@PathVariable: 从 url 中获取数据

@GetMapping: 支持的 get 请求方式, 等同于 @RequestMapping(method=RequestMethod.GET)

@PostMapping: 支持 post 请求方式, 等同于 @RequestMapping(method=RequestMethod.POST)

@PutMapping: 支持 put 请求方式, 等同于 @RequestMapping(method=RequestMethod.PUT)

@DeleteMapping: 支持 delete 请求方式, 等同于 @RequestMapping(method=RequestMethod.DELETE)

@RestController: 复合注解, 是 @Controller 和 @ResponseBody 组合, 在类的上面使用@RestController 表示当前类的所有方法都加入了 @ResponseBody

测试工具: Postman, Apifox 等

使用测试工具可以直接测试 get ,post , put ,delete 等请求

/**
 * 请求连接: http://localhost:8080/student
 **/
@RestController
@RequestMapping("/student") // 提取公共部分
public class MyRestController {
    @GetMapping("/queryStudent/{uid}")
    public String queryStudent(@PathVariable(value = "uid") Integer uid) {
        return "queryStudent" + uid;
    }
    /**
     * 当路径变量名称和形参一样, @PathVariable中的value可以省略
     */
    @PostMapping("/getStudent/{uid}")
    public String getStudent(@PathVariable Integer uid){
        return "getStudent" + uid;
    }

    @PutMapping("/modifyStudent/{uid}")
    public String modifyStudent(@PathVariable Integer uid){
        return "modifyStudent" + uid;
    }

    @DeleteMapping("/removeStudent/{uid}")
    public String removeStudent(@PathVariable Integer uid){
        return "removeStudent" + uid;
    }
}

image-20220921155829931

put, delete 请求

在 SpringMVC 中有一个过滤器, 支持 post 请求转为 put ,delete

过滤器: org.springframework.web.filter.HiddenHttpMethodFilter

作用: 把请求中的 post 请求转为 put, delete

实现步骤:

  1. application.properties(yml): 开启使用 HiddenHttpMethodFilter 过滤器
  2. 在请求页面中, 包含 _method 参数, 他的值是 put, delete, 发起这个请求使用的 post 方式

启用过滤器

spring.mvc.hiddenmethod.filter.enabled=true

在请求页面中, 包含 _method 参数

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <form action="student/testRest" method="post">
      <input type="submit" value="测试请求方式" />
      <input type="hidden" name="_method" value="put" />
    </form>
  </body>
</html>

添加一个 Controller 测试

@RestController
@RequestMapping("/student")
public class MyRestController {
    @PutMapping("/testRest")
    public String testRest() {
        return "testRest";
    }
}

请求方式必须唯一

当出现不同请求访问链接不唯一时, 就会报错, 程序无法判断具体是哪个请求.

/**错误 500*/
@RestController
@RequestMapping("/student")
public class MyRestController {
    @GetMapping("/queryStudent/{uid}")
    public String queryStudent(@PathVariable(value = "uid") Integer uid) {
        return "queryStudent" + uid;
    }

    @PostMapping("/queryStudent/{age}")
    public String queryStudentPost(@PathVariable(value = "age") Integer age) {
        return "queryStudent" + age;
    }
}