一、概述
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。
自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。
说白了,我们开发程序时,都有接口对吧,用于前端(包括手机端,网页等)调用后台来获取数据,这个接口规范(怎么访问,接口怎么写,数据怎么返回等一系列规范)就是RESTful。
这里面有一套架构叫做REST,符合这套架构规则的程序就叫做RESTful
二、Rest架构的主要原则
- 网络上的所有事物都被抽象为资源
- 每个资源都有一个唯一的资源标识符,即URI
- 同一个资源具有多种表现形式(xml,json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
- 符合REST原则的架构方式即可称为RESTful
下面对上面的原则做一些解释:
资源:比如我们调用接口查询某种商品的信息,请求返回的商品信息就是资源
资源标识符:
要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI(Uniform Resource Identifier)。
URI既可以看成是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源, 只能算是资源的一些信息而已。URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
REST主要对以下两方面进行了规范:
- 定位资源的URL风格,例如
http://bhusk.com/admin/1234
http://bhusk.com/admin/1234/10/11
下面让我们来看看URI设计上的一些技巧:
- 使用_或-来让URI可读性更好:
曾经Web上的URI都是冰冷的数字或者无意义的字符串,但现在越来越多的网站使用_或-来分隔一些单词,让URI看上去更为人性化。 例如国内比较出名的开源中国社区,它上面的新闻地址就采用这种风格, 如http://www.oschina.net/news/38119/oschina-translate-reward-plan。 - 使用/来表示资源的层级关系:
例如上述/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08就表示了一个多级的资源, 指的是git用户的git项目的某次提交记录,又例如/orders/2012/10可以用来表示2012年10月的订单记录。 - 使用?用来过滤资源
很多人只是把?简单的当做是参数的传递,很容易造成URI过于复杂、难以理解。可以把?用于对资源的过滤, 例如/git/git/pulls用来表示git项目的所有推入请求,而/pulls?state=closed用来表示git项目中已经关闭的推入请求, 这种URL通常对应的是一些特定条件的查询结果或算法运算结果。 - ,或;可以用来表示同级资源的关系
有时候我们需要表示同级资源的关系时,可以使用,或;来进行分割。例如哪天github可以比较某个文件在随意两次提交记录之间的差异,或许可以使用/git/git /block-sha1/sha1.h/compare/e3af72cdafab5993d18fae056f87e1d675913d08;bd63e61bdf38e872d5215c07b264dcc16e4febca作为URI。 不过,现在github是使用…来做这个事情的,例如/git/git/compare/master…next。
- 如何对资源操作
采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删该查操作
三、什么是RESTful
对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构).
符合REST约束风格和原则的应用程序或设计就是RESTful.
/emp/1 HTTP GET 查询id=1的emp
/emp/1 HTTP DELETE 删除id=1的emp,实验中直接删除会报405错误,但是采用$.ajax异步删除就没问题
/emp/1 HTTP PUT 更新emp
/emp/add HTTP POST 新增emp
四、Spring对RESTful的支持
Spring MVC 对 RESTful应用提供了以下支持:
-
利用@RequestMapping 指定要处理请求的URI模板和HTTP请求的动作类型
-
利用@PathVariable讲URI请求模板中的变量映射到处理方法参数上
-
利用Ajax,在客户端发出PUT、DELETE动作的请求
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String toUpdate(@PathVariable("id") Integer id, Model model) {}
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)
客户端发送PUT,DELETE请求
可以采用Ajax方式发送PUT和DELETE请求
$.ajax( {
type : "DELETE",
url : "/spring_crud_restful/emp/deleteEmp/" + id,
dataType : "json",
success : function(data) {
alert(data);
location.href = "/spring_crud_restful/emp/listEmp/1";
}
});