知情本质的REST理解本真的REST架构风格(转,解释的太懂得)

REST本身是一个莫大抽象化的架构风格,因而总是慌为难对其发生一个于尖锐且印象深刻的喻。写就篇稿子的目的,是团结对学习REST的一个总结,也可望得以经这篇文章,能够吃读者真正的接头REST。

add by zhj start: 

正文主要内容

  • 什么是REST
    • REST概念
    • REST的由来
    • REST的理解
  • REST的架约束规范
    • 客户/服务器模型
    • 无状态
    • 缓存
    • 合接口
    • 分系统
    • 小结
  • 总结

Fielding在批判性继承前人研究成果的底蕴及,建立起来身钻暨评价软件架构的方法论。这套方法论的基本是“架构风格”这个概念。架构风格是一模一样栽研究和评价软件架构设计之章程,它是较架构更加空虚的定义。一栽架构风格是出于同样组相互协作的架约束来定义的。

什么是REST

REST架构风格太要的架约束有6独:

REST的概念

先行来瞧百度对REST的定义:

REST即表述性状态传递(英文:Representational State
Transfer,简称REST)是Roy
Fielding博士当2000年客的博士论文中领取出来的同等栽软件架构作风。它是平种对网络下的设计以及开发方式,可以下降开发的复杂,提高系统的可伸缩性。

  • 俺们再次多的将REST称为表述性状态转移
  • 所谓的表述性状态转移,是指向呀的表述?——资源
  • REST省多少了主语Resource(资源),全称是 Resource Representational
    State
    Transfer,即资源表述性状态转移。通俗来讲就是是:资源以网络中盖某种表现形式进行状态转移。
  • 如一个搭符合REST原则,就称其吗RESTful架构。

当针对REST更甚一步之分解之前,我们先行来看望REST的缘故,而当时对于REST的知要。

  • 客户-服务器(Client-Server)

REST的由来

第一简单询问一下作者——Roy Thomas Fielding

  • HTTP/1.0协商专家组成员
  • HTTP/1.1磋商专家组负责人
  • Apache HTTP服务器的骨干开发者
  • Apache软件基金会合作创始人

Roy Thomas Fielding

同一张图说明REST的来头:

REST的由来

好吧,这是相同摆设老简陋的觊觎,不过用来诠释REST的由于来足够了。
故事得自古秋的HTTP/1.0协商说打,随着web技术之进步,沿用多年还面向静态文档的HTTP/1.0商议无法满足web应用之开支需要,作为HTTP/1.0协议专家组成员之一之Roy
Fielding脱颖而出,成为了HTTP/1.1商量专家组的领导者,负责统筹制定新本子的商事。
Roy
Fielding和外的同事等于制订HTTP/1.1商谈的进程遭到,从技术架构层面对web之所以能得到巨大成功举行了一样旗深入之钻研以及总,之后以这些总结纳入到同效仿理论框架中,并运用就套理论框架中的指导标准,指导HTTP/1.1商的计划方向。经过三年的考订,HTTP/1.1商事于1999年6月正式成为规范。HTTP/1.1协商计划得了翻天覆地的成,在通告之后的十年里,都尚未稍微人当生修订的必备。
Fielding在成功HTTP/1.1共谋的宏图工作后,回到了加州大学欧文分校继续深造自己的博士学位。第二年(2000年)在外的博士学位论文Architectural
Styles and the Design of Network-based Software
Architectures中(中文版名吧《架构风格及基于网络的软件架构设计》),Fielding更为系统、严谨地阐述了立即套理论框架,并且采用这套理论框架推导出了同等种新的架构风格,并且为这种架构风格得到了一个令人轻松愉快的名字“REST”——Representational
State Transfer(表述性状态转移)的缩写。
马上即是REST的因,可以观看,REST架构风格,是由此推导web的艺架构因素层面要总下的,总结出的争辩框架让用来点HTTP/1.1合计的宏图方向。那么我们好如此敞亮,REST是Web自身之架构风格,REST是HTTP/1.1共谋等Web规范之规划指导原则,HTTP/1.1商事正是为贯彻REST风格的架使计划之。

通信只能由客户端单方面发起,表现吗请-响应的样式。

REST的理解

  • 无状态(Stateless)

什么是web

自打REST的来源于中我们发现,要惦记深刻理解REST,首先得询问web。
先来拘禁有些web的有关知识:

百度百科
web(World Wide
Web)即世界广域网,也叫万维网,它是一模一样栽基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息体系。是树立以Internet上之均等种植网络服务,为浏览者在Internet上摸和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上之信节点组织成一个互为为涉嫌的网状结构。

维基百科
万维网(英语:World Wide
Web
),亦发“WWW”、“Web”,是一个出于众多交互链接的超文本组成的网,通过互联网访问。
万维网并无一样互联网,万维网只是互联网所能够提供的服务之中有,是依靠在互联网运行的相同起服务。
互联网万维网措辞经常被下还并未尽多分。然而,两者是免一样的。互联网是电脑网络互相连接的天下体系。相较之下,万维网是举世收集的文件与其余资源,通过跨越链接和URIs连接。万维网资源通常采取HTTP访问,这是互联网通信协议的如出一辙栽。
万维网的核心组成部分是由于三独标准结合的:

  • 合资源标识符(URI),这是一个集合之啊资源一定的系。
  • 超文本传送协议(HTTP),它负责规定客户端与服务器怎样互相交流。
  • 超文本标记语言(HTML),作用是概念超文本文档的布局以及格式。

总结来说,web是一个由众多互为链接的超文本组成的网,它采取URI来定位系统中之各级一个资源,并经HTTP协议进行多少的相互。
重抽象的说,Web是一个分布式信息体系,为超文本文件与另对象(资源)提供访问接口和做客机制。
知了什么是web,我们就算得以再好地理解什么是REST了。作为web自身的架风格,我们一直叫起结论:REST本质上是同一栽分布式超媒体系统的应用层解决方案,它呢资源互通和资源管理之分开提出了千篇一律文山会海架构约束与原则,得到一个作用强、性能好、适宜通信的为台网为底蕴之采取软件架构。
斯结论还充分麻烦知晓,但咱得针对之产生一个定义了解。接下来我们会针对REST进行进一步详细的牵线。

