基於jersey和Apache Tomcat構建Restful Web服務(一)
現如今,RESTful架構已然成為了最流行的一種互聯網軟件架構,它結構清晰、符合標准、易於理解、擴展方便,所以得到越來越多網站的采用。那么問題來了,它是什么呢?
起源
REST(Representational state transfer)在 2000 年由 Roy Fielding 在博士論文中提出,他是 HTTP 規范 1.0 和 1.1 版的首席作者之一。
REST 中最重要的概念是資源(resources),使用全球 ID(通常使用 URI)標識。客戶端應用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作資源或資源集。RESTful Web 服務是使用 HTTP 和 REST 原理實現的 Web 服務。通常,RESTful Web 服務應該定義以下方面:
- Web 服務的基/根 URI,比如 http://host/<appcontext>/resources。
- 支持 MIME 類型的響應數據,包括 JSON/XML/ATOM 等等。
- 服務支持的操作集合(例如 POST、GET、PUT 或 DELETE)。
表 1 演示了典型 RESTful Web 服務中使用的資源 URI 和 HTTP 方法。(參考資料 提供了有關 RESTful Web 服務的更多介紹和設計考慮事項。)
表 1. RESTful Web 服務示例
方法/資源 |
資源集合, URI 如: |
成員資源,URI 如: |
GET |
列出資源集合的所有成員。 |
檢索標識為 1234 的資源的表示形式。 |
PUT |
使用一個集合更新(替換)另一個集合。 |
更新標記為 1234 的數字資源。 |
POST |
在集合中創建數字資源,其 ID 是自動分配的。 |
在下面創建一個子資源。 |
DELETE |
刪除整個資源集合。 |
刪除標記為 1234 的數字資源。 |
那么又如何來構建Restful web服務呢?本文介紹一個簡單易學的構建Restful web服務的方法,即是使用Jersey構建Restful web服務。
JSR 311 (JAX-RS) 和 Jersey
JSR 311 或 JAX-RS(用於 RESTful Web Services 的 Java API)的提議開始於 2007 年,1.0 版本到 2008 年 10 月定稿。目前,JSR 311 版本 1.1 還處於草案階段。該 JSR 的目的是提供一組 API 以簡化 REST 樣式的 Web 服務的開發。
在 JAX-RS 規范之前,已經有 Restlet 和 RestEasy 之類的框架,可以幫助您實現 RESTful Web 服務,但是它們不夠直觀。Jersey 是 JAX-RS 的參考實現,它包含三個主要部分。
- 核心服務器(Core Server):通過提供 JSR 311 中標准化的注釋和 API 標准化,您可以用直觀的方式開發 RESTful Web 服務。
- 核心客戶端(Core Client):Jersey 客戶端 API 幫助您與 REST 服務輕松通信。
- 集成(Integration):Jersey 還提供可以輕松集成 Spring、Guice、Apache Abdera 的庫。
有沒有想立即動手寫一個的沖動?那么就接着往下看吧。
Hello World:第一個 Jersey Web 項目
開發環境:
- IDE:Eclipse
- Web 容器:Apache Tomcat 7.0(Jetty 和其他也可以)
- Jersey 庫:Jersey 2.16bundle,包含所有必需的庫
開發 REST 服務
首先,我們這個項目不是基於Maven Archetype的,如果想學習基於Maven Archetype的請移步至官網:https://jersey.java.net/documentation/latest/getting-started.html#new-from-archetype。
下面介紹普通的RESTful Web服務構造方法:
第一步:
首先,打開Eclipse,創建一個Dynamic Web Project,項目名隨意,此處起名為hello。然后點擊Next,再次點擊Next,到達如下界面:
勾選箭頭所指地方,生成web.xml文件。
如果你直接點擊了創建,沒關系,還是有補救方法的,右鍵項目,點擊箭頭所指項:
即可生成文件web.xml文件。
第二步:
創建完成之后,將下載的Jersey bundle包解壓,然后將里面的東西都復制到WEB-INF下的lib文件夾中即可。現在一個Jersey就搭建好了。
第三步:
現在,您已經設置好了開發第一個 REST 服務的環境,該服務對客戶端發出 “Hello”。
要做到這一點,您需要將所有的 REST 請求發送到 Jersey 容器 —— 在應用程序的 web.xml 文件中定義 servlet 調度程序(參見清單 1)。除了聲明 Jersey servlet 外,它還定義一個初始化參數,指示包含資源的 Java 包。
清單 1. 在 web.xml 文件中定義 Jersey servlet 調度程度
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>Hello</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <servlet> 13 <servlet-name>Jersey REST Service</servlet-name> 14 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 15 <init-param> 16 <param-name>jersey.config.server.provider.packages</param-name> 17 <param-value>com.test.restwebservice.rest</param-value> 18 </init-param> 19 <load-on-startup>1</load-on-startup> 20 </servlet> 21 <servlet-mapping> 22 <servlet-name>Jersey REST Service</servlet-name> 23 <url-pattern>/v1/*</url-pattern> 24 </servlet-mapping> 25 </web-app>
現在您將編寫一個名為 HelloResource 的資源,它接受 HTTP GET
並響應 “Hello Jersey”。
清單 2. sample.hello.resources 包中的 HelloResource
1 @Path("/hello") 2 public class HelloResource { 3 @GET 4 @Produces(MediaType.TEXT_PLAIN) 5 public String sayHello() { 6 return "Hello Jersey"; 7 } 8 }
該代碼中有幾個地方需要強調:
- 資源類(Resource Class):注意,資源類是一個簡單的 Java 對象 (POJO),可以實現任何接口。這增加了許多好處,比如可重用性和簡單。
- 注釋(Annotation):在 javax.ws.rs.* 中定義,是 JAX-RS (JSR 311) 規范的一部分。
@Path
:定義資源基 URI。由上下文根和主機名組成,資源標識符類似於 http://localhost:8080/Jersey/rest/hello。@GET
:
這意味着以下方法可以響應 HTTPGET
方法。@Produces
:
以純文本方式定義響應內容 MIME 類型。
測試 Hello 應用程序
要測試應用程序,可以打開您的瀏覽器並輸入 URL http://<host>:<port>/<appctx>/rest/hello。您將看到響應 “Hello Jersey”。這非常簡單,使用注釋處理請求、響應和方法。當然用火狐的RESTClient也是不錯的選擇。
PS:本博客歡迎轉發,但請注明博客地址及作者,因本人水平有限,若有不對之處,歡迎指出,謝謝
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