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。