通信的对话状态(Session State)应该全套出于客户端负责保护。

REST词组

要明白REST,首先用掌握(Resource)Representational State
Transfer这个短语。

  • 缓存(Cache)

资源(Resource)

REST对于信之主干抽象是资源。任何能够给取名的音讯都能看做一个资源:一卖文档、一个与日相关的服务(例如,“洛杉矶今日底气象”),一个旁资源的汇聚、一个非虚拟的目标(例如,人)等等。
换句话说,可以当创作者的超文本引用的目标(the target of an author’s
hypertext
reference)的别概念都要符合资源的概念。资源是交平等组实体的概念性映射(a
conceptual mapping),而无是于其它特定时刻和该映射相关联的实业本身。
再次标准地游说,资源R是一个随时间变化之成员函数

该函数根据时间t将资源映射到一个实体或值的联谊,集合中之价可能是资源表述(resource
representations)和/或资源标识符(resource
identifiers)(两者是当价格的)。
对一个资源来说,唯一要静态的凡炫耀的语义,因为语义才是分资源的要害。
多亏资源的此抽象概念,使得Web架构的基本力量可落实。首先,它富含了多音讯之来源,并没有人工地经项目或者实现对其加以区别,从而实现了通用性。其次,它同意引用到发表的推绑定,从而支持因请求的性能来进展内容商。最后,它同意创作者引用一个定义而未是引用这概念的某单独的发表,从而令当表述改变时无需修改所有的并存链接(假设创作者以了是地标识符)

哪来理解“对于一个资源来说,唯一要静态的是投的语义,因为语义才是分资源的重要性”这句话也?举一个简单的例子来证实一下:
“一个APP的即版”是一个资源,而“一个APP的不过平静版本”也是一个资源,尽管这简单单资源以某时刻上或会见照到平的价,但它们是是一心不同的,且少单资源能够吃单独地标识与援。

一呼百应内容可以以通信链的某处被缓存,以改善网络效率。

资源标识符

REST使用资源标识符来表示组件之间交互所涉嫌的一定资源。REST连接器提供了顾和操作资源的价集合的一个通用的接口,而毫不关心其成员函数(membership
function)是何等定义的,或者处理要的软件是何种类型。由命名权威(naming
authority)来吗资源分配资源标识符,使得引用资源变成可能,映射的语义有效性也出于同样的命名权威来当掩护(例如,确保成员函数不会见改变)。
风土的超文本网便就当一个查封的或一些的条件被运行,它们采取以信之变而改变的唯一节点还是文档标识符,并赖链接服务器(link
server)以独立于情节之主意来保障引用。因为集中式的链接服务器完全无法满足Web的超大规模和超多单团队领域的需,所以REST采用了任何的法——以来资源的创建人来选最可于标识的概念本质之资源标识符。

资源标识符为访问和操作资源的价集合提供了一个通用的接口。换句话说,我们抽象出的资源还应是只是标识的,都当负有一个显然的ID——在Web中,代表ID的联定义是:URI(统一资源标识符)。URI构成了一个大局命名空间,使用URI标识关键资源意味着这些资源得到了一个唯一、全局的ID。
选个简单的例子:如果当一个好像于Amazon.com的在线商城中,没有因此唯一的ID(一个URI)标识它的各级一样项货物,可想而知这将是何其吓人的政工决策。

  • 联合接口(Uniform Interface)

表述(Representations)

资源的表达是一模一样截对资源以某特定时刻的状态的描述。
资源以外面的求实见,可以生强发挥(或称为表现、表示)形式,在客户端以及服务端之间传递的呢是资源的表达,而无是资源本身。
例如文本资源可以利用html、xml、json等格式,图片可以采用PNG或JPG展现出。
资源的发挥包括数据与描述数据的首家数据,例如,HTTP头“Content-Type”
就是这般一个初数据性。
重新确切的说:

REST组件使用表述来捕获某个资源的手上状态或预期状态,随后在组件之间移交该表述,同过这种方法以资源上执行各种动作(perform
actions on a
resource)。表述(representation)有一个字节序列及讲述这些字节的抒元数据(representation
metadata)构成。表述的外常用但非精确的名称包括:文档、文件、HTTP消息实体、实例或变量。
发表由数量、描述数据的头条数据、以及(有时候是的)描述元数据的第一数据整合(通常用来证明信息的完整性)。
抒的数格式为誉为媒体类型(media type)。

简言之总结一下:

  • 资源总是因为某种表述为载体显示的,即序列化的信息
  • 资源的发挥是REST架构的变现层
  • 资源可以产生多还表述

通信链的零部件之间通过联合之接口相互通信,以加强交互的可见性。为了以统一接口,REST又动了有些约束:面向资源,资源来标识符URI,资源表述,一组于限且定义美的资源操作相当。

状态转移

状态转移:在客户端以及劳务器端之间变换(transfer)代表资源状态的抒发。通过易与操作资源的发表,来间接实现操作资源的目的。
拜一个网站,就象征了客户端以及服务器的一个互动过程。在这个进程中,势必涉及到多少和状态的别。
互联网通信协议HTTP协议,是一个无状态协议。这象征,所有的资源状态且保留在劳务器端。因此,如果客户端想只要操作服务器遭受的资源,必须通过某种手段,让服务器端的资源来”状态转移”(State
Transfer)。而这种转化是成立于表述之上的,所以便是”表述性状态转移”。
客户端采用的手法,在web中不怕是HTTP协议。具体来说,就是HTTP协议中,四只代表操作办法的动词:GET、POST、PUT、DELETE。它们分别针对许季种植基本操作:

  • GET——获取资源
  • POST——新建资源(也可用来创新资源)
  • PUT——更新资源
  • DELETE——删除资源

(1)面向资源的。从资源的角度想,Web经常于号称是“面向资源的”,资源得以是纸上谈兵的;

小结

Resource Representational State
Transfer,资源表述性状态转移,即就是:根据数据抽象出来的资源,以某种表现形式,通过某种手段,在网络被有状态转移,以这个来间接实现操作资源的目的。表述性状态转移(REST)架构风格是本着分布式超媒体系统中之架构元素的一样种浮泛。
于web中,具体而言:

  • 各级一个URI代表同种植资源;
  • 客户端和服务器之间,传递这种资源的某种表现层;
  • 客户端通过四单HTTP动词,对劳务器端资源拓展操作,实现”表现层状态转化”。

咱俩更来换一个角度,以搭建系统的角色来想这题材:
每当web中,为了博我们要之布于不同地区的超媒体资源,我们欠怎么规划之体系?显然,web中颇具大量之,分布在不同地方的各种类型的资源。我们要提供的凡一个重型分布式超媒体系统的应用层解决方案。
率先我们要呢所待的数目设定唯一标识,因此我们将数据开展抽象为资源,并使用统一资源标识符(URI)为每个资源设定ID,这样咱们便发出措施来操作每个资源。
那该如何操作资源为?换句话说,当我们看到一个URI并以她输入到浏览器被凡,为何浏览器知道该如何处理此URI?事实上,浏览器知道怎样去处理URI的因在:所有的资源都支持同样的接口(URI),支持一效仿同样的章程(HTTP动词)。这样,当我们团结以这种措施来定义我们自己之资源时,web中的其他人即便可轻松的获这些资源。
抱资源时,我们恐怕用不同的见方式可能需求,因此我们得对资源进行发挥,使其呈现吗咱要之形式。

从分布式系统的角度来看REST,我们发现坐资源为核心之REST确实供了一致种植缓解大型分布式资源系统的化解方案,而web的成为真说明了立套理论的不易。

(2)资源标识符。要使用一个资源,我们需要能当网络上标识它,这即是URI,Uniform
Resource
Identifier统一资源标识符。URI在HTTP中对许受URL,资源同资源标识符是相同针对几近干

REST的架构约束规范

REST作为同栽集体web服务之架构风格,提出了千篇一律名目繁多架构级约束。如果一个网满足这些约束,那该网就是为称为是RESTful的。接下来,我们会挨个说明REST的五久必要约束。

(3)资源表述。即资源的变现方式,也叫做资源视图,如XML, JSON, HTML, MP3,
JPEG等,资源同那发挥是同样针对几近干。在HTTP中通过HTTP header Accept,
Content-Type指定

客户/服务器模型

通信只能出于客户端单方面发起,表现呢呼吁-响应的形式。

客户-服务器约束背后的基准是分离关注点。通过分离用户界面和数码存储这有限个关注点,我们改进了用户界面跨多单阳台的可移植性;同时经过简化服务器组件,改善了系的可伸缩性。然而,对于Web来说,最根本之是这种关注点的诀别使得组件可独自地前进,从而支持多只组织世界的互联网规则的要求。

(4)资源的操作方法。uniform
interface,统一接口包含一组受限的定义美的操作,由它们进行资源的走访与操作,统一接口独立于资源的URI。在HTTP协议被便为GET/PUT/POST等method,

无状态

咱接下去当啊客户-服务器交互上加一个架约束:通信必须于本质上是无论状态的,从客户及服务器的每个请求都必须带有理解该要所必不可少的有所消息,不可知运用另外存储于劳动器端的上下文,会话状态因此一旦全方位封存在客户端。

眼前我们解析REST词组时,提到了资源的状态转移,而以此间,REST约束中还要饱含了不管状态通信条件,看起好像是矛盾了:既然“无状态”,又岂能说“状态转移”呢?
  其实,这里说的不论是状态通信条件,并无是说客户端应用不可知出状态,而是借助服务端不应该保留客户端状态。

这些动词都发出一定之含义,不该乱用,具体定义见RESTful
HTTP的实践。另外还包HTTP定义的应状态集合,如200
OK, 201 Created等,客户端通过HTTP
method,对劳务器端资源进行操作,实现”表现层状态转化”。

以状态及资源状态

状态应当别以状态和资源状态,客户端负责掩护以状态,而服务端维护资源状态。
客户端与劳动端的互相必须是无状态的,并以各一样不成呼吁被寓处理该要所用的满信息。服务端不欲在呼吁中保留下状态,只有以接受到实在请求的下,服务端才会关切下状态。
这种无状态通信条件,使得服务端和中介能够明白独立的求与应。
在勤告被,同一客户端也不再要依靠让同服务器,方便实现大只是扩大和高可用性的服务端。

REST(Representational State
Transfer,表述性状态转移)是指:相互链接的资源通过置换代表资源状态的发表来开展通信。超链接说白了就是URI–统一资源标识符

优点

  • 可见性——监视系统不必为了确定一个伸手的成套特性去查该要外界的几近单请求
  • 可靠性——减轻了打有故障中回复的任务量
  • 可伸缩性——不必在多单请求中保存状态,从而允许服务器组件迅速释放资源,并进而简化其实现,因为服务器不必跨多单请求保管资源的用状况
  • 分层系统(Layered System)

缺点

鉴于匪能够用状态数据保存在服务器的共享上下文中,因此多了扳平文山会海请求被发送的更数据(每次交互的开销),可能会见减低网络性。此外,将运用状态在客户端还降了服务器对同样的使行为的控制能力,因为这样一来,应用即得凭借多只客户端版本的语义的正确性贯彻。

经过限制组件的作为(即,每个组件只能“看到”与该相的紧邻层),将架设分解为多少号的重叠。

缓存

为了精益求精网络的效率,我们加加了缓存是架构约束。缓存架构要求一个呼吁的响应中的数目为隐式地要显式地记为可缓存的或者不足缓存的。如果响应是缓存的,那么客户端缓存就可以呢之后的同请求重用这个响应的数量。

  • 按需代码(Code-On-Demand,可摘)

优点

丰富缓存可能有或者任何清除一些交互,从而通过压缩一层层互动的平均延迟时间,来提高效率、可伸缩性和用户感知的性。

支持通过下载并施行有代码(例如Java
Applet、Flash或JavaScript),对客户端的功力拓展扩张。

