`
deng131
  • 浏览: 662042 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Web设计之REST架构风格

阅读更多
REST架构风格是全新的针对Web应用的开发风格,是当今世界最成功的互联网超媒体分布式系统架构,它使得人们真正理解了Http协议本来面貌。随着 REST架构成为主流技术,一种全新的互联网网络应用开发的思维方式开始流行。
! _) i5 P! T1 r2 I3 d% _( W! w7 m0 e
     REST是什么
1 `8 h% H5 D5 {# J$ d/ k3 Y1 `8 [( @) y$ f5 ~
     REST是英文Representational State Transfer的缩写,中文翻译为“表述性状态转移”,他是由Roy Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。 / H3 Z8 T; Y- H) a; J/ t1 }5 R

) R9 h" @( d# O; C3 }2 j     基于Web的架构,实际上就是各种规范的集合,这些规范共同组成了Web架构。比如Http协议,比如客户端服务器模式,这些都是规范。每当我们在原有规 范的基础上增加新的规范,就会形成新的架构。而REST正是这样一种架构,他结合了一系列的规范,而形成了一种新的基于Web的架构风格。
6 g% H. ]' z! l5 {6 m+ _) O! z  ?. K
0 s5 Z! y. m; M) |' D3 Z     传统的Web应用大都是B/S架构,它包括了如下一些规范 。
+ K( _& r! c& b( L$ T  u# U1 c: k! U
     客户-服务器
; L- O8 M! v! Q5 X8 ]2 f# u$ ~3 V- u9 g( \* o
这种规范的提出,改善了用户接口跨多个平台的可移植性,并且通过简化服务器组件,改善了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成为了可能。
& x. O2 O: l+ R  k. L3 u" v     无状态性   j3 X. ], r5 J/ X+ P2 S. z  Z% K
; k4 q5 h* p. K( O' c" H
无 状态性是在客户-服务器约束的基础上添加的又一层规范。他要求通信必须在本质上是无状态的,即从客户到服务器的每个request都必须包含理解该 request所必须的所有信息。这个规范改善了系统的可见性(无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前 request,而不必了解所有的request历史),可靠性(无状态性减少了服务器从局部错误中恢复的任务量),可伸缩性(无状态性使得服务器端可以 很容易的释放资源,因为服务器端不必在多个request中保存状态)。同时,这种规范的缺点也是显而易见得,由于不能将状态数据保存在服务器上的共享上 下文中,因此增加了在一系列request中发送重复数据的开销,严重的降低了效率。 ; q( S. y% o4 N8 S
     缓存 6 _' z1 u% s6 g5 M. _- ~
( @) y  j! l# Y1 z- a
为 了改善无状态性带来的网络的低效性,我们填加了缓存约束。缓存约束允许隐式或显式地标记一个response中的数据,这样就赋予了客户端缓存 response数据的功能,这样就可以为以后的request共用缓存的数据,部分或全部的消除一部分交互,增加了网络的效率。但是用于客户端缓存了信 息,也就同时增加了客户端与服务器数据不一致的可能,从而降低了可靠性。
  c% k9 F5 m3 M     B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改善这种情况,我们引入了REST。 ! {# D: I+ K$ S* ^

6 i% U  B) \1 ]( [4 L     REST在原有的架构上增加了三个新规范:统一接口,分层系统和按需代码。 6 A! H- E! W0 b1 L/ \' c
3 |- U% v. ]; R; B8 ]3 z
     统一接口 0 M+ k& a: @, M( m. }- }

3 ^7 U1 E3 k6 u! Y# [REST 架构风格的核心特征就是强调组件之间有一个统一的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用的链接器接口对 资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性。并且REST针对Web的常见情况 做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就导致了REST接口对其它的架构并不是最优的。 7 x$ X% F! a& ~0 W2 M
      分层系统
( ~  p: U" ^; x! v" K' D9 T) @7 P* q/ E/ P
分层系统规则的加入提高了各种层次之间的独立性,为整个系统的复杂性设置了边界,通过封装遗留的服务,使新的服务器免受遗留客户端的影响,这也就提高了系统的可伸缩性。 : ~9 k- L, \# T2 T0 d3 r
     按需代码 2 s8 _, A* c+ c' L! l$ {) k, e
7 ?9 `, w$ T: ^2 {' _
REST允许对客户端功能进行扩展。比如,通过下载并执行applet或脚本形式的代码,来扩展客户端功能。但这在改善系统可扩展性的同时,也降低了可见性。所以它只是REST的一个可选的约束。
4 A5 L9 W; y6 u$ }
5 J2 x) X2 A' q. z/ ~, x     REST的设计准则
" W: O. p7 }6 K3 _% b) P
& I1 A- {% I1 L% X2 I/ `      REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则: + p+ m) l' K$ x3 c+ n9 Z
! R0 E4 B" h4 H/ `& E4 x; h
网络上的所有事物都被抽象为资源(resource);
/ r1 [6 S& k1 D' [每个资源对应一个唯一的资源标识符(resource identifier);
( ?: q! x. |( s8 [) J% m3 R" P通过通用的连接器接口(generic connector interface)对资源进行操作; 4 K& a3 w) F- l/ O7 }
对资源的各种操作不会改变资源标识符; ' A- P* h) n8 h. n- Z
所有的操作都是无状态的(stateless)。 ' ~. h4 }2 T( r$ y7 w3 e
     REST中的资源所指的不是数据,而是数据和表现形式的组合,比如“最新访问的10位会员”和“最活跃的10为会员”在数据上可能有重叠或者完全相同,而 由于他们的表现形式不同,所以被归为不同的资源,这也就是为什么REST的全名是Representational State Transfer的原因。资源标识符就是URI(Uniform Resource Identifier),不管是图片,Word还是视频文件,甚至只是一种虚拟的服务,也不管你是xml格式,txt文件格式还是其它文件格式,全部通过 URI对资源进行唯一的标识。 1 ]8 S8 F8 }9 P+ m; l3 x5 t" n! Y$ `
, G* I0 M6 f) B8 v2 N
     REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。以往的Web开发大多数用的都是Http协议中的GET和 POST方 法,对其他方法很少使用,这实际上是因为对Http协议认识片面的理解造成的。Http不仅仅是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软 件的协议。他不仅仅能对互联网资源进行唯一定位,而且还能告诉我们如何对该资源进行操作。Http把对一个资源的操作限制在4个方法以内:GET, POST,PUT和DELETE,这正是对资源CRUD操作的实现。由于资源和URI是一一对应的,执行这些操作的时候URI是没有变化的,这和以往的 Web开发有很大的区别。正由于这一点,极大的简化了Web开发,也使得URI可以被设计成更为直观的反映资源的结构,这种URI的设计被称作 RESTful的URI。这位开发人员引入了一种新的思维方式:通过URL来设计系统结构。当然了,这种设计方式对一些特定情况也是不适用的,也就是说不 是所有的URI都可以RESTful的。 / ~  e6 V, ]3 U% @4 c1 f/ [# P
0 s# F, B# O5 l, n
      REST 之所以可以提高系统的可伸缩性,就是因为它要求所有的操作都是无状态的。由于没有了上下文(Context)的约束,做分布式和集群的时候就更为简单,也 可以让系统更为有效的利用缓冲池(Pool)。并且由于服务器端不需要记录客户端的一系列访问,也减少了服务器端的性能。 # d9 p1 v8 j, C* A7 I2 Q4 K+ d
4 o1 c! Y  ?+ h6 q$ r) N& T
     ( Z* j) o3 ^- h2 M: p2 B

