3、restlet 2.3 用戶指南(三)框架


原文鏈接:http://restlet.com/technical-resources/restlet-framework/guide/2.3

以下翻譯,以直譯方式爲主,內容主要針對目前應用最爲廣泛的基於 Java 的服務器端的開發與應用,並修復原文中涉及到的代碼 bug 。


PS:下文中resources、representation、RESTful 等屬於一組相關的領域內專有名詞,不便翻譯。其中 resources 可以理解爲“資源”。representation 可以理解爲“表現層對象”。RESTful 可以理解爲基於 REST 理念或架構的框架和應用。


測試環境:

Mac OS X Yosemite Version 10.10.4

IntelliJ IDEA 14.app jdk1.8.0_51.jdk

maven 3.3.3

3 框架

3.1 介紹

restlet 框架由兩個主要部分組成。首先是 restlet API,這個 API 支持 REST 和 HTTP 的概念,可以減輕客戶端和服務端的調用處理。這個API 受 restlet 引擎的支持並可打成一個簡單的 jar 包(org.restlet.jar


這種 API 與執行實現的分離結構,類似於,servlet API 與jetty、tomcat 等 web 容器的分離,JDBC API 與具體的 JDBC 驅動的分離。


3.2 REST 架構概覽

讓我們後退一點,先從 REST 角度考慮一個典型的 web 架構。在下面的圖表中,端口(小方塊)表示連接器,這些連接器提供了由用大方塊表示的兩兩組件之間的通訊。連線表示當前通訊所使用的特定協議(例如 HTTP、SMPT)。


注意,任意數目的客戶端和服務器端連接器可以歸屬於同一個組件。例如 web Server B,既有一個服務端的連接器去應答由 User Agent 組件發出的請求,也有多個客戶端連接器來向 web Server A 和 Mail Server 組件發送請求。


3.3 restlet 架構概覽

restlet 框架不僅可以支持標準的 REST 架構,除此之外,還提供了一組類,可以極大地簡化了在單個 JVM 中多個應用的部署。restlet 的目標是提供一個 RESTful 、便於移植的、靈活的 API 來替代現存的 servlet API。在下圖中,我們能看到使用了三種類型的 restlet 來處理複雜的情形。組件可以管理多個虛擬主機和應用。

虛擬主機支持靈活的配置方式,例如,多個域名可以共享同一個 IP 地址,或者一個域名通過多個 IP 地址來做到負載均衡。最終,我們通過應用程序來管理一組相關的 restlet、resources 以及 representations 。補充說明,在不同的 restlet 實現以及不同的虛擬主機之間,這些應用程序需要確保能夠便於移植和支持重新配置。並且,這些應用程序需要能提供一些重要的服務,例如,記錄訪問日誌,自動解析請求實體、可配置的狀態頁設置等等。


爲了闡述這些類的作用,我們舉一個簡單的例子。我們創建一個 restlet 組件,然後加入 HTTP server connector 並且監聽將要鏈接的服務器的 8182 端口,接着創建一個 ServerResource 並將其加入到組件的默認虛擬主機中。這個默認的主機可以捕獲任何的請求內容,這些請求內容並沒有導入到一個聲明好的虛擬主機之中(詳細內容參考 Component.hosts 的屬性)。在後面的例子中,我們也將會介紹應用類的使用。注意,到目前爲止你在控制檯中是看不到任何訪問日誌的。

完整代碼如下:

import org.restlet.Component;
import org.restlet.data.Protocol;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;

/**
 * Created by HEAVEN on 7/31/15.
 */
public class Test extends ServerResource {
    public static void main(String[] args) throws Exception {
        // Create a new Restlet component and add a HTTP server connector to it
        Component component = new Component();
        component.getServers().add(Protocol.HTTP, 8182);
        // Then attach it to the local host
        component.getDefaultHost().attach("/trace", Test.class);
        // Now, let's start the component!
        // Note that the HTTP server connector is also automatically started.
        component.start();
    }

    @Get("txt")
    public String toString() {
        // Print the requested URI path
        return "Resource URI  : " + getReference() + '\n' + "Root URI      : "
                + getRootRef() + '\n' + "Routed part   : "
                + getReference().getBaseRef() + '\n' + "Remaining part: "
                + getReference().getRemainingPart();
    }
}

(PS:運行後,控制檯輸出信息如下:)

Mac OS X Yosemite Version 10.10.4 ... 

Load ...

(~~)

Starting the internal [HTTP/1.1] server on port 8182

2015-07-3121:19:590:0:0:0:0:0:0:1- - 8182 GET /trace - 200 148 056 

http://localhost:8182 

Safari/537.36 -


現在,在瀏覽器中輸入:http://localhost:8182/trace/abc/def?param=123 我們測試一下,在瀏覽器中下面是你將要看到的結果:

    Resource URI  : http://localhost:8182/trace/abc/def?param=123
    Root URI      : http://localhost:8182/trace
    Routed part   : http://localhost:8182/trace
    Remaining part: /abc/def?param=123

(PS:運行後,控制檯輸出信息如下:)

Mac OS X Yosemite Version 10.10.4 ... 

Load ...

(~~)

Starting the internal [HTTP/1.1] server on port 8182

2015-07-31 21:20:10 0:0:0:0:0:0:0:1 - - 8182 GET /trace/abc/def param=123 200 184 0 62http://localhost:8182

Safari/537.36 -


3.4 持久化層

restlet 框架儘管完全不可預知你所想要採用的持久化技術,但由於有着衆多的成功案例,我們有信心你將不會在這一領域受到限制。

從 restlet 的角度出發,有一個基礎性的設計理念,就是將你的由組件組成的應用,繼承 org.restlet.resource.Resource 這個類。而那些子類用於管理輸入的請求處理。對於每一個請求,都將會創建一個 resource 子類的實例來處理,這樣也確保了你不必關心你的應用程序的併發訪問的問題。

當你的 resource 類被實例化後,它將必須暴露他的 representations (通過 HEAD,GET 方法),來用於執行存儲(PUT 方法)、導入(POST 方法)、刪除(DELETE 方法)representations的操作。在構建期間,基於你的 resource ID 以及請求的參數或者屬性,你將可以把持久層關聯起來,從而支持邏輯處理或者返回 resource 的 representations 。


3.5 表現層

與 servlet API 相比,restlet API 並沒有像 JSP 之類的輔助 API。替代方式是,我們選擇了一個相同的設計方案開放給所有的表現層技術。這種開放性體現在用於響應實體的 representation 類之中。

更具體的來說,我們提供了三種流行模板技術的集成技術: XSLT, FreeMarker and Apache Velocity 並且,集成 Facelets 已經由第三方完成,它將能夠輕易的兼容其他任何可複用的模板技術。

關於功能擴展的設計理念是使用 TemplateRepresentation ,這個模板表現對象使用一個模板文檔的數據結構來生成。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章