REST这个词是Roy Thomas Fielding博士在他2000年的博士论文中提出的,Fielding将他对互联网软件的架构原则定名为REST,即Representational State Transfer的缩写,翻译为“表现层状态转化”。如果一个架构符合REST原则,就称它为RESTful架构,即REST风格的架构。
REST是一种架构风格,而不是一种架构。要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词到底是什么意思,他的每一个词代表什么含义。如果你把这个名词搞懂了,就不难体会REST是一种什么样的设计。
REST的名称“表现层状态转化”中省略了主语。“表现层”其实是指的“资源(Resources)”的“表现层”。
所谓“资源”,就是网络上的一个实体,或者是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务、总之就是一个具体的实体。你可以用一个URI(统一资源标识符)指向它,每种资源对应一个特定的URL。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
“资源”是一种信息实体,他可以有多种的外在表现形式。我们把“资源”具体呈现出来的形式称之为“表现层”。比如:文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式表现;图片可以采用JPG格式表现,也可以用PNG格式表现。
URI只代表资源的实体,不代表他的形式。严格地说,有些网址最后的“.html”后缀名是不必要的,因为这个后缀名表示格式,属于“表现层”的范畴,而URI应该只代表“资源”的位置。它的具体表现形式应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对“表现层”的描述,不过在大部分应用中,通过后缀区分表现层就已经足够了。
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及数据和状态的变化。
HTTP协议是一个无状态互联网通信协议,这意味着所有状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器发生“状态转化(State Transfer)”。而这种转化是建立在表现层之上的,所以就叫做“表现层状态转化”。
客户端用到的手段只能是HTTP协议。具体的说,HTTP协议里有5个常用的表示操作方式的动词:GET、POST、PUT、DELETE、PATCH。它们分别对应5种基本操作:GET用来获取资源,POST用来新建资源(也可以用来更新资源),PUT用来更新资源,DELETE用来删除资源,PATCH用来更新资源的部分属性。
现在流行的各种Web框架,包括Spring Boot都支持REST开发,REST并非是一种技术或者规范,而是一种架构风格,这种架构风格逐渐各种编程语言的Web框架所支持。它包括了REST架构中如何标识资源,如何表示操作接口及操作版本,如何标识操作结果等,主要内容如下:
http://192.168.0.1/api
也有的使用“api”作为二级域名:
http://api.XXXX.com
http://192.168.0.1/api/v1.1
也有的做法是将版本信息放到HTTP头,但这里推荐还是通过URl来实现,这样使得REST的相关代码更加容易阅读。
将资源名称放到URL中,如果资源有层级关系,则放入层级关系:
http://192.168.0.1/api/v1.1/user
如果用户属于系统管理,也可以这么写:
http://192.168.0.1/api/v1.1/system/user
在REST中,HTTP Method常常对应一下含义:
在业务系统中,删除往往并不是指的物理删除,而是逻辑删除,资源通常仍在数据库中,只是状态设置为删除状态。
RESTful API设计的一些例子
新增用户:
POST:http://192.168.0.1/api/v1.1/system/user
查询id为45的用户
GET:http://192.168.0.1/api/v1.1/system/user/45
查询所有用户:
GET:http://192.168.0.1/api/v1.1/system/user
如果有翻页,可以在后面增加类似offset、limit参数,比如:
GET:http://192.168.0.1/api/v1.1/system/user?offset=1&limit=20&sortBy=name
更新用户id为45的用户:
PUT:http://192.168.0.1/api/v1.1/system/user/45
删除用户id为45的用户:
DELETE:http://192.168.0.1/api/v1.1/system/user/45
注意:可以为资源标识添加后缀,使得REST代码更加容易阅读,比如:
GET: http://192.168.0.1/api/v1.1/system/user/45.json
返回id为45的用户信息,返回格式是json
服务器向客户端返回HTTP Status以表示操作是否成功,常用的如下:
1)每一个URI代表一种资源。
2)客户端和服务器之间传递这种资源的表现层。
3)客户端通过HTTP动词,对服务器端资源进行操作,实现“表现层状态转化”。
一句话概括:URI定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
REST和WebService主要的差别就是前者是一种轻量级的架构,而后者是一种重量级架构。前者即适合终端到服务的调用,系统内部子系统的互相调用,也适合不同公司之间的系统互相调用,而WebService较为适合不同公司之间系统的调用。
注:有不明白WebService的同学请看下面的参考资料。
理解RESTful架构
RESTful API 设计指南
有关WebService的文章:
Web service是什么?
Web Service技术的SOAP实现
Web Services 系列教程
Web API知识
到底 REST 和 SOAP、RPC 有何区别?