收藏 分享(赏)

Representational State Transfer表述性状态转移.txt

上传人:jw66tk88 文档编号:4117371 上传时间:2018-12-10 格式:TXT 页数:5 大小:18.44KB
下载 相关 举报
Representational State Transfer表述性状态转移.txt_第1页
第1页 / 共5页
Representational State Transfer表述性状态转移.txt_第2页
第2页 / 共5页
Representational State Transfer表述性状态转移.txt_第3页
第3页 / 共5页
Representational State Transfer表述性状态转移.txt_第4页
第4页 / 共5页
Representational State Transfer表述性状态转移.txt_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、Representational State Transfer表述性状态转移REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:1.网络上的所有事物都被抽象为资源(resource); 2.每个资源对应一个唯一的资源标识(resource identifier); 3.通过通用的连接器接口(generic connector interface)对资源进行操作; 4.对资源的各种操作不会改变资源标识; 5.所有的操作都是无状态的(stateless

2、)。 对于当今最常见的网络应用来说,resource identifier是url,generic connector interface是HTTP,第4条准则就是我们常说的url不变性。这些概念中的resouce最容易使人产生误解。resouce所指的并不是数据,而是数据+特定的表现形式(representation),这也是为什么REST的全名是Representational State Transfer的原因。举个例子来说,“ 最 的10 和“ 最 的10 数据上可 有 (有一 , ), 全 。是 们的representation不 ,因 是不 的resource。 REST 所以 开

3、发,是因为 的 ,Rails 1.2中对REST的现currency1controller中的方“ 7个:indexshowneweditcreateupdate和 destory,这上就是对CURD的现。fi进一fl ,Rails(也是当今网络应用)使用HTTP作为generic connector interface,HTTP则currency1对一个url的操作“ 了4个 :GETPOSTPUT和DELETE。 REST 所以 提高系统的可伸缩性,是因为 所有操作都是stateless的,这就有context的,”式”,就不 context的了。 , 系统可以有使用pool。REST对性

4、 的一个提来 对client和server的 :server提resource以 操作resource的 ,而client据resource中的data和representation ”render。这就 了 器的开 。 REST有这的 , 我们应 无 一些 ( DHH)都开 了REST的 , 我们这些人应 ”什么 说 什么 我 我们应 个: 使用REST; REST和MVC的系。 第一个设REST是我们应 用的 , 使用;第 个则说 REST和当 最普遍应用的MVC是什么系,互补还是取代 我们先来谈谈第一个, 使用REST。我感,REST除了给我们带来了一个崭新的 以外,还有一个 的贡献是

5、开发系统过程中的一种新的维方式:通过url来设计系统的结 。 据REST,每个url都代表一个resource,而整个系统就是由这些resource组成的。因 ,url是设计良 的, 么系统的结 就也应 是设计良 的。对于非高手级的开发人员来说, 一个系统 总是一个很抽象的。敏捷开发所提倡的Test Driven Development, 一(我 是最的 )就是可以通过testcase直观设计系统的接口。 还有创建一个class的候就编 一个testcase,虽 设置不 通过编译, 是testcase中的方调用可以很 从class使用 的角度 映出 的接口,从而为 class的设计提了直观的表

6、现。这与 REST 中通过url设计系统结 非常类似。虽 我们连一个功 都有现, 是我们可以先设计出我们为合理的url,这些url 不 连接 page action, 是 们直观告诉我们:系统对用户的访接口就应 是这。 据这些url,我们可以很方便设计系统的结 。让我 这里 申一遍:REST允许我们通过url设计系统,就 Test Driven Development允许我们使用testcase设计class接口一。 OK, url有这的 , 我们就着 一下 设计url。网络应用通常都是有 hierarchy的, 棵树。我们通常希望url也 映出资源的层次性。对于一个blog应用:/artic

7、les表示所有的文章, /articles/1表示id为1的文章,这都较直观。遗憾的是,网络应用的资源结 永远不会 单。因 人们常常会这一个:RESTful的url 覆盖所有的用户请求吗 ,login RESTful search RESTful 从REST的概念上来看,所有可以被抽象为资源的东东都可以使用RESTful的url。因 对于上面的 个,login和search可以被抽象为资源, 么就可以使用RESTful的url。search较 单,因为 会返回搜索结,因 可以被抽象为资源,并且现index方就可以了( 显示搜索结,有createdestory 类的东西)。而这里面也有一个:se