缺点

若缓存中老的多少与用请直接发送到服务器得到的多寡差异大,那么缓存会降低可靠性。

末说一下HTTP,及HTTP与REST的涉嫌。HTTP即HyperText Transfer
Protocol,翻译成“超文本转移协议”更规范。REST是故来指导HTTP/1.1商谈计划的争鸣框架(也称为架构风格),后来Roy
Fielding对就套理论框架进行了逾系统、严谨地阐释。

合并接口

假如REST架构风格区别为外根据网络的架风格的主干特征是,它强调组件之间如果生一个合之接口。通过当组件接口及利用通用性的软件工程标准化,简化了正特的网架构,也改善了相的可见性。实现与它们所提供的劳务是解耦的的,这促进了单身地可进化性。
但,需要之交给的代价是,统一接口降低了效率,因为信息都应用规范的款式来移交,而休能够应用一定于采用的需的样式。REST接口被设计也罢可快速地移交大粒度的超媒体数据,并针对性Web的科普景象召开了优化,但是这也造成该接口对于其他花样之架构交互而言不是极优秀的。

为取得统一的接口,需要发差不多只架构约束来指导组件的行。REST由四个接口架构约束来定义:

  • 资源的分辨(identification of resources)
  • 通过发表来操作资源(manipulation of resources through
    representations)
  • 从今描述的信息(self-descriptive messages)
  • 超媒体作为以状态引擎(hypermedia as the engine of application
    state,简称HATEOAS)

对于利用HTTP的人员来说,统一接口应该是咱们懂得以及实践REST的首要,其它约束其实不必太关注

资源的辨认

每个资源还享有一个资源标识。每个资源的资源标识可以用来唯一地表明该资源。

add by zhj end

由此表达来操作资源

这边说之是资源的自描述性。一个REST系统所返的资源需要能够描述自己,并提供足够的用于操作该资源的音,比如安对资源进行添加,删除以及修改等操作。也就是说,一个杰出的REST服务不需要额外的文档对怎样操作资源进行求证。

  

自打描述的信

消息的自描述性。在REST系统中所传递的音讯需要会提供本人如何让处理的够信息。例如该消息所用的MIME类型,是否足以叫缓存等。

本文是“深入探索REST”专栏数以万计深度内容中的第二篇,它以带来您知道REST架构的来、与Web的干、REST架构的原形与特色,以及REST架构与其它架构风格中的比较。

超媒体作为以状态引擎

即使客户就可以经劳动端所返各国结果遭遇所含有的消息来获取下一致步操作所用之信息,如到底是望谁URL发送请求等。也就是说,一个一流的REST服务不需要分外的文档标示通过什么URL访问特定项目的资源,而是经服务端返回的响应来标示到底能够以拖欠资源及实行怎样的操作。一个REST服务之客户端也非需了解其他关于哪里有哪些的资源这种信息。

其一描述的着力是超媒体概念,换句话说:是链接的思辨。链接是咱们以HTML中广泛的定义,但是它的用途绝不局限为这(用于人们网络浏览)。考虑一下下面是编造的XML片段:

<order self="http://example.com/customers/1234"> 
   <amount>23</amount> 
   <product ref="http://example.com/products/4554"> 
   <customer ref="http://example.com/customers/1234"> 
</customer> </product></order>

假使你相文档中product和customer的链接,就可非常易地想象到,应用程序(已经找了文档)如何“跟随”链接检索更多之音信。当然,如果采用一个死守专用命名规范之简约“id”属性作为链接,也是中的——但是单独限于应用环境之内。使用URI表示链接的古雅的处在当受,链接可以本着由不同采取、不同服务器竟在另一个陆上上之不比企业供的资源——因为URI命名规范是天下正式,构成Web的有着资源还得互联互通。
超媒体原则还有一个重新主要的地方——应用“状态”。简而言之,实际上服务器端(如果您肯,也堪吃服务提供者)为客户端(服务消费者)提供平等组链接,使客户端能透过链接以运用由一个态改变呢其它一个态。目前,只需要记住:链接是做动态下之特别实用之主意。
本着这个标准总结如下:任何可能的状态下,使用链接指引可以给标识的东西(资源)。也正是超链接造就了现行的Web。

引子

以运动互联网、云计算迅猛发展的今天,作为同一名叫Web开发者,如果你还没听说过“REST”这个buzzword,显然已落后了。夸张点说,甚至“出了门且非好意思跟别人打招呼”。尽管如此,对于REST这个泊来品的理解,大多数人口(包括有出名的架构师)仍然停留在“盲人摸象”的级差。常常听到各种各样关于REST的说教,例如:有人说:“我们立马套新的API决定决不Web
Service(SOAP+WSDL),而是直接用HTTP+JSON,也尽管是故RESTful的法子来出。”
不用SOAP,甚至也未用XML,就自行变成了RESTful了。还有人口当:REST与习俗的Web
Service其实没有本质区别,只是于URI的组织方式提出了再度多要求,而这些要求Web
Service完全都足以实现。潜台词是:既生瑜,何生亮。Web
Service已经够好了,干嘛还要还折腾啊REST。这些对REST的差说法,果真如此吗?REST究竟是什么?是一致种植新的技艺、一种新的架、还是一如既往栽新的正统?

对这些问题笔者先不解答,为了深入了解REST是啊,我们得回顾一下Web发展的初期年代,从源头及摆讲REST是怎么得来之。

 

Web技术提高及REST的缘故

Web(万维网World Wide
Web的简称)是个健全的万花筒,不同之人头于不同的角度观察,对于Web究竟是啊会汲取大不相同的见。作为Web开发者,我们要从技术上来喻Web。从技术架构层面达到看,Web的技术架构包括了季单根本:

  • URI
  • HTTP
  • HyperText(除了HTML外,也足以是含有超链接的XML或JSON)
  • MIME

当即四只基本相互支持,促使Web这栋雄伟的高楼为几哪级数的快慢前进了四起。在及时四单基本之上,Web开发技术的上进得大概划分成以下几独号:

  1. 静态内容等:在是最初的品,使用Web的重要是一对切磋部门。Web由大量的静态HTML文档组成,其中多是部分学术论文。Web服务器可以于看成是永葆超文本的共享文件服务器。
  2. CGI程序等:在此等级,Web服务器增加了有编程API。通过这些API编写的应用程序,可以通往客户端提供部分动态变化的内容。Web服务器和应用程序之间的通信,通过CGI(Common
    Gateway Interface)协议就,应用程序被号称CGI程序。
  3. 脚本语言阶段:在这个等级,服务器端出现了ASP、PHP、JSP、ColdFusion等支撑session的脚本语言技术,浏览器端出现了Java
    Applet、JavaScript等技巧。使用这些技术,可以供更丰富的动态内容。
  4. 瘦客户端应用等:在是阶段,在劳务器端出现了单身于Web服务器的应用服务器。同时出现了Web
    MVC开发模式,各种Web
    MVC开发框架日益风行,并且占了统治地位。基于这些框架开发之Web应用,通常都是瘦客户端应用,因为它是在劳务器端生成全部的动态内容。
  5. RIA应用等:在斯路,出现了多RIA(Rich Internet
    Application)技术,大幅改善了Web应用的用户体验。应用最普遍的RIA技术是DHTML+Ajax。Ajax技术支持在非刷新页面的景况下动态更新页面中之组成部分内容。同时诞生了汪洋底Web前端DHTML开发库,例如Prototype、Dojo、ExtJS、jQuery/jQuery
    UI等等,很多开发库都支持单页面应用(Single Page
    Application)的开销。其他的RIA技术还有Adobe公司的Flex、微软公司的Silverlight、Sun公司之JavaFX(现在为Oracle公司具备)等等。
  6. 移动Web应用等:在这个等级,出现了大量面向移动设备的Web应用开发技术。除了Android、iOS、Windows
    Phone等操作系统平台原生的开发技术之外,基于HTML5的开发技术也转移得深流行。

自打上述Web开发技术的迈入进程看,Web从最初该设计者所思之关键支持静态文档的流,逐渐变得更其动态化。Web应用之交互模式,变得尤其复杂:从静态文档发展到坐情为主的门户网站、电子商务网站、搜索引擎、社交网站,再届为游戏为主的重型多人数在线娱乐、手机游戏。

 

当互联网行业,实践总是走以答辩的前头。Web发展及了1995年,在CGI、ASP等技术出现以后,沿用了多年、主要面向静态文档的HTTP/1.0商讨已黔驴技穷满足Web应用之开发需要,因此需要统筹新本子的HTTP协议。在HTTP/1.0合计专家组之中,有同等员小伙脱颖而出,显示有了超导的洞察力,后来他变成了HTTP/1.1共谋专家组的领导者。这号年青人就是Apache
HTTP服务器的核心开发者Roy Fielding,他或Apache软件基金会的协作创始人。

Roy
Fielding和他的同事等在HTTP/1.1商议的规划工作中,对于Web之所以取得巨大成功,在技能架构方面的元素做了平等洋深入之下结论。Fielding将这些总结纳入到了一如既往拟理论框架内,然后采用就套理论框架中之指原则,来指导HTTP/1.1协商的统筹方向。HTTP/1.1磋商的率先只草稿是于1996年1月宣布的,经过了三年差不多工夫之考订,于1999年6月成为了IETF的正经规范(包括了RFC
2616同用于对客户端做身份证明的RFC
2617)。HTTP/1.1合计计划之多成功,以至于发布之后一切10年岁月里,都尚未多少人口当生修订的画龙点睛。用来指导HTTP/1.1商事计划的立刻套理论框架,最初是因备忘录的样式在专家组成员中交流,除了IETF/W3C的学者圈子,并不曾在外界广泛流传。Fielding在得HTTP/1.1商量的筹划工作下,回到了加州大学欧文分校继续求学自己之博士学位。第二年(2000年)在他的博士学位论文Architectural
Styles and the Design of Network-based Software
Architectures中,Fielding更为系统、严谨地论述了就套理论框架,并且使就套理论框架推导出了同样种植新的架构风格,并且为这种架构风格得到了一个叫人轻松愉快的讳“REST”——Representational
State Transfer(表述性状态转移)的缩写。

于作者看来,Fielding这篇博士论文在Web发展史上之价值,不逊色让Web之父Tim
Berners-Lee关于超文本的那篇经典论文。然而遗憾的凡,这篇博士论文在落地后的将近5年日里,一直从未拿走足够的倚重。例如Web
Service相关规范SOAP/WSDL的设计者们,显然不大清楚REST是啊,HTTP/1.1到底是一个争的合计、为何而设计成为这法。

这种气象以2005年后发出矣异常可怜之精益求精,随着Ajax、Ruby on
Rails等新的Web开发技术的起来,在Web开发技术社区掀起了一致集再度归Web架构设计本源的活动,REST架构风格获得了逾多之关切。在2007年1月,支持REST开发的Ruby
on Rails
1.2本子正式披露,并且以支撑REST开发作为Rails未来发展着的事先内容。Ruby on
Rails的创始人DHH做了一个曰吧“World of
Resources”的美好发言,DHH在Web开发技术社区中的强劲影响力,使得REST一下子地处Web开发技术舞台之聚光灯之下。

今,各种流行的Web开发框架,几乎没不支持REST开发之了。大多数Web开发者都是经过翻阅某种REST开发框架的文档,以及由此有些例证代码来学习REST开发的。然而,通过例子代码来读书REST有充分非常的局限性。因为REST并无是一律种具体的技能,也不是一致栽具体的正经,REST其实是同等种植内涵非常丰富的架风格。通过例子代码来学学REST,除了上及均等种植有趣的Web开发技术之外,并无克到深入之知情REST究竟是呀。甚至还会误以为这些概括的事例代码就是REST本身,REST不过是相同种简单的Web开发技术而已。就像盲人摸象一样,有的人摸到了象鼻子、有的人摸到了象耳朵、有的人摸到了形状腿、有的人摸到了象尾巴。他们都坚信自己深感到的象,才是绝实际的大象,而其他人的感到还是误的。

