免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用 RESTlet 框架開發(fā)符合 JSR311 規(guī)范標準的 REST Web Service

JSR311 作為 Java 實現(xiàn) REST Web Service 的規(guī)范標準,盡管從出生起就備受爭議,但從事實上,已經(jīng)普遍被大多數(shù) REST 實現(xiàn)框架的接受。這中間,既有 Sun 公司原產(chǎn)的 Jersey, 也有其他的開源項目,如 Jboss 的 RESTEasy, Apache 的 CXF 等。當然,還有發(fā)展時間最長,相當成熟的 RESTlet 框架。

RESTlet 的主體核心是按照 Roy Thomas Fielding 的著作"Architectural Styles and the Design of Network-based Software Architectures"。結(jié)構(gòu)清晰,穩(wěn)定性強。但是該框架下的資源定義是有別于 JSR311 的那種 JAX-WS 風(fēng)格的 annotation。這對于鐘愛 RESTlet 的 Web Service 開發(fā)人員,就面臨著選擇陣營的風(fēng)險。所幸的是,RESTlet 的領(lǐng)導(dǎo)開發(fā)人員 J é rome Louve 也是 JSR311 的參與者 , 這反映在 RESTlet 1.1 提供了一個 Extension 來幫助 RESTlet 的開發(fā)人員編寫符合 JSR311 的 Web Service。某些企業(yè)級產(chǎn)品,如 IBM Systems Director 6.1.2, 已經(jīng)在產(chǎn)品中使用這種技術(shù)。本文重點介紹 JAX-RS extension 的基本實現(xiàn)結(jié)構(gòu)以及如何利用該插件進行 JSR311 規(guī)范標準的 REST Service。

本文以 Neolies RESTlet 1.1.8 作為討論的基礎(chǔ),并且假定讀者已經(jīng)對 REST,JAX-RS 以及 RESTlet 有一定的理解。因此不會詳細討論相關(guān)的基本知識,讀者也可以通過閱讀"構(gòu)建 RESTful Web 服務(wù)"來獲取這方面的相關(guān)知識。

RESTlet 和 JSR-311

JAX-RS Annotation 簡介

  • @Path: 用來映射 URI,為資源類以及資源類中包含的方法提供訪問路徑。
  • @GET: 表示處理 HTTP GET 請求的資源類方法。當 Web Service 獲得客戶端發(fā)出的對與某個網(wǎng)絡(luò)資源的 HTTP GET 操作時,服務(wù)器會調(diào)用被 @GET 注解后的方法來處理 GET 請求。當然,被調(diào)用的資源類方法首先得滿足 URI。
  • @POST: 表示處理 HTTP POST 請求的資源類方法。和 @GET 相類似,只不過對應(yīng)的是 HTTP POST 操作。
  • @PUT: 表示處理 HTTP PUT 請求的資源類方法。該 Annotation 通常用于更新網(wǎng)絡(luò)對象的方法。和 @GET,@POST 處理流程相類似。
  • @DELETE: 表示處理 HTTP DELETE 請求的資源類方法。使用該 Annotation 后的方法通常是刪去每個網(wǎng)絡(luò)對象的實例。處理流程和 @GET,@POST,@PUT 相類似。
  • @HEAD: 表示處理 HTTP HEAD 請求的資源類方法。通常情況下,根據(jù) JAX-RS 規(guī)范的設(shè)定,在沒有實現(xiàn) @HEAD 的資源類方法時,RESTlet JAX-RS extension 會自動處理 HTTP HEAD 請求,@GET 注解的資源類方法會自動被調(diào)用。和處理普通的 HTTP GET 請求的區(qū)別是沒有實例被返回。@HEAD 注解的資源類方法通常用來獲取 Web Services 能夠接受的數(shù)據(jù)格式。
  • @Produces: 用來表示資源類方法能夠返回的 MIME 的媒體類型。
  • @Consumes: 用來表示資源類方法能夠處理的 MIME 的媒體類型。

Neolies RESTlet 設(shè)計風(fēng)格上盡量遵循 Roy Fielding 博士論文中所闡述的 REST 的目標。從實現(xiàn)層面上,Neolies RESTlet 可以分為三個部分:

  • RESTlet API: 這個部分設(shè)計了 RESTlet 的框架,包括在經(jīng)典 REST 結(jié)構(gòu)中所包括的 Application, Component,Route,Connector,VirtualHost, Resource 等,都在這個部分被詳細定義。
  • NRE(Noelios Restlet Engine):這個部分是對 RESTlet API 的參考實現(xiàn),RESTlet API 通過代理模式 (Delegation) 將具體的工作轉(zhuǎn)交到 NRE 中執(zhí)行,如 RESTlet API 中的 Application 在 NRE 中的代理就是 ApplicationHelper。
  • Extensions:這個部分是對 RESTlet API 的擴展(不依賴于 NRE)。包括 JAX-RS Extension,還有對 JSON 或是對 JAXB 的 Extensions。

JAX-RS 與 RESTlet API 的不同之處在于,在 RESTlet 下,REST 資源是結(jié)構(gòu)化組織起來的,如 Component 可以包含多個 Application,Application 又可以包含多個 REST 資源,Component 到 Application,Application 到 REST 資源以 Route 來連接。這樣,從 URI 到 REST 資源的定位就自上而下進行查找。JSR311 下,REST 資源是 POJO 并且非結(jié)構(gòu)化的,資源對應(yīng)的 URI 通過 Annotation 直接在 POJO 類里加以描述(這里不討論 subresource 資源的定位)。相對來說,JAX-RS 描述能力簡單,開發(fā)起來更加方便。JAX-RS 所定義的 REST 框架,包括:

  • Annotation:比如說在 HttpMethod 支持 @PUT,@POST,@DELETE,@GET 等等,或是 @QueryParam 可以表示 GET 操作的查詢參數(shù)等等。這些 Annotation 在 REST 資源所在的 POJO 類里被使用。
  • Application:JAX-RS 沒有定義 Component 或是 VirtualHost,只是用 Application 來存放所有的 REST 資源。
  • HTTP 協(xié)議基礎(chǔ)類:包括 CacheControl, Cookie 等等,這些類處理 HTTP 協(xié)議層的相關(guān)字段,這些類的具體實現(xiàn)是以代理模式 (Delegation),通過 RuntimeDelegate 類來連接到具體實現(xiàn)的。
  • MessageBodyReader 和 MessageBodyWriter:這對接口的實現(xiàn)主要使用在 Provider。Provider 可以用作 REST 相應(yīng)體的序列化和反序列化。

RESTlet JAX-RS Extension 實現(xiàn)了 JAX-RS。主要的技術(shù)要點包括:

  • internal.Provider:JAX-RS Extension 通過 MessageBodyReader 和 MessageBodyWriter,實現(xiàn)了 InputStream,Jaxb,ByteArray 等 Provider 的序列化和反序列化。
  • internal.spi:JAX-RS Extension 實現(xiàn)了 HTTP 協(xié)議基礎(chǔ)類。
  • internal.exceptions:定義了 JAX-RS 拋出的異常。
  • JaxRsApplication:實現(xiàn)了 JAX-RS 的 Application 接口,并且包含 JaxRsRestlet。具體的工作是在 JaxRsRestlet 中處理的。
  • JaxRsRestlet:包含了所有的 REST POJO 資源,在初始化時分析 REST 資源的 Annotation, 得到 REST 資源所對應(yīng)的 URI,對應(yīng)的接口以及其他相關(guān)信息。JaxRsRestlet 還包含了所有 Provider 的引用和所有異常的引用。運行過程中,所有的 REST 請求被路由到 JaxRsRestlet,由該對象來選擇合適的 REST 資源及方法來進行處理。

RESTlet JAX-RS Extension 的配置

配置基于 RESTlet JAX-RS Extension 的 Web Service 也就是部署該架構(gòu)下的 Web Service。RESTlet 架構(gòu)提供兩種部署 Web Service 的方式。兩種方式都方便簡單,用戶可以根據(jù)自己的需求選擇任意一種部署方式。

  • 將 Web Service 當做單獨的 Java 程序進行部署
  • 將 Web Service 部署到 Servelet Container 中

兩種方式都方便簡單,用戶可以根據(jù)自己的需求選擇任意一種部署方式。

將 Web Service 部署成一個單獨運行的 Java 應(yīng)用非常的簡單,只需要完成以下幾個步驟。

  • 導(dǎo)入需要的 JAR 包,org.restlet.jar,以及 org.restlet.ext.jaxrs_1.0.jar
  • 為 HTTP Server 創(chuàng)建相應(yīng) Java 類。在新建的 Java 類中依次完成以下工作,引入 org.restlet.jar 包中需要的類,新建 HTTP Server,定義該 Server 監(jiān)聽的端口,將 Web Service 的配置類加入到 HTTP 服務(wù)器中。
  • 編譯運行 HTTP Server。

將基于 RESTlet Jax-Rs Extension 的 Web Service 部署到 Servelet Container 中的過程和部署一個基本的 Servelet 極其相似。不同的是,部署過程中,用戶需要注意添加需要的 Jar 包。以下 Jar 是該部署方式所需要的。

為了成功將基于 RESTlet Jax-Rs Extension 的 Web Service 部署為 Servelet,用戶需要完成以下動作。

  • 編譯基于 RESTlet Jax-Rs Extension 的 Web Service 包含的代碼。
  • 將需要的 JAR 包存放于 /WEB-INF/lib 中。
  • 創(chuàng)建 Servelet 的配置文件 web.xml。
  • 將所有相關(guān)內(nèi)容打包成 WAR 包,并部署到用戶選定的 Servelet 容器中。

在 RESTlet 架構(gòu)下實現(xiàn) JAX-RS Web Service 示例

JAX-RS Extension 是在 RESTlet 架構(gòu)下的對 JAX-RS:Java API for RESTful Web Services 的實現(xiàn)。本段將通過實例說明如何使用 JAX-RS 提供的接口實現(xiàn) RESTlet 架構(gòu)下的 Web Service。 在正式介紹實例之前,先對實例的應(yīng)用環(huán)境進行簡單的分析。本文以一個簡單的用戶管理功能為基礎(chǔ)介紹如何在 RESTlet 架構(gòu)下實現(xiàn) JAX-RS Web Service。實例中的用戶管理功能主要包括用戶組和用戶兩個對象,使用者可以通過調(diào)用 PUT 操作添加新的用戶組和用戶,GET 操作則可以用來獲取已存在用戶組和用戶的信息,用戶組和用戶的刪除則通過 Delete 操作來實現(xiàn)。為了簡單起見,本實例僅提供 GET 操作的實現(xiàn),POST 操作和 Delete 操作只需要按照 REST 架構(gòu)類似的實現(xiàn)就可以。本例相關(guān)的 URI 實現(xiàn)。

  • /users/usergroup:請求用戶組的介紹。
  • /users/usergroup/{id}: 請求特定的用戶組信息。
  • /users/user: 請求用戶對象的相關(guān)介紹。
  • /users/user/{id}: 請求特定用戶對象的相關(guān)信息。

對需求分析結(jié)束后,我們將開始實現(xiàn)該過程主要可以分為三個步驟。

  • 提供資源類,實現(xiàn)需要支持的操作
  • 根據(jù)需求創(chuàng)建應(yīng)用配置類
  • 建立 JAX-RS 服務(wù)器,部署實例

創(chuàng)建資源類

首先需要創(chuàng)建一個 JAVA 類命名為 JaxRsExtensionResource,通過 @GET 的使用,將不同的 HTTP GET 請求映射到資源類方法中。@Path 的使用將 URI 與相應(yīng)的資源類以及資源方法相結(jié)合。例如, @Path("users") 將 URI /users/ 和 ExampleResource 類相關(guān)聯(lián),Path("user/{id}") 將 URI /users/user/{id} 與 ExampleResource 的 findUser(...) 方法相關(guān)聯(lián)。User 類是對用戶的抽象,UserGroup 是對用戶組的抽象。UserManager 類負責(zé) User 實例的管理,相應(yīng) UserGroupManager 類負責(zé) UserGroup 實例的管理。

 package com.developerworks.jaxrs.resltet.example; 

 import java.util.ArrayList; 
 import java.util.List; 

 import javax.ws.rs.*; 

 @Path("users") 
 public class JaxRsExtensionResource { 

    @GET 
    @Path("usergroup") 
    public String getUserGroup() { 
        return "Group are used to classify different kind of users!"; 
    } 

  
    @GET 
    @Path("user") 
    public String getUser(){ 
		 return "Users inlcudes the information of registered user!"; 
    } 
 
    @GET 
    @Path("user/{id}") 
    public String findUser(@PathParam("id") String id){ 
    	 User temp = UserManager.get().getDetails(id); 
    	 if(temp != null) 
    		 return temp.toString(); 
    	 else 
    		 return "The user you queried(ID:" + id + ") doesn't existed!"; 
    } 
    
    @GET 
    @Path("usergroup/{id}") 
    public String findUserGroup(@PathParam("id") String id){ 
    	 UserGroup group =  UserGroupManager.get().getDetails(id); 
    	 if(group != null) 
    		 return group.toString(); 
    	 else 
    		 return "The group you queried(ID:" + id + ") doesn't existed!"; 
    } 
    
 } 

創(chuàng)建應(yīng)用類

RESTlet 架構(gòu)中的應(yīng)用類主要用來初始化 Web Service 的運行環(huán)境。Restlet 為了方便使用者,提供了很多可以方便使用的基本功能, 用戶通過自己定義的應(yīng)用類來選擇使用需要的功能。這些基本功能包括為客戶端和服務(wù)器端提供必要的鏈接,編碼解碼功能,元數(shù)據(jù),狀態(tài)包裝等。本例不涉及到這些功能,所有有關(guān)這些功能的說明及使用方法,請參閱 RESTlet 手冊。在本例中,我們只需將上節(jié)定義的資源類加入即可。

 package com.developerworks.jaxrs.resltet.example; 

 import java.util.HashSet; 
 import java.util.Set; 
 import javax.ws.rs.core.*; 

 public class ExampleApplication extends Application { 

    public Set<Class<?>> getClasses() { 
        Set<Class<?>> rrcs = new HashSet<Class<?>>(); 
        rrcs.add(JaxRsExtensionResource.class); 
        return rrcs; 
    } 
 }

RESTlet 架構(gòu)為了更好的支持 JAX-RS 規(guī)范,定了 JaxRsApplication 類來初始化基于 JAX-RS 的 Web Service 運行環(huán)境。JaxRSApplication 類使用起來非常的方便,只需要將原本基于 RESTlet 架構(gòu)的應(yīng)用類加入到用戶自己實現(xiàn)的 JaxRsApplication 子類中即可。如果需要認證功能的話,使用 JaxRsApplication 的 setGuard(...) 或者 setAuthentication(...) 方法即可。本例中不設(shè)置到認證功能,所以只需要將 ExampleApplication 類加入到本例實現(xiàn) JaxRsApplication 子類中即可。

 package com.developerworks.jaxrs.resltet.example; 

 import org.restlet.Context; 
 import org.restlet.ext.jaxrs.JaxRsApplication; 

 public class JaxRsExtensionApplication extends JaxRsApplication { 

    public JaxRsExtensionApplication(Context context) { 
        super(context); 
        this.add(new ExampleApplication()); 
    } 
    
    public static void main(){ 
    	 System.out.println("Hello"); 
    } 
 }

部署 Web Service

新建 Java 類,命名為 JaxRsExtensionServer, 在該類中創(chuàng)建一個新的 Http Server,并為該 Http Server 添加監(jiān)聽端口,本例使用 8182 端口。將上面創(chuàng)建的 Web Service 運行環(huán)境配置類 JaxRsExtensionApplication 加入到 Http Server 中。

 package com.developerworks.jaxrs.resltet.example; 

 import org.restlet.Component; 
 import org.restlet.data.Protocol; 

 public class JaxRsExtensionServer { 
     public static void main(String[] args){ 
         try{ 
             Component component = new Component(); 
             component.getServers().add(Protocol.HTTP, 8182);         
             component.getDefaultHost().attach(new JaxRsExtensionApplication(null)); 
             component.start(); 
         }catch(Exception e){ 
             e.printStackTrace(); 
         } 
     } 
 }

將基于 RESTlet Jax-Rs Extension 的 Web Service 部署到 Servelet Container 中的過程和部署一個基本的 Servelet 極其相似。不同的是,部署過程中,用戶需要注意添加需要的 Jar 包。然后,創(chuàng)建 Servelet 的配置文件 web.xml。下面是為本例所寫的配置文件。最后用戶需要將這些一起打包成 WAR 包,并部署到用戶選定的 Servelet 容器中。

 <?xml version="1.0" encoding="UTF-8"?>  
 <web-app id="WebApp_ID" version="2.4"  
            xmlns="http://java.sun.com/xml/ns/j2ee"  
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
                 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
   <display-name>RESTlet Jax-RS extension Example</display-name>  
   <!-- Application class name -->  
   <context-param>  
      <param-name>org.restlet.application</param-name>  
      <param-value>  
         com.developerworks.jaxrs.resltet.example.JaxRsExtensionApplication   
      </param-value>  
   </context-param>  
  
   <!-- Restlet adapter -->  
   <servlet>  
      <servlet-name>RestletServlet</servlet-name>  
      <servlet-class>  
         com.noelios.restlet.ext.servlet.ServerServlet   
      </servlet-class>  
   </servlet>  
  
   <!-- Catch all requests -->  
   <servlet-mapping>  
      <servlet-name>RestletJaxRsExtensionServlet</servlet-name>  
      <url-pattern>/*</url-pattern>  
   </servlet-mapping>  
 </web-app> 

在實際的開發(fā)環(huán)境中,日志是一項非常重要的功能,好的日志對程序開發(fā)者快速定位問題的好幫手。RESTlet 架構(gòu)中使用了 JDK 中自帶的日志功能,用戶額可以使用已經(jīng)熟悉的方式配置日志,讀寫日志。有關(guān)日志的具體介紹可參見 java.util.logging。

運行結(jié)果

基于 RESTlet JAX-RS Extension 的 Web Service 兩種部署方式有著很高的相似性,從用戶使用角度來看,幾乎沒有區(qū)別。本節(jié)中將以部署為單獨的 Java 應(yīng)用來示例運行結(jié)果。


圖 1. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/user 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,getUser() 方法被調(diào)用,返回對用戶概念的說明。


圖 2. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/user/2 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,findUser() 方法被調(diào)用。該方法通過解析 URI 模板中的 ID 參數(shù),獲得用戶想獲得的用戶信息。圖 2 演示被請求的用戶存在時,Web Service 返回該用戶的信息。


圖 3. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/user/3 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,findUser() 方法被調(diào)用。該方法通過解析 URI 模板中的 ID 參數(shù),獲得用戶想獲得的用戶信息。圖 3 演示被請求的用戶不存在時,Web Service 返回相應(yīng)的不存在警告信息。


圖 4. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/usergroup 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,getUserGroup() 方法被調(diào)用,返回對用戶組概念的說明。


圖 5. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/usergroup/1 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,findUserGroup() 方法被調(diào)用。該方法通過解析 URI 模板中的 ID 參數(shù),獲得用戶想獲得的用戶組信息。圖 5 演示被請求的用戶組存在時,Web Service 返回該用戶組的信息。


圖 6. 用戶在瀏覽器中輸入 http://<ServerIP>:8182/users/usergroup/2 后通過 HTTP GET 請求獲得的結(jié)果
 

在 JaxRsExtensionResource 資源類中,findUserGroup() 方法被調(diào)用。該方法通過解析 URI 模板中的 ID 參數(shù),獲得用戶想獲得的用戶組信息。圖 6 演示被請求的用戶組不存在時,Web Service 返回相應(yīng)的不存在警告信息。

結(jié)論

本文主要討論了 JAX-RS 與 RESTlet 在架構(gòu)方面的區(qū)別,以及 RESTlet 如何通過擴展實現(xiàn)對 JAX-RS 的兼容。在此基礎(chǔ)之上,本文也以一個實例的方式,介紹了如何有效得使用 JAX-RS Extension 進行開發(fā)。無論是對于 RESTlet 的開發(fā)人員,或是對于習(xí)慣 POJO 方式的 REST 開發(fā)人員,都可以很方便的使用這一個技術(shù)。


下載

描述名字大小下載方法
本文示例代碼JAX-RSExample.zip10KBHTTP

關(guān)于下載方法的信息


參考資料

學(xué)習(xí)

討論

作者簡介

周鵬,IBM 中國軟件開發(fā)中心軟件工程師,從事過三年 Mainframe 上系統(tǒng)軟件的開發(fā),一年 Director 6.1 在 IBM pSeries 的測試工作以及測試環(huán)境的維護工作。目前負責(zé) Director 6.1 與其他產(chǎn)品,如 IBM Tivoli, HP OVO, CA NSM 等的集成開發(fā)工作。目前從事 Director 代理程序 REST 服務(wù)的設(shè)計和實現(xiàn)。

魯宏勇,IBM 中國軟件開發(fā)中心軟件工程師,從事過兩年 IBM System Director 上的測試工作。目前負責(zé) Director 6.1 與其他產(chǎn)品,如 IBM Tivoli, HP OVO, CA NSM 等的集成開發(fā)工作。從事用以與 Director Server 通訊的 REST 客戶端的設(shè)計和實現(xiàn)。

建議

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java開發(fā)中經(jīng)常使用到的幾種WebService技術(shù)實現(xiàn)方案
在Dubbo中開發(fā)REST風(fēng)格的遠程調(diào)用(RESTful Remoting)
RESTLET開發(fā)實例(一)基于JAX
如何設(shè)計好的RESTful API之安全性
REST服務(wù)開發(fā)實戰(zhàn)
Java 與 REST 的邂逅(一)淺談 Jersey 及 JAX
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服