1:Rest介绍
REST:Representational State Transfer,表现层资源状态转移。
具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。
操作 | 传统方式 | REST风格 |
---|---|---|
查询操作 | getUserById?id=1 | user/1–>get请求方式 |
保存操作 | saveUser | user–>post请求方式 |
删除操作 | deleteUser?id=1 | user/1–>delete请求方式 |
更新操作 | updateUser | user–>put请求方式 |
2:SpringBoot开启Rest
在application.yaml配置:
spring.mvc.hiddenmethod.filter.enabled=true
表单提交:
<a th:href="@{/user/1}">查询用户</a>
<br/>
<form th:action="@{/user}" method="post">
userId:<input type="text" name="userId">
userName:<input type="text" name="userName">
<input type="submit" th:value="添加用户">
</form>
<br/>
<form th:action="@{/user/1}" method="post">
<input type="hidden" name="_method" th:value="Delete">
<input type="submit" th:value="删除用户">
</form>
<br/>
<form th:action="@{/user}" method="post">
<input type="hidden" name="_method" th:value="Put">
userName:<input type="text" name="userName">
<input type="submit" name="修改用户">
</form>
控制层:
@org.springframework.web.bind.annotation.RestController
public class RestController {
@GetMapping("/user/{userId}")
public String getRest(@PathVariable(value = "userId",required = false)Integer userId){
return "这是Get请求,查询的userId为"+userId;
}
@PostMapping("/user")
public String postRest(@RequestParam("userId") Integer userId, @RequestParam("userName")String userName){
return "这是Post请求,保存的userId为"+userId+",userName为"+userName;
}
@DeleteMapping("/user/{userId}")
public String deleteRest(@PathVariable(value = "userId",required = false)Integer userId){
return "这是Delete请求,删除的userId为"+userId;
}
@PutMapping("/user")
public String putRest( @RequestParam("userName")String userName){
return "这是Put请求,修改的userName为"+userName;
}
}
3:底层原理
1:表单提交的过程中会携带_method参数
2:请求过来会被 HiddenHttpMethodFilter拦截
3:当请求正确,且为post请求,则_method的value值会被获取
4:原生post请求会通过包装模式,重写getMethod方法,getMethod的返回值就是传入的_method的value
5:HiddenHttpMethodFilter需要放到整个过滤链最前面