于未知情REST的Web开发者,人们习惯让展示一些事例代码来给他们明REST,笔者非赞同上述做法。如果Web开发者想使深深明REST是呀,就大不便回避Fielding的立刻首博士论文。笔者于本文中对REST是啊的介绍,也是基于Fielding的博士论文的。尽管如此,笔者强烈建议本文的读者亲自去通读一下Fielding的博士论文,就像想要了解孔子的盘算应直接去念《论语》等做,而无是第一去读其他人的转述一样。笔者于本文中呢就是奋力不开一个管经开念错了底歪嘴和尚而已。那么,下面我们讲归正传。

在Fielding的立即首名叫吧Architectural Styles and the Design of Network-based
Software
Architectures的博士论文(中文版名也《架构风格及基于网络的软件架构设计》)中,提出了套冲网络的软件(即所谓的“分布式应用”)的计划性方,值得所有分布式应用的开发者仔细看、深入体会。

于论文的眼前三节中,Fielding在批判性继承前人研究成果的底蕴及,建立起身钻以及评价软件架构的方法论。这套方法论的核心是“架构风格”这个概念。架构风格是一模一样栽研究暨评价软件架构设计之点子,它是较架构更加空虚的定义。一栽架构风格是出于同样组相互协作的架约束来定义的。架构约束是靠软件之运作环境施加在架构设计之上的律。

于舆论的季节中,Fielding研究了Web这样一个分布式系统对于软件架构设计提出了如何需要。在第五章节中,Fielding将季章Web提出的求具体化为一些搭约束,通过慢慢丰富各种架构约束,推导出来了REST这种新的架风格。

REST架构风格的演绎过程如下图所示:

图1:REST所继承的架风格约束(本来图可当这边下载)

图片 1

当祈求1面临,每一个椭圆形里面的缩写词代表了相同种植架构风格,而各一个箭头边的单词代表了同样栽架构约束。

REST架构风格太重点的架约束有6只:

  • 客户-服务器(Client-Server)

通信只能由客户端单方面发起,表现吧请-响应的花样。

  • 无状态(Stateless)

通信的对话状态(Session State)应该全出于客户端负责掩护。

  • 缓存(Cache)

一呼百应内容可以在通信链的某处被缓存,以精益求精网络效率。

  • 联合接口(Uniform Interface)

通信链的零件之间通过合并的接口相互通信,以增长交互的可见性。

  • 旁系统(Layered System)

经过限制组件的行(即,每个组件只能“看到”与该相的紧邻层),将架设分解为几流的重叠。

  • 按需代码(Code-On-Demand,可选取)

支持通过下载并执行有代码(例如Java
Applet、Flash或JavaScript),对客户端的功能进行扩展。

于舆论中演绎出底REST架构风格如下图所示:

祈求2:REST架构风格(原先图可当此处下载)

图片 2 

假如HTTP/1.1商事作为同种植REST架构风格的架实例,其架构使下图所示:

贪图3:一个因REST的架构的长河视图(原图可在此处下载)

图片 3

用户代理处在三独相交互(a、b和c)的中间。用户代理的客户端连接器缓存无法满足请求,因此她根据每个资源标识符的性质和客户端连接器的布局,将每个请求路由于至资源的源。请求(a)被发送至一个当地代理,代理随后走访一个由此DNS查找发现的缓存网关,该网关将这请转发到一个会满足该要的来服务器,服务器的内资源由一个装进了的对象要代理(object
request
broker)架构来定义。请求(b)直接发送到一个来服务器,它能通过祥和之休息存来满足这要。请求(c)被发送至一个摄,它能够直接访问WAIS(一种与Web架构分离之音讯服务),并将WAIS的响应翻译为平种植通用的连接器接口能够分辨的格式。每一个零部件只懂与它们自己的客户端或服务器连接器的互;整个经过拓扑是咱们的视图的结局。

经比图2和图3,读者不难窥见这简单摆放图被的架是高度一致的。对于HTTP/1.1磋商为何设设计改为是样子,读者可能已经具备领悟。

在舆论的第六章中,Fielding对于到2000年竣工在Web基础架构协议的宏图与出方的片段经验教训进行了入木三分的剖析。其中,“HTTP不是RPC”、“HTTP不是平等种植传输协议”两片值得读者反复读。时到13年后的今日,对于HTTP协议的误解仍然广泛存在。

上述简要介绍了Fielding博士论文中的始末。为了帮忙读者仔细翻阅Fielding的博士论文,笔者整理了平法Fielding博士论文的导读,将于本专栏持续文章被浸透出。

分层系统

以更改良与互联网界这需要相关的一言一行,我们上加了子系统架构约束。分层系统风格通过限制组件的行事(即,每个组件只能“看到”与该相交互的相邻层),将架设分解为几层级。通过将零件对网的学问限制以纯层级内,为整个体系的扑朔迷离设置了边界,并且增长了底独立性。我们会用层级来封装遗留服务,使新的服务免受遗留客户端的震慑,做法是以非常用功能转移至一个共享中间组件中,从而简化组件的落实。中间组件还会由此支撑逾多单网和计算机的负载均衡,来改善系统的可伸缩性。

中间件:
高中级件是平种独立的系统软件或者服务程序,能够接连两只单身软件或系。分布式应用软件借助于中间件能够以不同之技艺之间共享资源。即:中间件使得若干单互相独立的系,在分别还有在不同的接口的情形下,仍然能够由此中件来落实通信。执行中间件的一个根本途径是信之传递。通过中件,应用程序可以干活于差不多个平台与OS环境被。简而言之,中间件就桥梁。

分层系统的重大缺点:增加了数处理的支出和延期,因此下跌了用户感知的属性。对于一个支撑缓存架构约束的根据网络的系来说,可以经过以中间层使用共享缓存所获的补来弥补这同样弱点。

REST详解

REST究竟是什么?因为REST的内蕴非常丰富,所以特别麻烦用一两句话解释清楚是问题。

