- 浏览: 245644 次
- 性别:
- 来自: 北京
最新评论
-
nowind:
我学ror时使用了haml一个月。现在回到了java,却再也无 ...
HAML必将流行 -
suliangben:
楼主你在幻想吧,你要走出你的幻想世界,接受现实。
HAML必将流行 -
kenrome:
打不开阿嗄
新文章都会发表在 dongbin.org 上,这个 blog 不再更新了 -
Soloara:
haml确实在很多方面体现出了其优势,但不可否认的一点是抽象程 ...
HAML必将流行 -
dayang2001911:
你为什么不把你那边的博文导入到javaeye来呢
新文章都会发表在 dongbin.org 上,这个 blog 不再更新了
开发过程中,在三个Model的REST描述上,我昨天冥思苦想了一整天。突然对REST有了顿悟,对于以前的错误理解捶胸顿足。
REST不是什么?
1. REST不是技术
之所以说REST更接近道,是因为REST不是一种技术,而是一种思想,任何方式都可以实现。使用Rails 1.2不代表使用了REST。
2. REST不是Model的Proxy
以为只要Model和Model的关系设计好了,REST风格的URL就被决定了。这就是我前段时间所犯的最愚蠢的错误。这种思想让我用Model First的方式设计系统。结果系统实现得越多,离用户价值越远。
3. REST不是 map.resources,更不是Nested Resource
如果按照Model的层次关系来设计URL,如果层次关系很深,必然导致Nested Resource的层次很深。而是否需要这样的URL应该由需求决定,而不是Model。
这篇文章以及评论讲得非常好。Nested Resource的目的是向URI中加入以及解析必须的参数,而不是把Model的关系展现出来,更不是在URL上耍酷。
至于加入什么参数,完全是由需求决定。
4. REST不是Model的CRUD与Controller的绑定
假如我需要这样两个用户接口:
某一个Project的所有Message
某一个Project的某一个tag的所有Messages
如果一定要按照常见的CRUD原则来作,这两个操作都应该访问Messages Controller的'index' Action,然后判断params里面是否有tag_name参数。这就是我犯过的愚蠢的错误。
正确做法:
这个URL请求就会分发到TagMessages的 index. 这样作不会引入更多的Controller和Action么?没错!
既然
REST是什么?
REST体现了软件开发的最终目标:实现用户价值!实现用户价值的开发就要求我们从User Interface开始设计,而不是Model。
无论是BS还是CS架构,对于Server端来说,用户接口就是网络协议,比如HTTP。HTTP接口就是Web Server的User Interface,同时也是Client端的Service Interface。从HTTP接口开始设计Web架构就是REST思想。
HTTP接口是什么?URI,HTTP Method 以及Content-type, Accept-language等HTTP Header的一个集合就是一个HTTP接口。
对于HTTP接口来说,无论是View的代码怎么写,还是Controller和Model怎么实现都属于实现细节。从这点来讲,HTTP接口是系统中最稳定的User Interface。
MVC各个部分的实现也要从User Interface来实现,这些部分的User Interface是什么我还没想好。至少TDD的Test First就是一种User Interface First的体现。
REST与其他思想万法归宗,是一种道。请读者不要把本文当作文字或者概念,更不要对文字产生任何争论。真正的道纯属个人领悟,只要是文字描述出来的就不是道,执著于文字更是愚蠢至极。
I like this point.
请读者不要把本文当作文字或者概念,更不要对文字产生任何争论
看来真的什么都不能说了,呵呵
REST不是什么?
1. REST不是技术
之所以说REST更接近道,是因为REST不是一种技术,而是一种思想,任何方式都可以实现。使用Rails 1.2不代表使用了REST。
2. REST不是Model的Proxy
以为只要Model和Model的关系设计好了,REST风格的URL就被决定了。这就是我前段时间所犯的最愚蠢的错误。这种思想让我用Model First的方式设计系统。结果系统实现得越多,离用户价值越远。
3. REST不是 map.resources,更不是Nested Resource
如果按照Model的层次关系来设计URL,如果层次关系很深,必然导致Nested Resource的层次很深。而是否需要这样的URL应该由需求决定,而不是Model。
这篇文章以及评论讲得非常好。Nested Resource的目的是向URI中加入以及解析必须的参数,而不是把Model的关系展现出来,更不是在URL上耍酷。
至于加入什么参数,完全是由需求决定。
4. REST不是Model的CRUD与Controller的绑定
假如我需要这样两个用户接口:
GET /:project_name/messages
某一个Project的所有Message
GET /:project_name/tags/:tag_name/messages
某一个Project的某一个tag的所有Messages
如果一定要按照常见的CRUD原则来作,这两个操作都应该访问Messages Controller的'index' Action,然后判断params里面是否有tag_name参数。这就是我犯过的愚蠢的错误。
class MessagesController < ApplicationController def index if params[:tag_name] @messages = Message.find_by_tag_name_and_project(params[:tag_name], params[:project_name]) else @messages = Message.find_by_project(params[:project_name]) end end end
正确做法:
map.connect '/:project_name/tags/:tag_name/messages', :controller => 'tag_messages'
这个URL请求就会分发到TagMessages的 index. 这样作不会引入更多的Controller和Action么?没错!
class MessagesController < ApplicationController def index @messages = Message.find_by_project(params[:project_name]) end end
class TagMessagesController < ApplicationController def index @messages = Message.find_by_tag_name_and_project(params[:tag_name], params[:project_name]) end end
既然
/:project_name/messages和
/:project_name/tags/:tag_name/messages是两个不同的用户接口,为什么要放到一个Action里面?多个不同地请求在同一个action里面用if ... else if... 来判断好还是由各自的action执行好?
REST是什么?
REST体现了软件开发的最终目标:实现用户价值!实现用户价值的开发就要求我们从User Interface开始设计,而不是Model。
无论是BS还是CS架构,对于Server端来说,用户接口就是网络协议,比如HTTP。HTTP接口就是Web Server的User Interface,同时也是Client端的Service Interface。从HTTP接口开始设计Web架构就是REST思想。
HTTP接口是什么?URI,HTTP Method 以及Content-type, Accept-language等HTTP Header的一个集合就是一个HTTP接口。
对于HTTP接口来说,无论是View的代码怎么写,还是Controller和Model怎么实现都属于实现细节。从这点来讲,HTTP接口是系统中最稳定的User Interface。
MVC各个部分的实现也要从User Interface来实现,这些部分的User Interface是什么我还没想好。至少TDD的Test First就是一种User Interface First的体现。
REST与其他思想万法归宗,是一种道。请读者不要把本文当作文字或者概念,更不要对文字产生任何争论。真正的道纯属个人领悟,只要是文字描述出来的就不是道,执著于文字更是愚蠢至极。
评论
9 楼
liubin
2007-08-22
第4点,通过map.connect来映射controller/action和URL,这个早在1.2之前就是这样的吧。
8 楼
simon_lin
2007-08-22
看了还是不是非常理解。:(
是不是可以这么认为,REST是为了把一些东西规范起来,通过一些规范或设置把一些内容标准化、简单化?
是不是可以这么认为,REST是为了把一些东西规范起来,通过一些规范或设置把一些内容标准化、简单化?
7 楼
yananay
2007-08-15
我想REST的目的就是规范对资源的操作。
狭义上来说,资源一般就是数据库的资源。
所以,在REST中,一个URL就变得更加有意义:
/project/users
可以表示得到一个project下的所有用户。
而楼主所要表达的,只是对一个URL,如何用controller来
进行处理。
其实URL还是应该明显的表示出对资源的操作。
对这个尤其不能认同
REST体现了软件开发的最终目标:实现用户价值!实现用户价值的开发就要求我们从User Interface开始设计,而不是Model。
何为“User Interface”?URL?
Rails 中的Model已经不仅仅是一个数据库的Model,而是业务和数据库的结合,是一个充血的模型。
理所当然我们应该从分析业务领域入手。
这里跑个题,很多人说Rails中是 业务代码写到controller里,其实是错误的,之所以会这么做,
是因为你的业务非常简单,其实业务代码是应该写到model里的。
狭义上来说,资源一般就是数据库的资源。
所以,在REST中,一个URL就变得更加有意义:
/project/users
可以表示得到一个project下的所有用户。
而楼主所要表达的,只是对一个URL,如何用controller来
进行处理。
其实URL还是应该明显的表示出对资源的操作。
对这个尤其不能认同
引用
REST体现了软件开发的最终目标:实现用户价值!实现用户价值的开发就要求我们从User Interface开始设计,而不是Model。
何为“User Interface”?URL?
Rails 中的Model已经不仅仅是一个数据库的Model,而是业务和数据库的结合,是一个充血的模型。
理所当然我们应该从分析业务领域入手。
这里跑个题,很多人说Rails中是 业务代码写到controller里,其实是错误的,之所以会这么做,
是因为你的业务非常简单,其实业务代码是应该写到model里的。
6 楼
dualface
2007-08-01
我的理解比较简单,没有领悟到那么深入的东西。
原文在 http://www.dualface.com/blog/?p=356,太长了就不贴了。
原文在 http://www.dualface.com/blog/?p=356,太长了就不贴了。
5 楼
jiajv_
2007-08-01
rest 就是无状态的http协议精神的延伸,不共享状态 所以能集群 大规模提高性能 和并发而没有副作用
4 楼
sp42
2007-07-29
引用
实现用户价值的开发就要求我们从User Interface开始设计,而不是Model。
I like this point.
3 楼
hideto
2007-07-27
REST是一个概念,一种风格,是看不见也摸不着的东西,看看作者的陈述吧:
REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增加安全性、封装遗留系统的中间件。
而REST架构约束包括客户-服务器、无状态、缓存、统一接口、分层系统、按需代码等。
由此可知,所有将REST应用于现代Web架构的设计都只是REST思想指导下的实践,比如Restful Rails,比如HTTP动词设计。
REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增加安全性、封装遗留系统的中间件。
而REST架构约束包括客户-服务器、无状态、缓存、统一接口、分层系统、按需代码等。
由此可知,所有将REST应用于现代Web架构的设计都只是REST思想指导下的实践,比如Restful Rails,比如HTTP动词设计。
2 楼
yananay
2007-07-27
引用
请读者不要把本文当作文字或者概念,更不要对文字产生任何争论
看来真的什么都不能说了,呵呵
1 楼
pilipala
2007-07-27
说得挺好,有些启发
刚接触REST感觉这东西挺简单,越看越觉得复杂。
现在,反而感觉有点摸不到REST到底是什么啦 呵呵
继续学习……
刚接触REST感觉这东西挺简单,越看越觉得复杂。
现在,反而感觉有点摸不到REST到底是什么啦 呵呵
继续学习……
发表评论
-
什么是Ruby之道?
2007-10-07 10:27 2907什么是Ruby之道? 翻译这篇文章让我对这个问题有了更深的理解 ... -
如何让CruiseControlrb生成RSpec 的rcov报告
2007-09-10 15:01 1753desc "Run all specs in spe ... -
Matrix Test 的 Rspec实现 -- matrix_spec
2007-07-25 18:32 1592ZenTest的作者提出了Matrix Test ,并且在Ze ... -
map.resources在edge rails中的变化
2007-06-30 17:22 1824map.resources :account_types, ... -
如何测试subdomain
2007-06-30 16:18 1567Mock 一下Request. module Actio ... -
test_helpful released -- A plugin on rails to make test easier
2007-06-22 10:22 1509I extract the plugin from a rea ... -
最近的学习内容
2007-06-20 10:44 1354CSS网页谁都会编,如何用最少的HTML和CSS进行布局就很少 ... -
make_resourceful 0.1.0 released
2007-05-27 01:33 1575make_resourceful 0.1.0 released ... -
Peercode的Rails视频太精彩了
2007-05-24 01:44 3080人外有人,天外有天。昨天把Peercode的视频看了一遍,真是 ... -
把Restful的潜能发掘到极限
2007-05-21 07:20 1299http://www.hamptoncatlin.com/as ... -
heckle--测试覆盖率检测工具
2007-05-19 23:32 1654上次rails爱好者聚会时,跟Robbin Lu讨论过测试覆盖 ... -
我的gem 列表
2007-05-19 23:12 2498看到 秀出你的Gem我也秀一下。 actionpack (1 ... -
HAML必将流行
2007-05-19 14:06 4936不管你认不认同HAML,它正在获得关注。可以预料的是,一场口水 ... -
SASS是一个好东西
2007-05-18 11:45 2122HAML 1.5以后的新特性要数sass最为吸引人了。昨天试用 ... -
想不通为什么是JRuby
2007-05-13 10:29 1832ThoughtWorks大力宣传JRuby,可是我是在想不通原 ... -
刚刚发现的edge rails中的几个变化
2007-05-06 21:03 2619今天把一个程序切换到edge rails(revision=6 ... -
我的 .emacs 文件
2007-05-02 20:00 4903(custom-set-variables ;; c ... -
Rails聚会小记
2007-04-09 01:54 2812这次聚会的目的虽然说 ... -
使用Ruby实现算法时遇到的性能问题
2006-01-13 03:15 1468昨天作了一道Topcoder的 ... -
比较ruby与其它语言的性能的链接
2006-01-14 06:05 1364http://shootout.alioth.debian.o ...
相关推荐
SOA与REST是什么?如何用REST构建企业级SOA解决方案
【rest接口】什么是rest?用swagger优雅开发rest
什么是REST_如何用NodeJS开发REST_API_【JavaScript全栈入门教程7】
》作者):认为本书统一了构建真实世界服务的实际方法以及对高层次抽象的清晰解释,教导读者如何以及为什么开发灵活、可协商和可发现的接口。 - **Colin Jack**(高级软件开发者):指出尽管REST可能看起来令人困惑...
REST,全称Representational State Transfer,是Richard T. Fielding在2000年他的博士论文中提出的一种软件架构风格,主要用于设计网络应用程序。RESTful API则是遵循REST原则的Web服务接口设计规范,它强调资源的...
这篇博客文章《REST调用有参数接口》可能详细介绍了如何在Java环境中使用RESTful API进行有参数的请求。 首先,RESTful API的设计原则是使用HTTP方法(GET、POST、PUT、DELETE等)来表示资源的不同操作。当需要传递...
REST(Representational State Transfer),即“表征状态转移”,是由Roy Fielding博士在其2000年的博士论文中提出的一种软件架构风格。REST强调基于网络的分布式系统的松耦合设计,并推崇无状态通信机制。在理解...
REST 服务构建的 Web 应用优势和不足 REST(REpresentational State Transfer)是一种混合架构风格,当前互联网的核心架构风格。基于 REST 服务(RESTful Service)的 Web 应用系统设计任务主要包括:识别并设计 ...
本示例探讨的主题是“REST地图与天地图叠加”,这涉及到两种不同的地图服务技术的融合,即SuperMap iClient的REST地图服务和天地图服务。我们将详细解释这两种技术及其在Flex客户端下的叠加应用。 首先,REST...
首先,让我们了解什么是REST API。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,通过URI(统一资源标识符)来定位资源,并使用HTTP方法(如GET、POST、PUT、...
基于nodejs的websocket平台,该平台包括异步的数据库调用,异步的rest api访问,以及能够提供rest api的服务。...框架可能对某些人来说没什么,但是这点代码自己折腾了挺长时间,所以分值高些。有问题可留言
### REST Server 在 Delphi XE 中使用 DataSnap 的关键技术点 #### 1. REST 架构简介 - **背景**: REST(Representational State Transfer)是 Web 服务领域的一个重要概念,尤其在过去十年中,随着 Web 2.0 的...
cpprest库,全称是Casablanca,是由微软开发的一个C++ REST(Representational State Transfer)编程库,主要用于构建云应用和服务之间的通信。cpprest库提供了轻量级、高效且易于使用的API,使得开发者可以方便地...
REST是设计分布式网络服务或API时遵循的架构原则以及...REST 应用场景,适合和不适合什么 基于HTTP的REST, 介绍资源uri,传输格式,对资源的操作(GET、POST、PUT,DELETE,Options,Head方法,如何对应CRUD动作)
### SOAP与REST的比较 #### 一、引言 在当今的互联网技术中,Web服务作为连接不同系统间的关键桥梁,扮演着极其重要的角色。在众多实现Web服务的技术方案中,SOAP(Simple Object Access Protocol)与REST...
Rest.li是LinkedIn开源的一个强大的RESTful服务开发框架,专门针对JSON数据交换设计。它提供了一套全面的解决方案,用于构建可扩展、健壮且类型安全的API。在深入理解Rest.li之前,我们先来了解一些基本概念。 REST...
在Delphi XE中利用DataSnap构建REST服务器是一项强大的技术,可以帮助开发者创建高效、可扩展的Web服务。本文将深入探讨这一主题,介绍REST(Representational State Transfer)架构原理,以及如何在Delphi环境中...
其中,REST Server 模块是实现这一目标的关键组件,它提供了基于 RESTful API 的接口,使得应用程序能够轻松地从 KEPWARE 获取或写入数据。本教程将详细介绍如何在 KEPWARE 中配置和使用 REST Server。 首先,确保...
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...