1. 简介
RESTful 的英文全称是 Representational State Transfer(表述性状态转移)。简称REST。表述性(Representational)是:URI + 请求方式。
状态(State)是:服务器端的数据。
转移(Transfer)是:变化。
表述性状态转移是指:通过 URI + 请求方式 来控制服务器端数据的变化。
RESTFul是`WEB服务接口`的一种设计风格。
RESTFul定义了一组约束条件和规范,可以让`WEB服务接口`更加简洁、易于理解、易于扩展、安全可靠。
RESTFul对一个`WEB服务接口`都规定了哪些东西?
* 对请求的URL格式有约束和规范
* 对HTTP的请求方式有约束和规范
* 对请求和响应的数据格式有约束和规范
* 对HTTP状态码有约束和规范
* 等 ......REST对请求方式的约束是这样的:
* 查询必须发送GET请求
* 新增必须发送POST请求
* 修改必须发送PUT请求
* 删除必须发送DELETE请求REST对URL的约束是这样的:
* 传统的URL:get请求,/springmvc/getUserById?id=1
* REST风格的URL:get请求,/springmvc/user/1
* 传统的URL:get请求,/springmvc/deleteUserById?id=1
* REST风格的URL:delete请求, /springmvc/user/1
2. RESTFul风格与传统方式对比
传统的 URL 与 RESTful URL 的区别是传统的 URL 是基于方法名进行资源访问和操作,而 RESTful URL 是基于资源的结构和状态进行操作的。下图是,展示两者之间的具体区别:
从上图中我们可以看出,传统的URL是基于动作的,而 RESTful URL 是基于资源和状态的,因此 RESTful URL 更加清晰和易于理解,这也是 REST 架构风格被广泛使用的主要原因之一。
3. RESTFul方式演示
查询需用get请求方式
根据id查询
index.html页
<!--查询单个用户信息-->
<a th:href="@{/user/1}">查询id为1的用户信息</a> <br>
Controller层
//映射路径
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
//获取URL中的id值,赋值给变量id
public String queryBeanUser(@PathVariable("id") String id) {
System.out.println("id为" + id + "的用户信息");
return "ok";
}
public class User {
private String username;
private String password;
查询所有
index.html
<!--查询所有用户信息-->
<a th:href="@{/user}">查询所有用户信息</a> <br>
controller层
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String queryUser() {
System.out.println("查询所有用户信息");
return "ok";
}
增加数据
增加数据用post请求方式
idnex.html
<!--保存用户信息-->
<form th:action="@{/user}" method="post">
账号:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="保存">
</form> <br>
controller
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String saveUser(User user) {
System.out.println("正确保存用户信息" + user);
return "ok";
}
修改数据
修改用put请求方式,由于超链接和表单提交方式限定,需要在web.xml文件中增加一段配置
以下这段代码所有请求都会走这段过滤器,进而框架底层在进行请求方式判断映射到对应的控制层
<!--顺序执行,字符编码过滤器在前面就先执行上面的过滤器-->
<!--由于过滤器优先级问题,一定要在后面配置,在前面配置就先执行该过滤器在执行编码过滤器,那么无法解决乱码问题-->
<!--添加请求过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
idnex.html
<!--修改用户信息-->
<!--因为form表单只能发送get或者post请求,所以要发送其他需要添加隐藏域-->
<form th:action="@{/user}" method="post">
<!--
发送PUT请求细节
发送PUT请求大前提必须为POST请求
type类型为隐藏
name的值必须为_method
如果发送put请求:value的值必须为put或者PUT
如果发送delete请求:value值必须为delete或者DELETE
-->
<!--添加隐藏域,用于指定提交方式为put-->
<input type="hidden" name="_method" value="put" >
账号:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="修改">
</form>
controller
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public String modifyUser(User user) {
System.out.println("正在修改用户信息" + user);
return "ok";
}
删除数据
删除用到delete请求方式
index.html
<!--删除用户信息-->
<!--如果以超链接的形式进行删除,得先把超链接的get请求方式转换-->
<a th:href="@{/user/101}" onclick="del(event)">删除用户信息</a>
<form id="deleteUser" method="post">
<input type="hidden" name="_method" value="delete">
</form>
<script>
function del(event) {
let user = document.getElementById('deleteUser')
//获取请求路径
let href = event.target.href
//请求路径赋值给表单进行提交
user.action = href
user.submit()
//阻止超链接行为
event.preventDefault()
}
</script>
controller层
@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
public String deleteUser(@PathVariable("id") Integer id) {
System.out.println("正在删除用户id为" + id);
return "ok";
}