先是,REST是Web自身的架风格。REST也是Web之所以取得成功之技艺架构方面因素的总结。REST是社会风气上最成功之分布式应用架构风格(成功案例:Web,还不够呢?)。它是啊
运行于互联网环境 的 分布式
超媒体系统量身定制的。互联网环境以及商店内网环境发生那个非常之别,最要紧的别是个别独面:

  • 可伸缩性需求无法控制:并发访问量可能会见膨胀,也或会见稳中有降。

  • 安全性要求无法控制:无法控制客户端发来之请的格式,很可能会见是黑心的乞求。

倘若所谓的“超媒体系统”,即,使用了超文本的系统。可以把“超媒体”理解为超文本+媒体内容。

REST是HTTP/1.1商量等Web规范之计划性指导规范,HTTP/1.1合计正是为实现REST风格的架使计划之。新的Web规范,其计划要符合REST的求,否则全Web的网架构会因为引入严重矛盾如果夭折。这词话未是震惊,做只类比,假如苏州市政府允许以城区著名园林的附近大型土木,建造大量享后现代作风的厦,那么快以后世界闻名的苏州园林美景将消失。

上述这些关于“REST是呀”的描述,可以总结为同句话:REST是具备Web应用都该遵照的架构设计指导原则。当然,REST并无是法律,违反了REST的指点规范,仍然会落实利用之功力。但是违反了REST的点标准,会交到良多代价,特别是对于好流量的网站而言。

万一深切理解REST,需要明白REST的五个举足轻重词:

  1. 资源(Resource)
  2. 资源的表达(Representation)
  3. 状态转移(State Transfer)
  4. 集合接口(Uniform Interface)
  5. 超文本驱动(Hypertext Driven)

啊是资源?

资源是千篇一律栽待遇服务器的方法,即,将服务器看作是由许多离散的资源整合。每个资源是服务器上一个而命名的抽象概念。因为资源是一个虚无的概念,所以其不仅能够表示服务器文件系统中之一个文书、数据库中之一律张表等等具体的东西,可以以资源计划之只要多抽象出多抽象,只要想象力允许而客户端应用开发者能够解。与面向对象设计类,资源是以名词也骨干来团的,首先关心的凡名词。一个资源可以由一个或者多个URI来标识。URI既是资源的名目,也是资源以Web上之地点。对某个资源感兴趣之客户端应用,可以由此资源的URI与该进行相互。

哟是资源的达?

资源的抒发是平段于资源在某某特定时刻的状态的描述。可以以客户端-服务器端之间变换(交换)。资源的表述得生出多格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的发表格式可以经协商机制来确定。请求-响应方向的达通常采取不同的格式。

好家伙是状态转移?

状态转移(state transfer)与状态机中的状态迁移(state
transition)的意义是不同的。状态转移说之是:在客户端以及劳动器端之间变(transfer)代表资源状态的抒发。通过转移与操作资源的发表,来间接实现操作资源的目的。

嘿是联接口?

REST要求,必须经过统一之接口来针对资源执行各种操作。对于每个资源只能执行同一组简单的操作。以HTTP/1.1协议也例,HTTP/1.1商讨定义了一个操作资源的集合接口,主要概括以下内容:

  • 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

  • HTTP头信息(可于定义)

  • HTTP响应状态代码(可从定义)

  • 平等效标准的始末商机制

  • 一如既往模仿标准的缓存机制

  • 如出一辙效仿标准的客户端位认证机制

REST还要求,对于资源执行的操作,其操作语义必须由HTTP消息体之前的有些完全表达,不能够用操作语义封装于HTTP消息体内部。这样做是为增进交互的可见性,以便为通信链的中等组件实现缓存、安全审计等等功能。

嗬是超文本驱动?

“超文本驱动”又称之为“将超媒体作为以状态的发动机”(Hypermedia As The Engine
Of Application
State,来自Fielding博士论文中的同样句话,缩写为HATEOAS)。将Web应用看作是一个是因为众状态(应用状态)组成的鲜状态机。资源中通过超链接相互关系,超链接既意味着资源间的涉及,也表示可实行之状态迁移。在超媒体之中不仅仅包含数据,还噙了状态迁移的语义。以超媒体作为引擎,驱动Web应用的状态迁移。通过超媒体暴露出服务器所提供的资源,服务器提供了什么资源是以运行时经分析超媒体发现的,而不是先行定义之。从面向服务的角度看,超媒体定义了服务器所提供劳务之商。客户端应该依靠的凡超媒体的状态迁移语义,而休应有对此是不是存在有URI或URI的某种特殊结构方式作出如。一切还出或转变,只有超媒体的状态迁移语义能够长期保持稳定。

万一读者知道了上述REST的五单关键词,就大易理解REST风格的架所怀有的6独之主要特色:

  • 面向资源(Resource Oriented)

  • 可寻址(Addressability)

  • 连通性(Connectedness)

  • 无状态(Statelessness)

  • 合并接口(Uniform Interface)

  • 超文本驱动(Hypertext Driven)

立刻6单特色是REST架构设计优秀水平之判断标准。其中,面向资源是REST最明显的特色,即,REST架构设计是为资源抽象为骨干展开的。可寻址说之是:每一个资源在Web之上都发出投机之地点。连通性说之是:应该尽量避免设计孤立的资源,除了统筹资源本身,还待统筹资源间的涉及关系,并且通过超链接将资源事关起来。无状态、统一接口是REST的少种植架构约束,超文本驱动是REST的一个首要词,在前头都曾讲了,就不再赘言了。

起架构风格的抽象高度来拘禁,常见的分布式应用架构风格来三种:

  • 分布式对象(Distributed Objects,简称DO)

搭实例有CORBA/RMI/EJB/DCOM/.NET Remoting等等

  • 长途过程调用(Remote Procedure Call,简称RPC)

搭实例有SOAP/XML-RPC/Hessian/Flash AMF/DWR等等

  • 表述性状态转移(Representational State Transfer,简称REST)

搭实例有HTTP/WebDAV

DO和RPC这有限种架构风格在企业应用中特别普遍,而REST则是Web应用之架构风格,它们中间出好非常的别。

