新手问题 求证是否正确:REST 的理解

mobiwolf · 2012年12月17日 · 最后由 fsword 回复于 2012年12月19日 · 4403 次阅读

1,在 Rails 中的凡可以通过 http 的 get,post,put,delete 等方法操作的东西,是否都可以称作资源?

2,比如流程,可以涉及 N 多 model,N 个 controller,但是流程本身这个是可以有创建,更新,销毁的操作的,那么流程这个本身是否也是资源呢?

可以这么理解。

比如 session 也是一种“资源”。

@daqing 感谢,理解了。你给的这个例子也很不错,呵呵

我觉得可以这么理解,但是这样理解却把 REST 这个概念限定在了 Rails 的范畴里,一开始可能有助于你和 Rails 结合,但如果就此变成常识,反而会影响进一步的……呃,进步吧。

REST 本身又不是什么特别复杂的概念,建议你去读一读 RESTful webservice 或者 web 信息结构

多看看优秀的 REST 实现: http://developer.github.com/v3/

Hypermedia 是 REST 很重要的一环,Rails 本身不支持。

有一本书叫,有中文版,楼主可以看看,书中把 REST 分成四个层次,不幸的是,rails 被认为是比较低级的 REST ......

#6 楼 @Teddy 能不能介绍一下这 4 个层次?

rest 的好处是什么?是不是 url 比较好看点,听了多年一直没明白。

我印象中好像不是这样的。四种动作不是资源,url 才表示“资源”。就是这样:

  1. url 相当于唯一的资源 ID。比如/books/1
  2. 4 种 http 动作 (Verb) 是在说明要如何操作这个资源。就是同一个 url,但是使用不同类型的 http 请求,获得的效果是不同的。在 rails 里: get /books/1意思就是要“获取”这个资源。 put /books/1是要修改这个资源。实际是用 post 模拟的,修改的内容通过 post params 一起传过去。 delete /books/1就是要删除这个资源。也是 post 模拟的。 post /books是新建一个资源(因为是新的记录,所以没有 ID)。注意是“直接新建”,不是“要去新建”一个资源(那个是 get /books/new)。 总的效果类似数据库的CRUD4 个动作。

#7 楼 @daqing 零级服务:通常只使用 POST 完全忽略其他 HTTP 动词 一级服务:相比零级服务,暴露了很多逻辑上的资源 二级服务:通过 URI 寻址资源,支持多个 HTTP 动词来暴露资源 三级服务:支持超媒体作为应用状态的引擎观念。

我也好久没看了,找不到关于 ror 的描述了,不过看来貌似是属于二级服务的,算是比较高的了

#8 楼 @chenge

可以对比关系型数据库对于存储层的简化。在关系性数据库以前 应用的存储层面对的是各种操作系统和文件系统,程序员不仅要针对不同的平台的不同指令,而且要针对各种不同存储后的数据结构来进行应用编程。关系型数据库的出现用互相关联的表取代了各种 custom 的数据结构,而把纷杂的操作指令简化为 CRUD 的四种,从而大大提升了应用程序员的效率和代码维护和移动性。

如果对比 SOAP 和 REST, 你会发现同样的进步 - REST 通过对资源的固化和四种 CRUD 的操作避免了 SOAP 里面纷杂的自定义方法,从而完全不需要类似 WSDL, UDDI 这些东西,使得系统间的集成大为简化了。

就像关系型数据库可以用四个操作和固化的数据结构来支持复杂的业务逻辑一样,REST 的方法是把所有业务逻辑转化为对资源的四种操作。从代码层面上看,每个资源可以有自己的 M-V-C,容易模块化,代码更可维护;从系统的角度来看,各种资源有足够的隔离性,代码可以分别进化,就好象数据库修改一个表不会对系统的其他表产生影响一样;从集成角度来看,客户端只需要知道资源列表就知道怎样通过熟悉的 HTTP 协议来进行交互,就好象给你一个关系型数据库,你就可以很轻松的用 SQL 和数据库进行交互,不需要任何多余的文档和训练一样。

可以简单的理解成: 1、每一个 url 地址代表一种资源; 2、客户端和服务器端之间传递资源的某种表现层; 3、客户端通过四个 HTTP 动词(GET、POST、PUT、DELETE),对服务器端资源进行操作,实现"表现层状态转化"。

其中客户端只能通过 TTP 协议,具体即:HTTP 协议里面四个表示操作方式的动词:GET、POST、PUT、DELETE。分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

#11 楼 @knwang #12 楼 @uudui 这么说还是容易把 REST 和它的一种实现 http 混淆起来吧。我建议还是分开解释:

网络上的所有交互都可以分解为 N 多 client 和 server 之间的协同,而 REST 的核心是为大家约定一组先验知识,这样,不仅在网络协议上可以统一,而且在应用层也可以统一。

借助之前的先验知识,任何客户端可以在不知道应用逻辑的情况下与服务器进行协作,这就是 REST 的最大价值。

http 是对 REST 思想的一种实现,@knwang 回答的后半部分和 @uudui 的回答中,所说的 REST 其实是指 http

REST 约定的先验知识包括(想到哪些说哪些,可能不完整):

  • 一切都是资源,资源有自己的唯一标识(比如 http 这个实现用的是 uri/url)
  • 对资源的可用操作动词是已知且有限的(具体包括哪些动词由实现决定,比如 http 用的是 post/get/put/delete/patch/....)
  • 支持同种资源的不同的媒体类型(比如 http 的 content type)
  • 客户端呈现出统一平台的行为(在 http 中就是标准的浏览器),依据服务端返回信息决定自身状态和后续可选行为(在 http 中就是“根据页面内容决定用户下一步能做什么”) ......

顺便说一句,目前除了 http,好像也没有基于 REST 的其它实现,其实这从另外一个侧面说明 REST 的抽象威力

需要 登录 后方可回复, 如果你还没有账号请 注册新账号