出家如初,成佛有余

REST开发框架纵览

Posted in Uncategorized by chuanliang on 2007/10/06

1、REST开发框架纵览

转自http://www.swm.com.cn/cn/pop/pop.jsp?InfoID=2158

REST的流行使得越来越多的框架开始支持REST,而历史的原因使得它们各自具有不同的特点。

随着SOA的兴盛,Web服务也开始驶入了加速发展的快车道。2000年Roy Thomas Fielding博士一纸论文更是宣告了第二代Web Service的到来,REST—表述性状态转移,为我们构建下一代高性能、高可伸缩性、简单性、可移植性、可靠性的Web程序提供了一个架构风格上的准则。Web是简单的,Web更是可编程的,REST利用简单的 HTTP、URI标准和XML语言构建起轻量级的Web服务,从而大幅度地提升了开发效率和程序性能。

由于REST设计哲学变得越来越流行,许多RESTful框架如雨后春笋般涌现出来。

Rails

Ruby on Rails是新兴的敏捷Web开发框架,在动态语言Ruby的支持下,Rails以新鲜的视角告诉我们Web开发是简单而快乐的。Rails对 RESTful Web Service的开发作了极大的封装和简化,这对开发人员来说是一个强大的工具。而且即将发布的Rails 2.0将全面基于REST。

Rails 将ActiveRecord Model抽象为资源,比如http://www.example.com/books就是一个books资源抽象,而URI就是该资源的地址和唯一标识符。对该资源的CRUD是利用标准HTTP协议中的GET、POST、PUT和DELETE方法,见表1。

对于Book这个Model我们只需在URL映射配置文件routes.rb中使用map.resources:books作资源声明,则Rails自动为我们将表1中的URL和HTTP动词与 Action做映射。而且,Rails提供的scaffold_resource这个简单的Generator,可以让我们使用一条简单的命令自动完成上述工作,而且会为我们自动生成页面视图。

HTTP动词中的GET和POST是我们常用的,但是PUT和DELETE方法却很少见。由于目前流行的Web浏览器大多不支持PUT和DELETE方法,所以Rails采用一个虚拟的:method参数来模拟HTTP中的GET、 POST、PUT、DELETE方法。从表1中我们可以看到,PUT和DELETE实际上都分别用POST和GET来作为提交方法。

事实上,当我们使用Rails 页面模板的辅助链接方法并设置:method参数时,Rails会自动为我们生成一个form提交,并加上一个名字为“_method”的hidden字段,“_method”字段的值根据模板辅助链接方法:method的值而分别被赋予PUT或DELETE。这样,Rails就弥补了Web浏览器不支持 PUT和DELETE的缺点,让Rails开发人员透明地使用RESTful Web Service API。

另外,Rails最新的SVN代码库里还增加了一个RESTful Web Service客户端的封装库:ActiveResource。ActiveResource模块是Rails的REST客户端,它对开发REST客户端 Web Service程序提供了简化。ActiveResource参考了Rails的ActiveRecord架构,甚至连API几乎都是照搬过来,这对于熟悉ActiveRecord的开发人员十分方便。使用ActiveResource时,我们只需让一个自定义的模型继承自 ActiveResource::Base类,并在该模型中设置好self.site属性作为你要访问的RESTful Web Service的URL,就可以像使用ActiveRecord一样通过find、create、save、destroy方法来执行针对该资源的 GET、CREATE、UPDATE和DELETE操作。

Rails对REST开发做出了最大的简化,Rails即将发布的2.0版本将全面基于REST。作为一个敏捷的Web开发框架,Rails一直在不断突破传统的Web开发模式、寻找Web开发领域的杀手级架构和框架,并在不断进步和发展中得到了大家的认可。

Axis2

Apache Axis2是传统的Java Web Service框架Axis的下一代版本。从最初的Apache Axis和Apache SOAP到目前的Axis2,经历了大量变革和发展。相对以前的版本,Axis2更灵活、更高效、更简单。作为Java端官方和传统Web Service框架,在REST与SOAP的硝烟弥漫、战火纷飞的状况下,Axis2尝试同时支持SOAP和REST,采用了WSDL2.0中将REST 与Web服务结合的工作成果。

同样的商业逻辑,Axis2同时提供WS-*风格的接口和REST风格的接口。除了支持WS-*规范外,Axis2已经可以配置作为REST容器来发送和接收RESTful Web Service请求和应答。这让Axis2的灵活性、易用性、安全性和可靠性等都得到大幅度地提升。

在Axis2里启用REST风格的Web服务十分简单,首先修改服务器端的axis2.xml配置文件,将enableREST参数的值设置为true。

然后在Axis2的客户端的使用中,初始化一个Options对象,填入我们要访问的服务URL、设置传输协议为HTTP、设置打开对REST支持等,然后将Options对象传递给一个Call对象,最后调用 call.invodeBlocking方法,并在该访问的参数里指定调用的服务方法即可。

Axis2会同时作为SOAP端点和REST端点,在服务端可以同时发布这两种风格的Web服务。在客户端,如果接收到的消息的contentType为text/xml,并且没有SOAP相关的Header的话,这个消息就会当作 RESTful消息来处理,否则当作SOAP消息来处理。

其他RESTful框架

除了Ruby on Rails和Axis2,还有一些框架也纷纷提供了对REST的支持。

Django是基于python语言的敏捷Web和Web服务开发框架,它的设计与Rails十分类似,只不过简化和封装稍少一些。

django -rest-interface是Google Code上的一个开源项目,它给Django的REST开发接口提供了简便的封装。最重要的是Collection类和XMLResponder类,在 urls.py文件里使用Collection定义资源集合以及使用XMLResponder定义responder,并在urlpatterns中将该资源集合映射到某一url,则该资源就以REST方式发布了Web服务,对该Web服务的实现细节如HTTP动词等都隐藏在Collection里。

Apache CXF提供了一套创建SOA服务的基础设施,利用Apache CXF可以轻松创建基于SOAP或REST的Web服务。CXF是基于两大著名开源项目Celtix和XFire发展起来的,它提供了对JAX-WS的全面支持,并且还支持Binding以及Transport。

Restlet是基于Java的另一个轻量但健全的RESTful框架,它的发展十分稳定,有一定的潜力。Restlet支持所有REST概念(资源、展示、连接器、组件等),支持阻塞和非阻塞(NIO)模式,支持logging (LogChainlet)、authentication(GuardChainlet)和cool URIs重写(RedirectRestlet)等。

另外Microsoft的Indigo/WCF平台最近也加入了REST的集成,这意味这Indigo中的WebService将不仅仅使用SOAP了。

而JSR 311: JAX-RS则定义了RESTful Web Service的Java API规范,该规范基于JDK5的元数据语法。

对比SOAP和WS-*规范,REST对于简化Web服务开发和消费的意义是重大的,许多大型网站已经开始提供REST服务,如Amazon、eBay、 Yahoo和Flickr。在关注CRUD场景的、面向数据的应用以及简单的、没有复杂安全要求的Web服务方面,使用REST是明智的,但是在需要事务、严密的安全性等高级应用方面,可能基于WS-*的方案会更胜任。

目前实现的最好、开发效率最高的REST框架就是Ruby on Rails了。RoR在即将发布的2.0版本也将全面基于REST,可见Rails的作者DHH对REST是多么看重。Axis2则是Java端老牌 Web服务方案,但是Axis2支持的东西太多太杂,用Axis2开发REST应用总觉得有点大材小用。Restlet则麻雀虽小,五脏俱全,轻量而简洁,还有完善的认证支持,很值得期待。JAX-RS作为RESTful Web Service的Java API规范,又是基于Annotation语法来提高开发效率,相信不久的将来会更好地支持REST。

表1. Rails的REST URL、HTTP动词与Action的对应

图1 Axis2架构

 

2、我的思考及选择

&n
bsp; 对于RESt适合资源导向的网站,例如对于Flickr、Youtube这样的资源导向(resource-oriented)站点是较为适合的,而对于诸如paypal、易宝支付、支付宝这样交易导向(Transaction-oriented)的电子商务的网站还是采用典型的Web Service(SOAP或XML-RPC方式)较为适合。

  基于Java进行平台选择来说(尤其是对外提供接口时候),如果要选择一个相对具有扩展性、普适应的平台架构,可能选择基于mule这样对SoA有较好支持并且集成了REST、Web Service功能的框架较为恰当,如果只是作为一个library来提供对REST的支持, Apache CXF(XFire)、GombaRestlet还是值得选择的。

  而对于PHP或Python,基本上都有参考RoR思想的框架,这些框架本身借鉴了RoR的REST思想,因此天然就可以支持REST。PHP我选择CakePHP,Python我选择Django。

  • Java

   Apache CXF(XFire

   Restlet

   Gomba

   Apache Axis2

  • PHP:

   cakephp

  • Python:

   django

 

3、参考资料:

  Building Web Services the REST Way

  http://brainstorm.javaeye.com/blog/119963

  http://www.slideshare.net/ozten/rest-vs-soap-yawn

  面向资源与面向活动的 Web 服务

  Architectural Styles and the Design of Network-based Software Architectures

Technorati 标签: , , , , , , ,

No Responses Yet

Subscribe to comments with RSS.

  1. […] Brief Introduction to REST REST开发框架纵览 application , icyriver , internet , network , […]


发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: