【SpringMVC 框架(自学)】Day06(RESTFul风格)--2022/4/15
五、RESTFul实现
具体来说,RESTFul就是HTTP协议里面,四个表示操作方式的动词:
- GET(查找)
- POST(新增)
- PUT(修改)
- DELETE(删除)
它们分别对应四种操作:增删改查(CRUD),是一种风格,开发的规范化,保证可读性
操作 | 传统方式 | REST风格 |
---|---|---|
查询操作 | getUserByid?id=1 | user/1-->GET请求方式 |
保存操作 | saveUser | user-->POST请求方式 |
删除操作 | DeleteUser?id=1 | user/1-->DELETE请求方式 |
更新操作 | UpdateUser | user-->PUT请求方式 |
GET&POST
@RequestMapping(vale = "/user",method = RequestMethod.GET)
public String getAllUser(){
sout("查询所有用户")
return "success";
}
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String getUserById(){
sout("根据id查询用户")
return "success";
}
@RequestMapping(value = "/user",RequestMethod.POST)
public String addUser(String username,String password){
sout("增加用户-->"+"用户名:"+username+",密码:"+password)
return "success";
}
<!--视图控制器view-Controller-->
<mvc:view-controller path="/test_rest" view-name="test_rest"></mvc:view-controller>
<!--当视图控制器View-Controller配置时
SpringMVC的注解会失效,所以需要配置注解驱动
-->
<mvc:annotation-driven></mvc:annotation-driven>
HiddenHttpMethodFilter
通常情况下:form表单会默认执行GET方法,且只有GET/POST两种提交方式
如果要实现诸如(PUT、DELETE、PATCH),那么就要在过滤器(Filter)中配置:HiddenHttpMethodFilter
<!--配置HiddenHttpMethodFilter-->
<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>
源码解析(重点)
form确实只有GET/POST提交方式,那么PUT、DELETE、PATCH该如何实现呢?
-
通过class类找到HiddenHttpMethodFilter
-
查看HiddenHttpMethodFilter的结构,找到doFilter开头的方法,并且泛型是FilterChain的
// 1、
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HttpMethodRequestWrapper(request, method);
}
}
}
filterChain.doFilter(requestToUse, response);
}
// 2、
public static final String DEFAULT_METHOD_PARAM = "_method";
private String methodParam = DEFAULT_METHOD_PARAM;
// 3、
public enum HttpMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
/**
首先它的提交方式必须以POST为前提,定义一个request对象来获取它的提交方式是否为POST
如果为POST则程序向下执行
定义个String类型的paramValue属性,将request的获取参数改为this.methodParam传递给paramValue
如果String类型的paramValue属性有长度的话,则定义一个method来接收paramValue的大写:_METHOD
然后通过ALLOWED_METHODS进行模糊匹配
此刻ALLOWED_METHODS里有PUT、DELETE、PATCH方法,都是HTTPMethod类下的
HTTPMethod又是一个枚举类型的,如果模糊匹配成功
则用户可以直接通过POST方法进行匹配,然后通过name为_method来修改POST方法为PUT(或者其它)
*/
Filter配置顺序
HiddenHttpMethodFilt应该配置到CharacterEncodingFilter之后,因为CharacterEncodingFilter是为获取请求参数时设置的,而HiddenHttpMethodFilt在它之前就有获取请求参数,所以CharacterEncodingFilter就没有生效,这点是需要注意的
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库