$ m9 C1 b( Z, R" ~1 x! P' q6 b7 F# G    使用REST架构 . C, p* m1 l+ L( p& ^4 U

. q: D( S. o$ T. k- W# P, U- q     对于开发人员来 说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式: 通过URL来设计系统结构。在REST中,所有的URL都对应着资源,只要URL的设计是良好的,那么其呈现的系统结构也就是良好的。这点和TDD (Test Driven Development)很相似,他是通过测试用例来设计系统的接口,每一个测试用例都表示一系列用户的需求。开发人员不需要一开始就编写功能,而只需要 把需要实现的功能通过测试用例的形式表现出来即可。这个和REST中通过URL设计系统结构的方式类似,我们只需要根据需求设计出合理地URL,这些 URL不一定非要链接到指定的页面或者完成一些行为,只要它们能够直观的表现出系统的用户接口。根据这些URL,我们就可以方便的设计系统结构。从 REST架构的概念上来看,所有能够被抽象成资源的东西都可以被指定为一个URL,而开发人员所需要做的工作就是如何能把用户需求抽象为资源,以及如何抽 象的精确。因为对资源抽象的越为精确,对REST的应用来说就越好。这个和传统MVC开发模式中基于Action的思想差别就非常大。设计良好的URL, 不但对于开发人员来说可以更明确的认识系统结构,对使用者来说也方便记忆和识别资源,因为URL足够简单和有意义。按照以往的设计模式,很多URL后面都 是一堆参数,对于使用者来说也是很不方便的。
6 F% g4 Y- q: @2 [( o+ M9 `
" Q8 Q5 V/ e' T5 M" X, O. y     既然REST这 么好用,那么是不是所有的Web应用都能采取此种架构呢?答案是否定的。我们知道,直到现在为止,MVC(Model-View-Controller) 模式依然是Web开发最普遍的模式,绝大多数的公司和开发人员都采取此种架构来开发Web应用,并且其思维方式也停留于此。MVC模式由数据,视图和控制 器构成,通过事件(Event)触发Controller来改变Model和View。加上Webwork,Struts等开源框架的加入,MVC开发模 式已经相当成熟,其思想根本就是基于Action来驱动。从开发人员角度上来说,贸然接受一个新的架构会带来风险,其中的不确定因素太多。并且REST新 的思维方式是把所有用户需求抽象为资源,这在实际开发中是比较难做到的,因为并不是所有的用户需求都能被抽象为资源,这样也就是说不是整个系统的结构都能 通过REST的来表现。所以在开发中,我们需要根据以上2点来在REST和MVC中做出选择。我们认为比较好的办法是混用REST和MVC,因为这适合绝 大多数的Web应用开发,开发人员只需要对比较容易能够抽象为资源的用户需求采取REST的开发模式,而对其它需求采取MVC开发即可。这里需要提到的就 是ROR(Ruby on Rails)框架,这是一个基于Ruby语言的越来越流行的Web开发框架,它极大的提高了Web开发的速度。更为重要的是,ROR(从1.2版本起)框 架是第一个引入REST做为核心思想的Web开发框架,它提供了对REST最好的支持,也是当今最成功的应用REST的Web开发框架。实际上,ROR的 REST实现就是REST和MVC混用,开发人员采用ROR框架,可以更快更好的构建Web应用。 . ]5 u; Z1 \" r0 y1 F

, g. g# y" ?$ f/ D' O8 c! T
  J( _0 b, H# r% v, t    对开发人员来说,REST不仅仅在Web开发上贡献了自己的力量,同时也让我们学到了如何把软件工程原则系统地应用于对一个真实软件的设计和评估上。

分享到:
评论

相关推荐

    WEB框架——REST原理(架构风格与基于网络的软件架构设计)

    WEB框架——REST原理(架构风格与基于网络的软件架构设计)

    rest架构web实例

    rest架构风格,web实例、rest架构风格,web实例

    Ajax和REST之1:Ajax REST架构风格对于融入式Web

    新兴的Ajax Web客户机架构风格让融入式Web应用程序与REST架构风格协调一致。使它们可以尽享REST那些出色的特性,同时又消除了应用程序违背REST准则时带来的不良特性。本文讨论了对于那些需要动态和个性化的用户界面...

    REST架构风格详解

    但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。 另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要...

    架构风格与基于网络的软件架构设计(Restful API)-中英文

    web之父的博士论文,Restful API的最佳描述。这篇论文定义了一个框架,...然后我介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了如何使用REST来指导现代Web架构的设计和开发。

    基于REST架构风格的Web+20实现.pdf

    基于REST架构风格的Web+20实现.pdf

    理解本真的REST架构风格

    本文是“深入探索REST”专栏系列深度内容中的第二篇,它将带您领略REST架构的起源、与Web的关系、REST架构的本质及特性,以及REST架构与其他架构风格之间的比较。在移动互联网、云计算迅猛发展的今天,作为一名Web...

    架构风格与基于网络的软件架构设计

    这篇论文定义了一个框架,致力于通过架构风格来理解软件架构,并且...然后 我介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了 如何使用 REST 来指导现代 Web 架构的设计和开发。

    REST式架构及实践

    REST(Representational State Transfer):表述性状态转移,分布式超媒体软件的一种架构风格。源自2000年Roy Thomas Fielding的博士论文。 一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。 ...

    rest风格webservice框架

    RESTLET介绍 Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架。它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务。...该程序已经实现了rest风格的API,二次开发非常方便!

    架构风格和基于网络的软件架构设计

    Roy Fielding REST web 标准的创建者,在其博士论文中首次提出REST的架构模式

    java rest api入门实例

    REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...

    REST与面向资源的Web开发

    什么是Web 什么是REST ...REST风格架构的设计步骤 REST与安全性 REST风格架构带来的好处 关于HTTP的一些误解 关于REST的一些误解 各种编程语言对于REST的支持 REST与Web服务 REST与SOA REST不适用的场合

    架构风格与基于网络的软件架构设计-博士论文

    他为 Web 架构的设计作出极其杰出的贡献,他的工作为 Web 架构奠 定了坚实的基础。 译者简介: 李锟(ajaxcn.org 网站 站长)、廖志刚(91yee 翻译社区 负责人)、刘丹(Matrix 技术社 区负责人)、杨光(《重构与模式》的...

    详解REST架构风格

    本文来自于segmentfault.com,一起了解REST的内在...REST的提出者RoyFielding在Web界是一位举足轻重的人物,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席……Fie

    REST_cn 中文版

    然后我介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了如何使用REST来指导现代Web架构的设计和开发。 REST强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来...

Global site tag (gtag.js) - Google Analytics