1前言 :
由于 REST 可以下降开发的复杂度,提高系统的可伸缩性,增强系统的可扩大性,简化利用系统之间的集成,因此得到了广大开发人员的爱好,同时得到了业界广泛的支持。比如 IBM,Google 等公司的很多产品都提供了 REST API 给开发人员;与此同时,大量的开源项目和云计算服务都提供了
REST API 接口。
而在最近,1些新产品的开发乃至已几近完全抛弃了传统的类似 JSP 的技术, 转而大量使用 REST 风格的构架设计, 即在服务器端所有商业逻辑都以 REST API 的方式暴露给客户端, 所有阅读器用户界面使用 widget,Ajax,HTML5
等技术,用 HTTP 的方式与后台直接交互。
2:甚么是REST
REST是英文Representational State Transfer的缩写,中文翻译为“表述性状态转移”,他是由Roy
Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的1个术语。REST本身只是为散布式超媒体系统设计的1种架构风格,而不是标准。
基于Web的架构,实际上就是各种规范的集合,这些规范共同组成了Web架构。比如Http协议,比如客户端服务器模式,这些都是规范。每当我们在原有规 范的基础上增加新的规范,就会构成新的架构。而REST正是这样1种架构,他结合了1系列的规范,而构成了1种新的基于Web的架构风格。
3:REST规范
(1)客户-
服务器
这类规范的提出,改良了用户接口跨多个平台的可移植性,并且通过简化
服务器组件,改良了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成了可能。
(2)无状态性
无状态性是在客户-
服务器束缚的基础上添加的又1层规范。他要求通讯必须在本质上是无状态的,即从客户到
服务器的每一个request都必须包括理解该 request所必须的所有信息。这个规范改良了系统的可见性(无状态性使得客户端和
服务器端没必要保存对方的详细信息,
服务器只需要处应当前 request,而没必要了解所有的request历史),可靠性(无状态性减少了
服务器从局部毛病中恢复的任务量),可伸缩性(无状态性使得
服务器端可以 很容易的释放资源,由于
服务器端没必要在多个request中保存状态)。同时,这类规范的缺点也是不言而喻得,由于不能将状态数据保存在
服务器上的同享上
下文中,因此增加了在1系列request中发送重复数据的开消,严重的下降了效力。
(3)缓存
为 了改良无状态性带来的网络的低效性,我们填加了缓存束缚。缓存束缚允许隐式或显式地标记1个response中的数据,这样就赋予了客户端缓存 response数据的功能,这样就能够为以后的request共用缓存的数据,部份或全部的消除1部份交互,增加了网络的效力。但是用于客户端缓存了信 息,也就同时增加了客户端与
服务器数据不1致的可能,从而下降了可靠性。
B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改良这类情况,我们引入了REST。
REST在原本的架构上增加了3个新规范:统1接口,分层系统和按需代码。
(4)统1接口
REST 架构风格的核心特点就是强调组件之间有1个统1的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用的链接器接口对 资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改良了系统的交互性和可重用性。并且REST针对Web的常见情况 做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就致使了REST接口对其它的架构其实不是最优的。
(5)分层系统
分层系统规则的加入提高了各种层次之间的独立性,为全部系统的复杂性设置了边界,通过封装遗留的服务,使新的
服务器免受遗留客户真个影响,这也就提高了系统的可伸缩性。
(6)按需代码
REST允许对客户端功能进行扩大。比如,通过下载并履行applet或脚本情势的代码,来扩大客户端功能。但这在改良系统可扩大性的同时,也下降了可见性。所以它只是REST的1个可选的束缚。
4: REST的设计准则
REST架构是针对Web利用而设计的,其目的是为了下降开发的复杂性,提高系统的可伸缩性。REST提出了以下设计准则:
网络上的所有事物都被抽象为资源(resource);
每一个资源对应1个唯1的资源标识符(resource identifier);
通过通用的连接器接口(generic connector interface)对资源进行操作;
对资源的各种操作不会改变资源标识符;
所有的操作都是无状态的(stateless)。
REST中的资源所指的不是数据,而是数据和表现情势的组合,比如“最新访问的10位会员”和“最活跃的10为会员”在数据上可能有堆叠或完全相同,而 由于他们的表现情势不同,所以被归为不同的资源,这也就是为何REST的全名是Representational State Transfer的缘由。资源标识符就是URI(Uniform Resource Identifier),不论是图片,Word还是视频文件,乃至只是1种虚拟的服务,也不管你是xml格式,txt文件格式还是其它文件格式,全部通过 URI对资源进行唯1的标识。
REST是基于Http协议的,任何对资源的操作行动都是通过Http协议来实现。以往的Web开发大多数用的都是Http协议中的GET和POST方 法,对其他方法很少使用,这实际上是由于对Http协议认识片面的理解酿成的。Http不单单是1个简单的运载数据的协议,而是1个具有丰富内涵的网络软 件的协议。他不单单能对互联网资源进行唯1定位,而且还能告知我们如何对该资源进行操作。Http把对1个资源的操作限制在4个方法之内:GET, POST,PUT和DELETE,这正是对资源CRUD操作的实现。由于资源和URI是逐一对应的,履行这些操作的时候URI是没有变化的,这和以往的
Web开发有很大的区分。正由于这1点,极大的简化了Web开发,也使得URI可以被设计成更加直观的反应资源的结构,这类URI的设计被称作 RESTful的URI。这位开发人员引入了1种新的思惟方式:通过URL来设计系统结构。固然了,这类设计方式对1些特定情况也是不适用的,也就是说不 是所有的URI都可以RESTful的。
REST 之所以可以提高系统的可伸缩性,就是由于它要求所有的操作都是无状态的。由于没有了上下文(Context)的束缚,做散布式和集群的时候就更加简单,也 可让系统更加有效的利用缓冲池(Pool)。并且由于
服务器端不需要记录客户真个1系列访问,也减少了
服务器真个性能。
5:如何使用REST
对开发人员来 说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不单单是1种崭新的架构,它带来的更是1种全新的Web开发进程中的思惟方式:
通过URL来设计系统结构。在REST中,所有的URL都对应着资源,只要URL的设计是良好的,那末其显现的系统结构也就是良好的。这点和TDD (Test Driven Development)很相似,他是通过测试用例来设计系统的接口,每个测试用例都表示1系列用户的需求。开发人员不需要1开始就编写功能,而只需要
把需要实现的功能通过测试用例的情势表现出来便可。这个和REST中通过URL设计系统结构的方式类似,我们只需要根据需求设计出公道地URL,这些 URL不1定非要链接到指定的页面或完成1些行动,只要它们能够直观的表现出系统的用户接口。根据这些URL,我们就能够方便的设计系统结构。从 REST架构的概念上来看,所有能够被抽象成资源的东西都可以被指定为1个URL,而开发人员所需要做的工作就是如何能把用户需求抽象为资源,和如何抽 象的精确。由于对资源抽象的越为精确,对REST的利用来讲就越好。这个和传统MVC开发模式中基于Action的思想差别就非常大。设计良好的URL,
不但对开发人员来讲可以更明确的认识系统结构,对使用者来讲也方便记忆和辨认资源,由于URL足够简单和成心义。依照以往的设计模式,很多URL后面都 是1堆参数,对使用者来讲也是很不方便的。
6:REST和MVC的选择
既然REST这 么好用,那末是否是所有的Web利用都能采取此种架构呢?答案是不是定的。我们知道,直到现在为止,MVC(Model-View-Controller)
模式仍然是Web开发最普遍的模式,绝大多数的公司和开发人员都采取此种架构来开发Web利用,并且其思惟方式也停留于此。MVC模式由数据,视图和控制 器构成,通过事件(Event)触发Controller来改变Model和View。加上Webwork,Struts等开源框架的加入,MVC开发模
式已相当做熟,其思想根本就是基于Action来驱动。从开发人员角度上来讲,冒然接受1个新的架构会带来风险,其中的不肯定因素太多。并且REST新
的思惟方式是把所有用户需求抽象为资源,这在实际开发中是比较难做到的,由于其实不是所有的用户需求都能被抽象为资源,这样也就是说不是全部系统的结构都能 通过REST的来表现。所以在开发中,我们需要根据以上2点来在REST和MVC中做出选择。我们认为比较好的办法是混用REST和MVC,由于这合适绝
大多数的Web利用开发,开发人员只需要对照较容易能够抽象为资源的用户需求采取REST的开发模式,而对其它需求采取MVC开发便可。这里需要提到的就 是ROR(Ruby on Rails)框架,这是1个基于Ruby语言的愈来愈流行的Web开发框架,它极大的提高了Web开发的速度。更加重要的是,ROR(从1.2版本起)框 架是第1个引入REST做为核心思想的Web开发框架,它提供了对REST最好的支持,也是现今最成功的利用REST的Web开发框架。实际上,ROR的 REST实现就是REST和MVC混用,开发人员采取ROR框架,可以更快更好的构建Web利用。