昨天,David H. Hansson在 www.rubyonrails.org 上发布了Rails 1.2 RC1。之前Rails的版本在1.1.6上停留了4个月,有人已经不耐烦地在讨论组上质问Rails 1.2为何拖了这么久。拖这么久当然是有原因的,Rails 1.2是一个重大的升级,可以说其核心思想发生了巨大的、根本性的变化,以至于著名的《敏捷Web开发》第二版,在临近脱稿之时,不得不进行大幅度的调整,从而把出版日期一拖再拖。
Rails 1.2的主要亮点是REST。可以这样说,经过这次升级,Rails成为第一个把REST作为核心思想的主流Web框架,从而把其他的竞争性的敏捷Web开发框架又一次抛在了身后。在RIA的曙光已经从地平线下面露出来的时候,Web的全面service化已经不是个遥不可及的事情。记得2000-2001年,以微软为首的一些大公司鼓吹Web Services,当时有人认为2003年各大网站就会急急忙忙地向Web Services迁徙。但历史证明,公众互联网站根本不认同这个方向,预见中的Web Services大跃进没有出现。Web Services使得网站的服务既可以通过页面来发布,也可以通过可编程的Web Services API形式发布,这本身是很好的事情,为什么人们不接受呢?原因固然是多方面的,但是互联网社群不接受为企业应用量身定做的、笨重累赘的SOAP/WSDL/UDDI,是不可忽略的因素。这个时候,一种新的Web Services模型就开始引起人们的注意。2000年,著名的Web技术专家、HTTP等诸多Web协议的主要起草人Roy Fielding从加州大学Irvine分校获得博士学位,其
博士学位论文中描述了一种分布式软件的体系结构风格,被称为REST。这种风格完全符合已经建立起来的Web体系结构,并且具有天然的简单性、可延展性。自此之后,REST成为SOAP之外另一种主流的Web Services实现模型。很快,人们发现,开发者更加偏爱REST模型.eBay、Amazon等巨型网站早在2004年就发现,大约有60%的Web Service客户通过REST来使用它们所提供的网络服务,此后这个比例一直在增加。那么,REST到底是什么东西呢?
简而言之,REST代表“具备表像的状态迁移(REpresentational State Transfer)。注意,我把representation翻译为表像,是为了更好地表达其本意,如果按字面翻译,应为“表现”。REST这样理解Web:Web是资源的集合,每一个资源都有一个或多个URI无疑义地引用。REST软件构件可以获得某项资源的一个“表像”,从这个表像中,REST构件可以了解到该资源的当前状态,从而在该项资源上实施恰当的操作,并且可以把这个表像传递给其他的REST构件。当REST构件在该资源上实施了某些操作之后,将导致该资源的状态发生迁移,从而获得新状态的表像。这种解释当然是比较晦涩的了。但换一种说法大家就会非常清楚。当我们在浏览Web页面的时候,这个Web页面就是Web应用当前状态的表像,而我们和我们的浏览器一起构成了一个REST构件。当你在Web页面上执行某项操作(点击链接、提交表单,等等),你就是“在某个资源上实施了一个操作”,就会导致系统的状态发生迁移,迁移到另一个状态中,而新的状态以新的表像(页面)展示给你。这不正是我们每天都重复几百上千次的事情吗?所以我们用REST已经十多年了。只不过,Roy Fielding在其论文中表明,REST其实是一种分布式软件的通用风格,可以被用来构建相当广泛的互联网应用。
Roy Fielding对REST的深刻理解直接影响到HTTP协议的制定。在1999年完成的HTTP 1.1(RFC2616)中,HTTP增加了PUT、DELETE两个命令,从而使HTTP的主要命令扩充为四个(GET、POST、PUT、DELETE,未将次要命令如OPTION、HEAD等计入)。Roy Fielding认为,这四个命令不多不少恰恰能完成REST风格的应用。换言之,只要有这四个动词,就可以在REST范围内做出任何想要的分布式应用。这是多么令人惊讶的结论!我们在平时的面向对象设计中,通常要给每一个对象定义的动作(方法)都不少于四个,而REST却断言,四个就够了,多一个浪费,少一个不行。如果Fielding博士是对的,那么互联网上的编程工作就可以大大简化,HTTP体系下天生的轻便、灵活、简单、可扩展的特性都唾手可得。
然而,遗憾的是,尽管HTTP很流行,四个动词的语义清清楚楚地写在RFC2616里面,但真正很好地理解了其中含义的人却非常少。世界上充满了不求甚解就撸起袖子蛮干的聪明人,所以浏览器出现已经十多年了,却还是只支持GET和POST两个方法,这使得REST的推行不能一帆风顺。
Ajax的出现标志着RIA时代逐渐走来,客户端将不再是清一色的HTML页面,也可以是一个Ajax的程序,通过XMLHttp向服务器发起PUT和DELETE请求。这样,就要求服务器端在四动词的背景下重新思考应用的构造。传统上,服务器端应用只是通过REST风格将部分服务暴露出来。而Rails 1.2则直接将REST直接作为构建整个Web应用的中心,这才是Rails 1.2的独特之处,也是张显Rails社群离经叛道和卓尔不群的地方。为了要采纳REST风格,Rails 1.2革新了Web应用的构造思想,整个领域建模的思想都有所变化。现在整个Rails社群都应当准备向REST时代迁移。
今年7月份举行的RailsConf 2006上,David Heinemeier Hasson作了一个主题演讲,很清楚地讲了Rails 1.2中对于REST的设计,以及REST风格给Web应用设计思想所带来的革新。我第一次看到这个视频,就认为这可能是对Web服务端开发具有历史意义的一次演讲。当时有一点时间,就一边听一边记,把这个演讲的开头翻译出将近3000字的内容,大约占整个演讲篇幅的1/4。后来我忙了起来,就没有时间把这个翻译做完。这个稿件在我硬盘上爬了两个多月,扔掉也不是,放出来又不完整。现在Rails 1.2已经发布了,我想越来越多的Web开发者都会回过头关心这个演讲的内容,所以突然生出一个想法,能不能把这个不完整的翻译稿放到自己的blog上,请有时间和精力的网友把翻译工作接力下去?
所以,我已经将自己
翻译完成的开头部分放到了blog上,请有兴趣和热情的朋友对照录像内容把翻译接力下去,为国内的Web开发者介绍关于Web开发思想的这一重大革新。