8、arch的键字 传给server index方显 应 使用HTTP GET,这会currency1键字加 url面,当 不符合REST的风格。解决这个,可以currency1每次search看作一个资源,因创建create和 index方,create用来 用户点击“搜索 按钮是通过HTTP POSTcurrency1键字传给server, index则用来显示搜索结。这一来,我们还可以记录用户的搜索历史。使用 的方,我们也可以对 login应用REST, 每次login动作是一个资源。 现 ,我们来看复杂一些的东东。用url表达“category为ruby的 article” 一开可 想 的

9、是/category/ruby/articles,这种想很直观。 是我 里面的category是不 的,我们可以直接currency1“/ruby”理解为“category是ruby”,也就是说“ruby”出现的位置说 了 指的就是category。OK, /ruby/articles,单单从这个url上看,我们 获 多 于category的信息 显 category隐藏 了url面,这” 底 不,应 是仁 见仁,智 见智了。对于 表达category这的东西,我还想出很 的方式,家有什么 idea,可以一 。 外还有一种url形式, 对应 程 中的 系。product是一个 类,book和c

10、omputer是 子类。 么所有产 的url应 是/products,所有 的url应 是/books,所有 的url应 是 /computers。这一想就较直观了,而且 次 了url可以 我们进行设计的 点。 让我 说 一下我的想:每个用户 求都可以抽象为资源, 么就可以 全使用REST。 由 看来,使用REST的键是 抽象资源,抽象 ,对REST的应用就 。因 , 改变我们 的 于action的想是最 的。 有了对第一个的 ,第 个就容易 多了。REST会取代MVC吗 还是 是互补系(就 AOP对于OOP) 是It depends我们可以currency1所有的用户 求都可以抽象为资源,

11、么MVC就可以 出历史的 了。 , 么我们就 合使用REST和 MVC。 当 ,这是非常理想的 。可 我们无 一种方可以currency1所有的用户 求都抽象为资源,因为 这种抽象的 整性( 的是所有 求都可以) 形式 的 。而且 使被 出来了,由于开发人员的 和 不 ,MVC定也会成为不 人的。 是对于希望 REST的人来说,这些都有系。 开发的系统所设计的可以被合理抽象为资源, 么REST就会成为 的开发器。REST键原则对REST的currency1是以 “式的定 和作为开的。 这fi且先按下不表,我先提出一个 单fl的定 :REST定 了应 “ 使用(这和多数人的使用方式有很不 )We

12、b标准,例HTTP和URI。 设计应用程 REST原则, 就示着 会 一个使用了 Web (这让 )的系统。总 ,条键原则举下: 为所有“事物 定 ID 所有事物”接 一 使用标准方 资源多 表述 无状态通信 下面让我们进一fl这些原则。为所有“事物 定 ID这里我使用了“事物 来代fi“式准 的 “资源 ,因为一条 单的原则,不应 被 当中。一下人们 建的系统,通常会 一系 被标识的键抽象。每个事物都应 是可标识的,都应 有一个 显的ID Web中,代表ID的统一概念是:URI。URI 成了一个全名,使用URI标识 的键资源着 们获 了一个唯一全的ID。 对事物使用一的名 则(naming

13、scheme)最的 就是 不 提出 的 则而是 个被定 , 全 中 行,并且 被 多数人所理解的 则。想一下 建的上一个应用(设 不是用RESTful方式 建的)中的一个高级对象(high-level object), 就很有可 看 许多从使用唯一标识中的用例。, 的应用中 一个对 的抽象, 么我可以 当定,用户会希望一个指 个 的”接, 通过 子 发 事 里, 加 器的 中, 上。fi : 一个类似于A的 中,有用唯一的ID(一个URI)标识 的每一 ,可想而 这是多么可的决。 当面对这个原则,许多人 于这是 着 直接 外 数据 记录( 数据 记录 ID) 从多以来面 对象的 告 我们, 的

