【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就没有生效,这点是需要注意的


posted @   VVS,冷漠的心  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

囚鸟该如何超越今生?

点击右上角即可分享
微信分享提示