1,在 Rails 中的凡可以通过 http 的 get,post,put,delete 等方法操作的东西,是否都可以称作资源?
2,比如流程,可以涉及 N 多 model,N 个 controller,但是流程本身这个是可以有创建,更新,销毁的操作的,那么流程这个本身是否也是资源呢?
我觉得可以这么理解,但是这样理解却把 REST 这个概念限定在了 Rails 的范畴里,一开始可能有助于你和 Rails 结合,但如果就此变成常识,反而会影响进一步的……呃,进步吧。
REST 本身又不是什么特别复杂的概念,建议你去读一读 RESTful webservice 或者 web 信息结构
多看看优秀的 REST 实现: http://developer.github.com/v3/
Hypermedia 是 REST 很重要的一环,Rails 本身不支持。
我印象中好像不是这样的。四种动作不是资源,url 才表示“资源”。就是这样:
/books/1
get /books/1
意思就是要“获取”这个资源。
put /books/1
是要修改这个资源。实际是用 post 模拟的,修改的内容通过 post params 一起传过去。
delete /books/1
就是要删除这个资源。也是 post 模拟的。
post /books
是新建一个资源(因为是新的记录,所以没有 ID)。注意是“直接新建”,不是“要去新建”一个资源(那个是 get /books/new
)。
总的效果类似数据库的CRUD
4 个动作。可以对比关系型数据库对于存储层的简化。在关系性数据库以前 应用的存储层面对的是各种操作系统和文件系统,程序员不仅要针对不同的平台的不同指令,而且要针对各种不同存储后的数据结构来进行应用编程。关系型数据库的出现用互相关联的表取代了各种 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,好像也没有基于 REST 的其它实现,其实这从另外一个侧面说明 REST 的抽象威力