文章目录
RESTful简介
Thymeleaf
中的@{/}
表示是该项目下的根路径
REST:Representational State Transfer,表现层资源状态转移。
资源
资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。
【就是将服务器中的所有组成部分都可以看成一个
资源
】
资源的表述
资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。
【就是服务器中的各种资源的表现形式,列如:以
HTML
XML
CSS
JSON
图片
纯文本
等】
状态转移
状态转移说的是:在客户端和服务器端之间转移(
transfer
)代表资源状态的表述。通过转移和操作资源的表述,来间接实现操作资源的目的。【状态转移就是客户端访问服务器端,服务器端给客户端响应数据】
1.RESTful的实现
具体说,就是 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请求方式 |
/**
* 模拟RESTful风格增删修查
* user GET 查询所有用户信息
* user/id GET 根据ID查询用户信息
* user POST 添加用户信息
* user/id DELETE 根据ID删除用户信息
* user PUT 修改用户信息
*/
RESTful
风格就是,请求的路径都是xxx/user
,同时通过不同的请求方式,来配置对应的映射处理方法
2.实现GET
请求
<a th:href="@{/restful/user}">查询所有用户信息。。。</a>
<a th:href="@{/restful/user/1}">根据用户ID查询用户信息。。。</a>
@Controller
@RequestMapping("/restful")
public class UserController {
/**
* 模拟RESTful风格增删修查
* user GET 查询所有用户信息
* user/id GET 根据ID查询用户信息
* user POST 添加用户信息
* user/id DELETE 根据ID删除用户信息
* user PUT 修改用户信息
*/
// 查询所有用户信息
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getAllUser(){
System.out.println("查询所有用户信息");
return "success";
}
// 根据Id查询用户信息
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String getUserById(@PathVariable("id")Integer id){
System.out.println("根据Id查询用户信息"+id);
return "success";
}
}
3.实现POST
请求
<form th:action="@{/restful/user}" method="post">
<h3 style="color: green">添加用户信息</h3>
<input type="submit" value="添加用户信息Post">
</form>
// 添加用户信息
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String addUser(){
System.out.println("添加一个用户信息");
return "success";
}
由于DELETE
和PUT
请求不能直接发送,需要配置HiddenHttpMethodFilter
过滤器
HiddenHttpMethodFilter
源码
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
源码可以看出:`需要发送POST`请求,
并且 还需要传入 `name='_method' value='PUT'或value='DELETE'`
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
}
}
}
可以看出只需要满足两个条件,就是可以发送DELETE
和PUT
请求
1.发送请求的方式为POST
方式
2.在一个<input type="hidden" name="_method" value="PUT"/>
或者<<input type="hidden" name="_method" value="DELETE" />
就是满足:发送是POST
请求和在input
框中的name
属性设置是PUT
或DELETE
请求
发送PUT
和DELETE
请求的步骤
第一步:在WEB.XML
配置文件中配置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>
注意是:如果有编码过滤器
同时在WEB.XML
中配置时,一定要将HiddenHttpMethodFilter
配置在编码过滤器
后面,否则编码过滤器
就会失效
form
表单中发送POST
请求,并且在<input type="hidden" name="_method" value="PUT"/>
或者<<input type="hidden" name="_method" value="DELETE"/>
第二步:在就是满足:发送是POST
请求和在input
框中的name
属性设置是_method
,而value
属性设置为PUT
或DELETE
请求
4.实现PUT
请求
<!--put请求方式-->
<form th:action="@{/restful/user}" method="post">
<input type="hidden" name="_method" value="PUT"><br/>
<input type="submit" value="发送PUT请求">
</form>
// 修改用户信息
@RequestMapping(value = "/user" , method = RequestMethod.PUT)
public String updateUser(){
System.out.println("修改一个用户信息");
return "success";
}
5.实现DELETE
请求
<!--DELETE请求方式-->
<form th:action="@{/restful/user/2}" method="post">
<input type="hidden" name="_method" value="DELETE"><br/>
<input type="submit" value="发送DELETE请求">
</form>
// 删除一个用户信息根据ID
@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
public String deleteUser(@PathVariable("id")Integer id){
System.out.println("删除用户信息"+id);
return "success";
}
总结:
RESTful
风格有四种请求GET
POST
PUT
DELETE
,由于PUT
和DELETE
不能直接使用表单发送,PUT
和DELETE
请求需要在web.xml
中配置一个HiddenHttpMethodFilter
过滤器