5. RESTful
5. RESTful
接口: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP 接口),或指软件系统不同组成部分衔接的约定. 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节.
接口(API): 可以指访问 servlet, controller 的 url, 或调用其他程序的函数.
架构风格: api 组织方式(样子, 格式)
传统的风格: http://localhost:9002/mytrans/addStudent?name=lisi&age=26
在地址上提供了 访问的资源名称 addStudent, 在其后使用了 get 方式传递参数.
REST 架构风格
REST: (英文: Representational State Transfer, 中文: 表现层状态转移)是一种接口的架构风格和设计的理念, 不是标准.
优点: 更简洁,更有层次
表现层状态转移:
表现层:
表现层就是视图层, 显示资源的, 通过视图页面, jsp 等等显示操作资源的结果.
状态:
资源变化
转移:
资源可以变化的, 资源能创建, new 状态, 资源创建后可以查询资源, 能看到资源的内容, 这个资源内容,可以被修改, 修改后资源 和之前的不一样.
REST 中的要素:
用 REST 表示资源和对资源的操作. 在互联网中, 表示一个资源或者一个操作.
资源使用 url 表示的, 在互联网, 使用的图片, 视频, 文本, 网页等等都是资源.
对资源的操作:
查询资源: 看, 通过 url 找到资源.
创建资源: 添加资源.
更新资源: 更新资源, 编辑.
删除资源: 去除.
在 url 中,使用名词表示资源, 以及访问资源的信息, 在 url 中,使用“ / " 分隔对资源的信息
使用 http 中的动作(请求方式), 表示对资源的操作(CURD)
GET: 查询资源 -- sql select
处理单个资源: 用他的单数方式
处理多个资源: 使用复数形式
POST: 创建资源 -- sql insert
在 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 的后面, 例如
一句话说明 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;
}
}
put, delete 请求
在 SpringMVC 中有一个过滤器, 支持 post 请求转为 put ,delete
过滤器: org.springframework.web.filter.HiddenHttpMethodFilter
作用: 把请求中的 post 请求转为 put, delete
实现步骤:
- application.properties(yml): 开启使用 HiddenHttpMethodFilter 过滤器
- 在请求页面中, 包含 _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;
}
}