一、REST简介
1. 什么是REST
REST全称是Representational State Transfer,中文意思是表述性状态转移。它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。
他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。”
如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。
2. REST规范
1) 定义资源的URL风格
http://127.0.0.1:8080/tour/user/1
2) 对资源的操作
采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删改查操作。
二、什么是RESTful
符合REST约束风格和原则的应用程序或设计就是RESTful。
案例:
/user/1 HTTP GET 查询id=1的user
/user/1 HTTP DELETE 删除id=1的user,实验中直接删除会报405错误,但是采用$.ajax异步删除就没问题
/user/1 HTTP PUT 更新id=1的user
/user/add HTTP POST 新增user
三、Spring对RESTful的支持
SpringMVC对RESTful应用提供以下支持:
1)利用@RequestMapping指定要处理请求的URI模板和HTTP请求的动作类型。
2)利用@PathVariable将URI请求模板中的变量映射到处理方法的参数上。
3)利用AJAX,在客户端发出PUT、DELETE动作的请求。
@RequestMapping应用
1)@RequestMapping可以定义在Controller类前和处理方法前,主要用于指定Controller的方法处理哪些请求。
2)在RESTful应用中,@RequestMapping可以采用如下格式:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) // 因为这个需要Ajax请求,所有返回的是个json
@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@PathVariable应用
1)@PathVariable作用是将URI请求模板中的变量解析出来,映射到处理方法中的参数上。
2)注解使用格式
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String toUpdate(@PathVariable("id") Integer id, Model model) {}
利用AJAX,在客户端发出PUT、DELETE动作的请求
$.ajax({
type: "PUT",
url: "/tour/user/update",
data: JSON.stringify("#formId").serializeObject()),
dataType: "json",
contentType: "application/json",
success: function(data) {
location.href = "/tour/user/list";
}
})
静态资源访问处理
1)采用RESTful架构后,需要将web.xml中控制器拦截的请求设置为"/",但是一旦设置后,将会拦截如css、js等静态资源,发生404错误。
2)解决静态资源访问处理
配置< mvc:resources />
<mvc:resources mapping="请求URI" location="资源位置" />
配置< mvc:default-servlet-handler />
<mvc:default-servlet-handler/>