REST ful
全称是Resource Representational State Transfer - ful
- Resourse: 资源,即数据
- Representational: 表现形式的,例如json,xml等
- State: 状态
- Transfer: 转移
- ful:形容词后缀,标识xxx风格的
连起来就是数据资源的状态变化表现在api的一种风格
即前端向后端发出对数据的增删改查的请求路径
传统的api
- 查询所有:GET /user/get/all 或者 GET /user/list
- 根据id查询:GET /user?id=1
- 添加:POST /user/add
- 修改:POST /user/update
- 删除:GET /user/delete?id=1 或者 GET /user/remove?id=1
使用RESTful
- 查询所有:GET /user
- 根据id查询:GET /user/1
- 添加:POST /user
- 修改:PUT /user
- 删除:DELETE /user/1
通过比较,我们可以发现RESTful风格api的优点是
-
风格统一,不会出现delUser/deleteUser/removeUser各种命名的代码了
-
面向资源,一目了然,具有自解释性
-
充分利用 HTTP 协议本身语义
注意
html的form不支持put和delete,只支持get和post
解决方法如下:
- 使用javascript的ajax来发送put和delete
- SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求(较少使用,使用步骤如下)
HiddenHttpMethodFilter 处理put和delete请求的条件:
a.当前请求的请求方式必须为post
b.当前请求必须传输请求参数_method
满足以上条件,HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式
在web.xml中注册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>
源码
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
//this.methodParam="_method"
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);
后端
@RequestMapping(value = "/user" ,method = RequestMethod.PUT)
public String insertUser(User user){
System.out.println("修改用户"+user);
return "success";
}
前端
注:
目前为止,SpringMVC中提供了两个过滤器:CharacterEncodingFilter和HiddenHttpMethodFilter
在web.xml中注册时,必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter
原因:
在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的
request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作
而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作:
String paramValue = request.getParameter(this.methodParam);