JSR311 作为 Java 实现 REST Web Service 的规范标准,尽管从出生起就备受争议,但从事实上,已 经普遍被大多数 REST 实现框架的接受。这中间,既有 Sun 公司原产的 Jersey, 也有其他的开源项目, 如 Jboss 的 RESTEasy, Apache 的 CXF 等。当然,还有发展时间最长,相当成熟的 RESTlet 框架。
RESTlet 的主体核心是按照 Roy Thomas Fielding 的著作"Architectural Styles and the Design of Network-based Software Architectures"。结构清晰,稳定性强。但是该框架下的资源定义是有别于 JSR311 的那种 JAX-WS 风格的 annotation。这对于钟爱 RESTlet 的 Web Service 开发人员,就面临着 选择阵营的风险。所幸的是,RESTlet 的领导开发人员 J é rome Louve 也是 JSR311 的参与者 , 这反 映在 RESTlet 1.1 提供了一个 Extension 来帮助 RESTlet 的开发人员编写符合 JSR311 的 Web Service。某些企业级产品,如 IBM Systems Director 6.1.2, 已经在产品中使用这种技术。本文重点介 绍 JAX-RS extension 的基本实现结构以及如何利用该插件进行 JSR311 规范标准的 REST Service。
本文以 Neolies RESTlet 1.1.8 作为讨论的基础,并且假定读者已经对 REST,JAX-RS 以及 RESTlet 有一定的理解。因此不会详细讨论相关的基本知识,读者也可以通过阅读"构建 RESTful Web 服务"来获 取这方面的相关知识。
RESTlet 和 JSR-311
JAX-RS Annotation 简介
@Path: 用来映射 URI,为资源类以及资源类中包含的方法提供访问路径。
@GET: 表示处理 HTTP GET 请求的资源类方法。当 Web Service 获得客户端发出的对与某个网络资源 的 HTTP GET 操作时,服务器会调用被 @GET 注解后的方法来处理 GET 请求。当然,被调用的资源类方 法首先得满足 URI。
@POST: 表示处理 HTTP POST 请求的资源类方法。和 @GET 相类似,只不过对应的是 HTTP POST 操作 。
@PUT: 表示处理 HTTP PUT 请求的资源类方法。该 Annotation 通常用于更新网络对象的方法。和 @GET,@POST 处理流程相类似。
@DELETE: 表示处理 HTTP DELETE 请求的资源类方法。使用该 Annotation 后的方法通常是删去每个 网络对象的实例。处理流程和 @GET,@POST,@PUT 相类似。
@HEAD: 表示处理 HTTP HEAD 请求的资源类方法。通常情况下,根据 JAX-RS 规范的设定,在没有实 现 @HEAD 的资源类方法时,RESTlet JAX-RS extension 会自动处理 HTTP HEAD 请求,@GET 注解的资源 类方法会自动被调用。和处理普通的 HTTP GET 请求的区别是没有实例被返回。@HEAD 注解的资源类方法 通常用来获取 Web Services 能够接受的数据格式。
@Produces: 用来表示资源类方法能够返回的 MIME 的媒体类型。
@Consumes: 用来表示资源类方法能够处理的 MIME 的媒体类型。
Neolies RESTlet 设计风格上尽量遵循 Roy Fielding 博士论文中所阐述的 REST 的目标。从实现层 面上,Neolies RESTlet 可以分为三个部分:
RESTlet API: 这个部分设计了 RESTlet 的框架,包括在经典 REST 结构中所包括的 Application, Component,Route,Connector,VirtualHost, Resource 等,都在这个部分被详细定义。
NRE(Noelios Restlet Engine):这个部分是对 RESTlet API 的参考实现,RESTlet API 通过代理模 式 (Delegation) 将具体的工作转交到 NRE 中执行,如 RESTlet API 中的 Application 在 NRE 中的代 理就是 ApplicationHelper。