概述:
越来越多的人开始意识到,网站即软件,网站是一种新型的软件.
这种"互联网架构"采用 客户端/服务端 模式,建立在分布式体系上的,通过互联网通信,具有高时延、高并发等特点.
网站的开发,完全可以可以采用软件开发的模式.但是在传统上,互联网和软件是两个不同的领域,很少有交集.
软件开发主要面对的是单机环境(比如坦克大战等小游戏)
网络主要研究的是系统之间的通信(关注点在于通信的协议,通信效率,通信的延时)
而,互联网的兴起,使得这两个领域开始融合,现在我们必须思考:如何开发出在互联网中使用的软件!
RESTful架构就是一种目前最流行的互联网软件架构.他结构清晰、符合标准、易于理解、方便扩展,所以,RESTful架构正被越来越多的网站/互联网产品采用
下面,谈谈我个人理解的RESTful架构
一、起源
Roy Thomas Fielding 在2000年的博士论文中提出:
"本文研究计算机科学两大前沿----软件和网络----的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"
(This dissertation explores a junction on the frontiers of two research disciplines in computer science: software and networking. Software research has long been concerned with the categorization of software designs and the development of design methodologies, but has rarely been able to objectively evaluate the impact of various design choices on system behavior. Networking research, in contrast, is focused on the details of generic communication behavior between systems and improving the performance of particular communication techniques, often ignoring the fact that changing the interaction style of an application can have more impact on performance than the communication protocols used for that interaction. My work is motivated by the desire to understand and evaluate the architectural design of network-based application software through principled use of architectural constraints, thereby obtaining the functional, performance, and social properties desired of an architecture. )
二、名称
在这篇文章描述了一个互联网软件的软件架构(或者叫互联网软件的设计原则)(REFS原则),只要符合这个原则的软件/架构,就说它符合REFS原则.
REST,即Representational State Transfer的缩写.我对这个词组的翻译是"表现层状态转化"
三、资源
"表现层状态转化"省略了主语,"表现层"指的是"资源(Resources)的表现层"
"资源"是指网络上的一个实体,或者说是互联网中的一个具体信息.它可以是一段文本,一张图片或者一个服务等,总之,他是一种具体实体.
每个资源对应这个唯一的一个"URI",在网络中,我们可以通过访问这个URI来获取指定的资源.
所谓的上网就是与互联网上的"资源"进行互动,调用它的URI.
四、表现层(Representational)
"资源"是一种实体,它可以有很多表现形式.我们把Resources的表现形式叫做"表现层"(Representational).
举个栗子:
文件文件的表现形式可以是txt,也可以是html/json或者xml,甚至可以是二进制文件
图片可以是JPG,也可以是PNG
URI只是实体资源,它不是资源形式.严格的说,有些网址最后的html后缀也不是必要的,因为这个后缀名表示的是格式.
其实URI的实际格式表示应该是HTTP请求头信息中的Accept和Content-Type字段指定的.这两个字段才是具体表现层的描述.
五、状态转化(state Transfer)
访问一个网站,就代表客户端和服务器的一个互动过程.这个过程势必会涉及到数据和状态的变换.
另外,HTTP协议是一种无状态的协议,意味着所有的状态必须保存在服务器端.因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化",而这种转换是建立在表现层上面的,所以就是"表现层状态转化"
还有,客户端使用的手段只能是HTTP协议.具体的讲,HTTP协议中,有四个表示操作方式的动词,GET、POST、PUT、DELETE.他们负责对应四种基本操作:get负责获取资源,post负责新建资源,put负责更新资源,delete负责删除资源.
六、综述
那么RESTful原则是什么?
1)每一个URI只代表一个资源
2)客户端和服务器之间,传递这种资源的某种表现层
3)客户端通过HTTP协议的四个动词,对服务器端的资源进行操作,实现"表现层状态转化"
七、常见的RESTful架构的误区:
1. URI包含动词:以为URI是一种资源,是实体,是名词.动词应该放在HTTP协议中.
eg:如网上汇款,从账户1向账户2汇款500元
错误的URI是:
POST /accounts/1/transfer/500/to/2
正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:
POST /transaction HTTP/1.1
Host: 127.0.0.1
from=1&to=2&amount=500.00
2.另一个设计误区,就是在URI中加入版本号:
http://www.example.com/app/1.0/foo
http://www.example.com/app/1.1/foo
http://www.example.com/app/2.0/foo
因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分
Accept: vnd.example-com.foo+json; version=1.0
Accept: vnd.example-com.foo+json; version=1.1
Accept: vnd.example-com.foo+json; version=2.0