REST 在 Java 中的使用


文章來源: http://blog.jobbole.com/109031/

REST是一種混合的架構風格,它的由來以及它的架構元素在筆者的前兩篇文《REST架構風格的由來》和《REST架構風格的架構元素》中已經描述了。本篇主要描述一下J2EE對REST的支持。

Java是在J2EE6中引入了對REST的支持,即JSR-311(JAX-RS 1.1: The JavaTM API for RESTful Web Services),現在JAX-RS到2.0版本了,對應的是JSR-339,JSR是Java技術規范提案,由JCP組織進行管理。該規范使得使用Java進行開發的人員使用一套固定的接口來開發 REST 應用,避免了依賴於第三方框架。JAX-RS是一套接口,具體實現由第三方提供,例如 Sun 的參考實現 Jersey、Apache 的CXF 以及 JBoss 的 RESTEasy,下文會有對它們如何發布rest服務的簡單介紹。

1.常用API介紹

1.1 javax.ws.rs包(用於創建RESTful服務資源的高級接口和注解)

1.1.1 統一接口

JAX-RS使用@javax.ws.rs.POST 、@javax.ws.rs.GET 、@javax.ws.rs.PUT、@javax.ws.rs.DELETE四個注解代表了對資源的CRUD(Create, Retrieve, Update, Delete)操作。

1.1.2 定位資源

注:下文中url中的root代表你的web應用的名稱加上你在web.xml中servlet-mapping元素設置的路徑。

@javax.ws.rs.ApplicationPath 標識應用路徑,用於由@Path提供的所有資源uri的基本uri。當發布在一個servlet容器中,它的值可以使用web.xml中的servlet-mapping進行重寫。

@javax.ws.rs.Path 標識要請求的資源類或類方法的uri路徑。

@javax.ws.rs.PathParam 將uri中指定的路徑參數綁定到資源方法參數,資源類的字段,或資源類的bean屬性。
比如:

當瀏覽器請求http://localhost:8080/root/user/boglond時,方法中userName值為boglond。

@javax.ws.rs.QueryParam 將http請求的Query參數綁定到資源方法參數,資源類的字段,或資源類的bean屬性。

eg:

當瀏覽器請求http://localhost:8080/root/user/getUser?userName=boglond&age=26時,方法中userName值為boglond,age值為26。

@javax.ws.rs.FormParam 將http請求的Form表單中的參數綁定到資源方法參數。

eg:

頁面中的form表單如下

提交表單后方法中userName值為boglond,age值為26。

@javax.ws.rs.CookieParam 將http cookie的值綁定到資源方法參數,資源類的字段,或資源類的bean屬性。
eg:

當瀏覽器請求http://localhost:8080/root/user/getCookieParam時,方法中jsessionId值為”FFF7BDDC46579DBDDDEB3E94776A2623″,此值不是固定的,不同的瀏覽器有不同的值。

@javax.ws.rs.HeaderParam 將http header的值綁定到資源方法參數,資源類的字段,或資源類的bean屬性。
eg:

當瀏覽器請求http://localhost:8080/root/user/getHeaderParam時,方法中accept值為”text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8″,acceptLang值為”zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3″,不同的瀏覽器,值有所不同。

@javax.ws.rs.MatrixParam 將uri矩陣參數的值綁定到資源方法參數,資源類的字段,或資源類的bean屬性。
eg:

當瀏覽器請求http://localhost:8080/root/user/getUser;userName=boglond;age=26時,方法中userName值為boglond,age值為26。

@javax.ws.rs.DefaultValue 設置 @PathParam, @QueryParam, @MatrixParam, @CookieParam, @FormParam, or @HeaderParam參數的默認值。如果它們沒有接收到值,就使用默認值。

@javax.ws.rs.BeanParam 將請求中的bean綁定到資源方法參數,資源類的字段,或資源類的bean屬性。

eg:
bean的配置:

資源類方法的配置:

頁面中的form表單如下:

當提交表單后insertUserBean方法中的userBean對象的屬性值會映射為表單中對應的值。

1.1.3 表述資源的數據格式(通過媒體類型表述)

@javax.ws.rs.Consumes 定義一個資源類的方法或MessageBodyReader能夠接受的媒體類型。方法級別的@Consumes會覆蓋類級別的@Consumes。(指定將要返回給client端的數據MIME類型)

@javax.ws.rs.Produces 定義一個資源類的方法或MessageBodyWriter能夠產生的媒體類型。方法級別的@Produces會覆蓋類級別的@Produces。(指定可以接受client發送過來的MIME類型)

