一、介绍
- 传统方式请求:/getUser,/delUser,/saveUser
- REST方式:全部是/user请求,根据请求方式判断具体操作,获取用户:GET,删除用户:DELETE,修改用户:PUT,保存用户:PUT
- 核心在于HiddenHttpMethodFilter
- 用法:表单form中method=post,隐藏发送一个参数"_method="(参数的值根据不同的操作可以是put、delete等)
- springboot中手动开启 spring:mvc.hiddenmethod.filter.enabled=true
- 表单提交使用rest时原理(使用客户端如postman时不需要该步骤)
- 表单提交时附带参数:_method=put/delete
- 请求会被HiddenHttpMethodFilter拦截
- 判断是否post请求,且正常
- 获取_method的值(put/delete/patch)
- 原生request(post),包装模式requestWrapper重写getMethod方法,返回的是传入的值(put/delete/patch)
- 过滤器链放行的时候用wrapper,以后的方法调用getMethod是调用requestWrapper的
- 参数"_method"是可以自定义的
@Configuration(proxyBeanMethods = false) public class WebConfig { @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter(){ HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); //自定义rest风格表单附带参数为"_rqm" methodFilter.setMethodParam("_rqm"); return methodFilter; } }
二、实践
- 开启过滤器
spring: mvc: hiddenmethod: filter: enabled: true #开启rest风格过滤器
- 表单
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Welcome</title> </head> <body> Hello,boot!<br> 测试rest风格: <form action="/user" method="get"> <input value="REST-GET 提交" type="submit"/> </form> <form action="/user" method="post"> <input value="REST-POST 提交" type="submit"/> </form> <form action="/user" method="post"> <input name="_method" type="hidden" value="put"/> <input value="REST-PUT 提交" type="submit"/> </form> <form action="/user" method="post"> <input name="_method" type="hidden" value="delete"/> <input value="REST-DELETE 提交" type="submit"/> </form> </body> </html>
- controller
@RestController public class UserController { /** * @Description rest风格的两种写法 * @Date 0:09 2021/10/12 * @Param [] * @return java.lang.String */ // @RequestMapping(value = "/user", method = RequestMethod.GET) @GetMapping(value = "/user") public String getUser(){ return "GET_tom"; } @PostMapping(value = "/user") public String saveUser(){ return "POST_tom"; } @PutMapping(value = "/user") public String putUser(){ return "PUT_tom"; } @DeleteMapping("/user") public String deleteUser(){ return "DELETE_tom"; } }