REST同DO的别在:

  • REST支持抽象(即建模)的工具是资源,DO支持抽象的家伙是目标。在不同的编程语言中,对象的概念来特别要命差别,所以DO风格的架构通常都是同某种编程语言绑定的。跨语言交互即使会兑现,实现起来吧会非常复杂。而REST中的资源,则完全中立于开发平台和编程语言,可以以其它编程语言来贯彻。

  • DO中绝非统一接口的概念。不同的API,接口设计风格好了两样。DO也非支持操作语义对于中等组件的可见性。

  • DO中从不运用超文本,响应的情节中独包含对象自我。REST使用了超文本,可以兑现还怪粒度的交互,交互的频率比DO更胜似。

  • REST支持数据流和管道,DO不支持数据流和管道。

  • DO风格通常会带来客户端与劳动器端的紧耦合。在三种架构风格中,DO风格的耦合度是绝酷之,而REST的品格耦合度是太小之。REST松耦合的源来自于统一接口+超文本驱动。

REST同RPC的区别在:

  • REST支持抽象的家伙是资源,RPC支持抽象的工具是经过。REST风格的架构建模是以名词也核心的,RPC风格的架构建模是盖动词为基本的。简单近乎比较一下,REST是面向对象编程,RPC则是面向过程编程。

  • RPC中从不统一接口的定义。不同之API,接口设计风格好完全不同。RPC也不支持操作语义对于中组件的可见性。

  • RPC中没应用超文本,响应的情节中不过含有消息我。REST使用了超文本,可以兑现再次不行粒度的相互,交互的频率比RPC更强。

  • REST支持数据流和管道,RPC不支持数据流和管道。

  • 因运用了平台中立的消息,RPC风格的耦合度比DO风格要有些有,但是RPC风格为时常会带客户端与劳务器端的紧耦合。支持统一接口+超文本驱动之REST风格,可以上最小的耦合度。

较了三种架构风格中的反差之后,从面向实用的角度来拘禁,REST架构风格好呢Web开发者带来三点的利益:

  • 简单性

行使REST架构风格,对于开发、测试、运维人员来说,都见面还简短。可以充分利用大量HTTP服务器端和客户端开发库、Web功能测试/性能测试工具、HTTP缓存、HTTP代理服务器、防火墙。这些开发库和底蕴设备一度化了日常用品,不需要什么火箭科技(例如神奇昂贵之应用服务器、中间件)就会化解大部分可伸缩性方面的题材。

  • 可伸缩性

充分利用好通信链各个位置的HTTP缓存组件,可以拉动重新好之可伸缩性。其实过多辰光,在Web前端做性能优化,产生的机能不低让才以劳务器端做性能优化,但是HTTP协议层面的缓存常常叫有些尽人皆知的架构师完全忽略掉。

  • 松耦合

合接口+超文本驱动,带来了最可怜限度的松耦合。允许服务器端和客户端程序在好老范围外,相对独立地开拓进取。对于规划面向企业内网的API来说,松耦合并不是一个那个要紧的筹划关注点。但是对规划面向互联网的API来说,松耦合变成了一个必选项,不仅以设计时应关心,而且应该置身最优先位置。

片读者也许会见咨询:“你说了这样多,REST难道就没有任何缺点了邪?”当然不是,正而Fielding在博士论文中阐述的那么,评价一栽软件架构的高低,不可知脱离开软件之求实运作环境。永远不存适用于任何运行条件之、包治百病的银弹式架构。笔者在前强调过REST是一律种乎运行在互联网环境被的Web应用量身定制的架构风格。REST在互联网是运行环境里已经占据了执政地位,然而,在小卖部内网运行环境间,REST还见面面临DO、RPC的巨大挑战。特别是部分针对实时性要求老高之采取,REST的展现不如DO和RPC。所以用针对现实的周转条件来具体问题具体分析。但是,REST可以带动的上述三点的好处就以出企业应用时,仍然是十分有价之。所以REST在企业应用开发,特别是在SOA架构的支付被,已经获取了逾老之珍视。本专栏以发一致首文章特别介绍REST在小卖部级以中以及SOA的咬合。

到了这里,“REST究竟是啊”这个题目笔者就解答了了。本文开头那些说法是否科学,笔者还是笑而不语,读者此时应既出矣祥和之论断。在接入下去的REST系列文章被,我拿会晤呢读者澄清一些有关HTTP协议以及REST的泛误解。

参考资料:

Roy
Fielding博士论文英文版

Roy
Fielding博士论文中文版

HTTP/1.1协议RFC2616、RFC2617

感谢马国耀对本文的谋划以及校。

小结

REST架构风格由同组通过精选的架构约束组成,通过这些架构约束在候选架构上起所盼的架属性。尽管能单独考虑之中各级一个架约束,但是根据其当公私架构风格(common
architectural
styles)中之来源于来对它们进行描述,使得我们掌握选择它背后的基础理论更加爱。

总结

本文拟从实质上来喻啊是REST。
咱首先从REST的源说由,发现REST与Web之间的本来面目关系,并起Web的特征,得到REST本质上是一个分布式超媒体系统的应用层解决方案立刻同定论。接着我们对REST,即(Resource)Representational
State
Transfer(资源表述性状态转移)这个短语进行了详细分析,进一步赢得了REST以资源为基本的架风格。最后,我们本着REST架构的五长必要约束规范进行进一步的阐发与认证,以便读者能进一步深厚地理解REST。
当下首文章到此地就是终于结束了,笔者于写下这些情节的当儿还是时时感到自己文化之贫乏,以致无法更为浓厚地理解REST。笔者的立即首博客,既是指望会对好所模拟做一个总结,也意在能给任何新家带来或多或少助。文中若发生晓不当之地方,欢迎批评指点。

参考资料

  • Roy
    Fielding博士论文英文版
  • Roy Fielding博士论文中文版
  • 深入浅出REST
  • REST简介
  • 理解RESTful架构(
    阮一峰)
  • 了解本真的REST架构风格
  • RESTful架构详解
  • RESTful
    架构风格概述