eg:@Produces(“application/json”);指定多個MIME類型 @Produces({“application/json”,”application/xml”})
常見的媒體類型如

媒體類型的常量值在javax.ws.rs.core.MediaType中。

1.1.4 編解碼

@javax.ws.rs.Encoded 禁用由 @QueryParam, @PathParam, @FormParam or @MatrixParam綁定的參數值的自動解碼
eg:

此時沒有使用@Encoded
當瀏覽器請求http://localhost:8080/root/user/getUser;userName=boglond%5CD;age=26時,方法中userName值為boglond\D,age值為26。

當給方法參數加上@Encoded時,
瀏覽器請求http://localhost:8080/root/user/getUser;userName=boglond%5CD;age=26,方法中userName值為boglond%5CD,age值為26。

@Encoded可加在方法的上面禁用此方法所有參數的自動解碼。

1.2 javax.ws.rs.client包(JAX-RS客戶端API)

javax.ws.rs.client.WebTarget 由資源URI標識的資源目標。

javax.ws.rs.client.ClientBuilder 用於加載客戶端實例的主入口點。

eg:使用 request() 函數來初始化一個請求並用后續的 post 或者get等方法來指定請求的類型。

通過 path() 和 resolveTemplate() 方法來處理動態的 URL 路徑參數。

 

1.3 javax.ws.rs.container包(特定容器JAX-RS API )

@javax.ws.rs.container.ResourceContext 提供對資源類實例的訪問,使用@javax.ws.rs.core.Context 注入。

eg:

@javax.ws.rs.container.ContainerRequestContext 容器請求過濾器上下文。為過濾器提供特定於請求的信息的可變類,例如請求URI,消息頭,消息實體或請求范圍屬性。暴露的setter方法允許修改暴露的請求特定信息。

@javax.ws.rs.container.ContainerResponseContext 容器響應過濾器上下文。為過濾器提供特定於響應的信息的可變類,例如消息頭,消息實體或請求范圍屬性。暴露的setter方法允許修改暴露的響應特定信息。

1.4 javax.ws.rs.core包(用於創建RESTful服務資源的低級接口和注解)

@javax.ws.rs.core.MediaType 媒體類型常量類。
j

avax.ws.rs.core.Cookie 在請求中轉移的HTTP Cookie的值。
eg:

eg:

javax.ws.rs.core.Response.Status  http所定義的響應狀態碼。

javax.ws.rs.core.HttpHeaders 一個可注入的接口,提供對HTTP頭信息的訪問。
eg:

@javax.ws.rs.core.UriInfo 一個可注入的接口,提供對應用程序和請求URI信息的訪問。
eg:

@javax.ws.rs.core.Context 將信息注入類字段,bean屬性或方法參數。如

1.5 javax.ws.rs.ext包(為JAX-RS API支持的類型提供擴展)

javax.ws.rs.ext.MessageBodyReader<T> 反序列化
javax.ws.rs.ext.MessageBodyWriter<T> 序列化

2.Jersey發布rest服務簡介

Jersey項目使用apache Maven構建,它的相關模塊都可從Maven中央倉庫獲取。本項目是基於JAX-RS 2.0的。

2.1 創建一個maven工程

如圖

jersey-demo

2.2 在pom中添加依賴

 

 

2.3 配置web.xml

在web.xml中添加

 

2.4 創建資源類

 

訪問:在瀏覽器里輸入http://localhost:8080/jersey-demo/resources/user/getUser?userName=boglond&age=30即可訪問。

3.CXF發布rest服務簡介

3.1 創建一個maven工程

如圖

cxf-demo

3.2 在pom中添加依賴

CXF的依賴

日志的依賴

 

3.3 創建資源類

 

 

3.4 發布REST服務

 

訪問:在瀏覽器里輸入http://localhost:8080/cxf-demo/recources/user/getUser?userName=boglond&age=26即可訪問。

4.RESTEasy發布rest服務簡介

4.1 創建一個maven工程

如圖

resteasy-demo

4.2 在pom中添加依賴

 

注:如果你配置的maven倉庫地址下載不下來resteasy依賴的jar,就將你的maven conf文件夾下的setting.xml 中的倉庫url替換為下面的url。<url>http://repository.jboss.org/nexus/content/groups/public/</url>

4.3 配置web.xml

在web.xml中添加

 

4.4 創建資源類

 

訪問:在瀏覽器里輸入http://localhost:8080/resteasy-demo/user/getUser?userName=boglond&age=30即可訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM