以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 Web Services & Semantic Web Services 』  (http://bbs.xml.org.cn/list.asp?boardid=10)
----  [推介] [InfoQ 2008-05-30] 用Restlet创建面向资源的服务  (http://bbs.xml.org.cn/dispbbs.asp?boardid=10&rootid=&id=63287)


--  作者:admin
--  发布时间:5/31/2008 11:55:00 AM

--  [推介] [InfoQ 2008-05-30] 用Restlet创建面向资源的服务

Restlet项目(http://www.restlet.org)为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架。它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务;而且,事实证明它自从2005年诞生之时起,就是一个可靠的软件。

Restlet项目受到Servlet API、JSP(Java Server Pages)、HttpURLConnection及Struts等Web开发技术的影响。该项目的主要目标是:在提供同等功能的同时,尽量遵守Roy Fielding博士论文中所阐述的REST的目标。它的另一个主要目标是:提出一个既适于客户端应用又适于服务端的应用的、统一的Web视图。

Restlet的思想是:HTTP客户端与HTTP服务器之间的差别,对架构来说无所谓。一个软件应可以既充当Web客户端又充当Web服务器,而无须采用两套完全不同的APIs。

Restlet包括Restlet API和Noelios Restlet Engine(NRE)两部分,NRE是对Restlet API的一种参考实现。这种划分,使得不同实现可以具有同样的API。NRE包括若干HTTP服务器连接器(HTTP server connector),它们都是基于Mortbay的Jetty、Codehaus的AsyncWeb,以及Simple框架这些流行的HTTP Java开源项目的。它甚至提供一个适配器(adapter),使你可以在标准Servlet容器(如Apache Tomcat)内部署一个Restlet应用。

Restlet还提供两个HTTP客户端连接器(HTTP client connector)。它们一个是基于官方的HttpURLConnection类,一个是基于Apache的HTTP客户端库。还有一个连接器允许你容易地按REST风格通过XML文档来处理JDBC源(source);此外,一个基于JavaMail API的SMTP连接器允许你发送内容为XML的Email。

Restlet API包括一些能够创建基于字符串、文件、流(stream)、通道(channel)及XML文档的表示(representation),它支持 SAX、DOM及XSLT。使用FreeMaker或Apache Velocity模板引擎,你可以很容易地创建基于JSP式模板的表示(representations)。你甚至可以像普通Web服务器那样,用一个支持内容协商(content negotiation)的Directory类来返回静态文件与目录。

简单性(simplicity)和灵活性(flexibility)是贯穿整个框架的设计原则。Restlet API旨在把HTTP、URI及REST的概念抽象成一系列类(classes),同时又不把低层信息(如原始HTTP报头)完全隐藏起来。

基本概念
Restlet在术语上参照了Roy Fielding博士论文在讲解REST时采用的术语,如:资源(resource)、表示(representation)、连接器(connector)、组件(component)、媒体类型(media type)、语言(language),等等。这些术语你应该不会陌生。Restlet增加了一些专门的类(如Application、Filter、 Finder、Router和Route),用以简化restlets的彼此结合,以及简化把收到的请求(incoming requests)映射为处理它们的资源。

按此在新窗口浏览图片
图12-1:Restlet的类层次结构

抽象类Uniform及其具体子类Restlet,是Restlet的核心概念。正如其名称所暗示的,Uniform暴露一个符合REST规定的统一接口(uniform interface)。虽然该接口是按HTTP统一接口定义的,但它也可用于其他协议(如FTP和SMTP)。

handle是一个重要的方法,它接受两个参数:Request和Response。正如你可以从图12-1中看到的,每个暴露于网上的调用处理者(call handler)(无论作为客户端还是服务端)都是Restlet的一个子类——也就是说,它是一个restlets——并遵守这个统一接口。由于有统一接口,restlets可以非常复杂的方式组合在一起。

Restlet支持的每一个协议都是通过handle方法暴露的。这就是说,HTTP(服务器和客户端)、HTTPS、SMTP,以及JDBC、文件系统,甚至类加载器(class loaders)都是通过调用handle方法来操作的。这减少了开发者需掌握的APIs的数量。

过滤、安全、数据转换及路由是“通过把Restlet的子类链起来”进行处理的。Filters可以在处理下个restlet调用之前或之后进行处理。Filters实例的工作方式与Rails过滤器差不多,只不过Filters实例跟其他Restlet类一样响应handle方法,而不是具有一个专门的API。

一个Router restlet有许多附属的Restlet对象,它把每个收到的协议调用(incoming protocol call)路由给适当的Restlet处理器。路由(routing)通常是根据目标URI进行的。跟Rails不同的是,Restlet没有对资源层次结构(resource hierarchy)作URI规则限定,所以可以随意设置想要的URI,只要对Routers作相应编程就行了。

除了这一常见用途,Router还可用于其他用途。你可以用一个Router在多台远程机器之间以动态负载均衡的方式来转发调用。即使在这种复杂的情况下,它也一样响应Restlet的统一接口,并且可成为一个更大路由系统中的一个组件。VirtualHost类(Router的一个子类)使我们可以在同一台物理主机上运行多个具有不同域名的应用。在过去,你要引入一个前端Web服务器(如Apache的httpd)才能实现此功能;而用 Restlet的话,它只是另一个响应统一接口的Router实现。

一个Application对象能够管理一组restlets,并提供常见的服务,比方说对压缩的请求进行透明解码,或者利用method查询参数在重载的POST(overloaded POST)之上实现PUT和DELETE请求。最后,Component对象可以包含并编配(orchestrate)一组Connectors、 VirtualHosts及Applications(作为独立Java应用运行的,或者嵌入在一个更大系统(如J2EE环境)中的)。

在第6章,我向你介绍了“把一个问题划分为一组响应HTTP统一接口的资源”的步骤。在第7章,为了处理Ruby on Rails的简单化假设(simplifying assumptions),我对该步骤作了相应的调整。因为Restlet没有做简单化假设(simplifying assumptions),所以我们无须对此步骤进行修改。它可以实现任何REST式系统。如果你刚好想实现一个REST式面向资源的Web服务,可以按愿意的方式来组织和实现这些资源。Restlet确实提供了一些便于创建面向资源的应用的类。其中特别值得一提的是Resource类,它可作为你所有应用资源的基础。

我在本书中一直用URI模板作为一组URIs的简化表达(见第9章)。Restlet用URI模板来进行URI与资源的映射。假如用Restlet来实现第7章那个社会性书签服务的话,它也许要指定一个代表特定书签的URI:

/users/{username}/bookmarks/{URI}
你可以在把Resource子类附加到Router上时使用这种语法。假如你不相信真会这么好的话,可以等到下一节,那时我会实际实现部分书签服务。

编写Restlet客户端
<略>

编写Restlet服务
<略>

资源与URI设计
<略>

请求处理和表示
<略>

编译、运行与测试
<略>

小结
Restlet项目在2007年初发布了1.0正式版。它只用了12个多月的开发时间。目前,该项目具有一个繁荣的开发与用户群体。Restlet 邮件列表很友好,不论是新手,还是有经验的开发者,它都欢迎。作为该项目的创建者,Noelios咨询公司是主要的开发力量,他们也提供专业的支持计划与培训。

在本书编写之时,1.0版处于维护中,新的1.1版已经开始开发了。该项目计划将来把Restlet API提交给JCP(Java Community Process)。还有一个用于REST式Web服务的高层API,它已由Sun公司提交给JCP(JSR311)。这个高层API使得“把Java领域对象暴露为REST式资源”更加容易。这将是对Restlet API(尤其是其Resource类)的一个很好的补充。Noelios咨询公司是最初的专家组成员,他们将根据标准的进展来对Restlet引擎作相应的更新。


全文请看InfoQ中文站:http://www.infoq.com/cn/articles/restlet-for-restful-service


--  作者:lark
--  发布时间:6/3/2008 4:34:00 PM

--  
好文 最近在学习REST中
--  作者:bigdog_wj
--  发布时间:9/16/2008 7:57:00 AM

--  
rest的一个最重要的特征就是返回的文件中包含URI, Restlet里面有一个DomRepresentation,可以生成Dom文件并返回结果. 请问搂住是否知道怎样用Restlet 生成的返回文件中包含xlink? 这个用jdom可以实现,但是restlet里面没有jdomRepresetation这各类阿。多谢指教
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
3,794.922ms