14、信息作为现 隐藏 来 , 是有点想都常会使人。 是这条原则与隐藏现 并有 :通常, 被URI标识的事物资源数据 记录抽象的多。例,一个定单资源可以由定单 以许多 方面(可 不希望作为单 标识的资源 出来)组成。标识所有 标识的事物, 会这个观念可以进一fl 导 创造出 传统的应用程 设计中不常见的资源:一个流程 流程fl骤一次 售一次谈判一份报价请求这都是应 被标识的事物的示例。 ,这也会导创建非RESTful设计fi多的体。 下面是一些 可 想 的URI的例子: http:/ http:/ http:/ http:/ “我择了创建便于阅读的URI这是个有用的观点,尽管不是RESTful设计所

15、必须的应 十容易 测出URI的 : 们 显标识着单一“数据 。 是 往下看: http:/ http:/ 先,这 个URI看 来与 的稍有不 毕竟,们不是对一 事物的标识,而是对一类事物合的标识(定第一个URI标识了所有 200711 份提交的定单,第 个则是绿颜色产 的合)。 是这些合 身也是事物(资源),也应 被标识。 注,使用唯一全统一的名 则的 , 适用于 器中的Web应用,也适用于机对机(machine-to-machine,m2m)通信。 来对第一个原则”下总结:使用URI标识所有 标识的事物,特别是应用中提的所有“高级 资源,无 这些资源代表单一数据 数据 合虚拟亦 的对象还是计

16、算结等。所有事物”接 一 接下来 的原则有一个有点人害的“式描述:“超媒体被当作应用状态 擎(Hypermedia as the engine of application state) ,有 为HATEOAS。(严格说,这不是我说的。)这个描述的核心是超媒体 概念,换句话说:是”接 的想。”接是我们 HTML中常见的概念, 是 的用 不“于 (用于人们网络 )。 一下下面这个虚 的XML片段: 23 观察文档中product和customer的”接,就可以很容易想象 ,应用程 (检索过文档) “跟随 ”接检索fi多的信息。当 ,使用一个遵守专用名 的 单“id”属性作为”接,也是可行的 是仅

17、“于应用环境 。使用URI表示”接的雅 于,”接可以指 由不 应用不 器 位于一个陆上的不 公司提的资源因为URI名 是全标准, 成Web的所有资源都可以互联互通。超媒体原则还有一个fi 的方面应用“状态 。 而言 ,上 器端( 愿,也可以叫 提 )为 户端( 消费 )提一组”接,使 户端 通过”接应用从一个状态改变为一个状态。稍我们会 一篇文章中探究这个方面的影响; , 记住:”接是 成动态应用的非常有的方式。对 原则总结下: 可 的 下,使用”接指 可以被标识的事物(资源)。也“是超”接造就了现 的Web。使用标准方个原则的 中暗 着一个设:接收URI的应用程 可以通过URI ” 一些有

18、的事 。 公共汽车上看 一个URI, 可以 输 器的 栏中并回车 是 的 器 道 对这个URI”些什么 道 去 理URI的原因 于所有的资源都支 的接口,一套 的方( 乐,也可以称为操作)合。 HTTP中这被叫”动词 (verb),除了 个家熟 的(GET和POST) 外,标准方合中还 PUTDELETEHEAD和OPTIONS。这些方的 连 行为许诺都一 定 HTTP 中。 是一名OO开发人员,就可以想象 RESTful HTTP方 中的所有资源都 类似于这的一个类(用类JavaC#的伪描述,请注键的方): class Resource Resource(URI u); Response g

19、et(); Response post(Request r); Response put(Request r); Response delete(); 由于所有资源使用了 的接口, 可以 使用GET方检索一个表述 (representation) 也就是对资源的描述。因为 中定 了GET的 ,所以可以定当 调用 的候不 对这就是为什么可以“安全 调用 方。GET方支非常高成熟的缓存,所以 很多 下, 不 器发 请求。还可以定的是,GET方具有幂等性 译注:指多个 请求返回 的结 发 了一个GET请求有 结, 可 不 道原因是请求未 达 的,还是响应 馈的途中丢失了。幂等性 了 可以 单 发 一

20、次请求解决。幂等性 适用于PUT( 的 是“fi新资源数据,资源不存 的话,则 据 URI创建一个新的资源 )和DELETE( 全可以一遍 一遍操作 ,直 出结 删除不存 的东西有 )方。POST方,通常表示“创建一个新资源 ,也 被用于调用过程,因而 不安全也不具有幂等性。 用RESTful的方式 应用功 ( 乐,也可以称为 功), 这条原则和 的 也适用于 。 习惯于外的设计方式,则很难去接这条原则毕竟, 很可 为 的应用 了超出这些操作表达 的逻辑。请允许我花费一些来让 信不存 这的 。 来看下面这个 单的购方 例子: 可以看 ,例子中定 了 个 程 (有 现 )。这些 程 的接口都是为

21、了 成(“是我们 的OrderManagement和CustomerManagement )而定的。 户端程 试图使用这些 , 必须针对这些特定接口进行编码不可 这些接口定 ,使用 户程 去有 的和接口协作。这些接口定 了 程 的应用协议(application protocol)。 RESTful HTTP方式中, 通过组成HTTP应用协议 的通用接口访 程 。 可 会想出 这的方式: 可以看 , 程 中的特定操作被映射成为标准的HTTP方为了消除歧 ,我创建了一组全新的资源。“这是骗人的currency1戏 ,我听见 叫嚷着。不,这不是欺骗。标识一个 的URI上的GET方“ 当于getCu

22、stomerDetails 操作。有人用三角形形象 说 了这一点: currency1三个 点想象为 可以调 的按钮。可以看 第一种方中, 有许多操作,许多种类的数据以 定数 的“例 ( 上和 有的 程 数 一)。 第 种方中, 有 定数 的操作,许多种类的数据和许多调用 定方的对象。 的 于, 了通过这 种方式, 上可以表示 的事 。 为什么使用标准方 从 上说, 使 的应用成为Web的一应用程 为 Web变成Internet上最成功的应用所”的贡献,与 加 Web中的资源数 成例。用RESTful方式,一个应用可 会 Web中 加数以 计的 户URI;用CORBA 并维应用的原有设计方式,

23、 的贡献 是一个“端点(endpoint) 就 一个非常 的 ,仅仅允许有 的人进 中的资源。 统一接口也使 所有理解HTTP应用协议的组 与 的应用交互。通用 户程 (generic client)就是从中的组 的例子,例curlwget代理缓存HTTP 器网还有GoogleYahoo!MSN等等。 总结下:为使 户端程 与 的资源 互协作,资源应 “ 现的应用协议(HTTP),也就是使用标准的GETPUTPOST和DELETE方。资源多 表述为 我们一直 了一个稍 复杂的: 户程 道 理检索 的数据,作为GETPOST请求的结 原因是,HTTP取的方式是允许数据 理和操作调用 系 的。换句

24、话说, 户程 道 理一种特定的数据格式, 就可以与所有提这种表述格式的资源交互。让我们 用一个例子来 这个观点。用HTTP容协 (content negotiation), 户程 可以请求一种特定格式的表述: GET /customers/1234 HTTP/1.1 Host: Accept: application/vnd.mycompany.customer+xml 请求的结可 是一些由公司专有的XML格式表述的 户信息。设 户程 发 外一个不 的请求,就下面这: GET /customers/1234 HTTP/1.1Host: Accept: text/x-vcard 结则可 是V

25、Card格式的 户 。( 这里我有 示响应的容, HTTP Content-type 中应 着于数据类 的 数据。)这说 为什么理想的 下,资源表述应 用标准格式 户程 对HTTP应用协议和一组数据格式都有所“了解 , 么 就可以用一种有 的方式与 上一个RESTful HTTP应用交互 。不 的是,我们不可所有东西的标准格式, 是, 许我们可以想 公司 一些合作 中使用标准格式来 造一个 环境。当 以上 不仅适用于从 器端 户端的数据, 从 户端传来的数据符合应用协议, 么 器端就可以使用特定的格式 理数据,而不去心 户端的类 。 中,资源多 表述还有着 的 : 为 的资源提HTML和XML

26、 种表述方式, 这些资源不仅可以被 的应用所用,还可以被标准Web 器所用也就是说, 的应用信息可以被所有会使用Web的人获取。 资源多 表述还有外一种使用方式: 可以应用的Web UI Web API中毕竟,API的设计通常是由UI可以提的功 动的,而UI也是通过API 行动作的。这 个合 为一带来了司 么 currency1“fifl fl eb接口。 总结:针对不 的 求提资源多 表述。无状态通信无状态通信 是我 的最一个原则。先, 着 调的是,虽 REST 无状态性(statelessness)的观念, 这并不是说 功 的应用不 有状态 事上, 下这会导整个”有 用 。REST求状态么

27、被 资源状态中,么 存 户端上。 换句话说, 器端不 除了单次请求 外的, 与 通信的 户端的通信状态。这”的最直接的理由就是可伸缩性 器 户端状态, 么 的 户端交互会严 影响 器的存可用(footprint)。(注,” 无状态通信往往 一些 新设计不 单一些session状态 URI上, 就 称这个应用是RESTful。) 除 以外, 方面可 显 fi为 :无状态使 器的变 对 户端是不可见的,因为 次连的请求中, 户端并不 于 一 器。一个 户端从 器上收 一份 ”接的文档,当 ”一些 理,这 器了,可 是”而被 去理,可 是 级 这个 户端访了从这 器接收的”接, 不会察 的 器改变了

28、。理 上的REST我 :以上我所说的REST不是“的REST,而且我可 有点过多 于 单 。 因为我想有一个与不 的开,所以有 一开就currency1 “式的定 和。现 就让我们稍 currency1一下这方面的容。 先,先 我并有 HTTPRESTful HTTP和REST。理解这些不 方面 的系,我们先来看看REST的历史。 Roy T. Fielding 的位 文(上 应 访这个”接 对于一篇 文来说, 是 当易读的。 文被译成中文 )中定 了 REST。Roy 是许多 Web协议的设计 , 中 HTTP和URIs,并且 文中对这些协议提出了很多想。(这篇 文被为“REST ,这是当的

29、毕竟,是作 发 了这个 ,所以 定 上, 的 容都被为是的。) 文中,Roy先定 一种方 来谈 风格 高级抽象的式,来表达 方的核心理念。每一个 风格由一系的 (constraints)定 形成。 风格的例子“有风格 ( 有 )管道和过 器(pipe and filter) 户端/ 器式对象以 了REST。 对 来说这些听 来都 抽象了, 就对了REST 上是一个可以被许多不 现的高层次的风格,而且可以被例 通过为 的抽象特性 上不 的。,REST中 资源和统一接口的概念也就是说,所有资源都应 对这些 的方作出 应。 是REST并有说 是 些方, 有多 方。 REST风格的一个“ 身 便是HT

30、TP(以 一套 的一套标准,URI), 稍 抽象一些:Web 身。接着上面的例子,HTTP使用HTTP动词作为REST统一接口的“例 。由于Fielding是 Web( 是)“ 了 定 的REST风格,有人可 会 是不是100%的 。 是无 ,整体上来说WebHTTP和URI仅仅是REST风格的一个现。不过,由于Roy Fielding 是REST 文的作 , 对Web 设计有过 远的影响, 似也 理 中。 最,我 面一次 一次使用着 “RESTful HTTP”,原因很 单:许多使用HTTP的应用因为一些理由并有遵 REST原则,有人会说使用HTTP而不遵 REST原则就等 于 用HTTP。

31、当 这听 来有点 事上 REST的原因通常是,仅仅因为每个带来的设计 可 不适合于一些特 。 通常, REST的原因可 于对 的 。来看一个 显的 面 例:使用HTTP GET调用类似于删除对象的操作,这 了REST的安全和一性常识( 户程 不应为 , 器端开发人员概不是有而为 )。 随的文章中,我会提 fi多这 的对HTTP的 用。总结文试图对REST(Web )的概念提 的currency1。RESTful HTTP 功 的方式与RPC式对象以 Web Services是不 的;“理解这些不 是 一些心态的转变。不管 建的应用是仅仅想 Web UI还是想currency1API变成Web的一份子,了解下REST的原则还是有 的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报