什麼是REST?以及RESTful的實現

2022-09-17 00:21:09 字數 4440 閱讀 5098

什麼是rest?

rest (representation state transfer) 描述了乙個架構樣式的網路系統,比如 web 應用程式。它首次出現在 2000 年 roy fielding 的博士**中,他是 http 規範的主要編寫者之一。rest 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是 restful。

web 應用程式最重要的 rest 原則是,客戶端和伺服器之間的互動在請求之間是無狀態的。從客戶端到伺服器的每個請求都必須包含理解請求所必需的資訊。如果伺服器在請求之間的任何時間點重啟,客戶端不會得到通知。此外,無狀態請求可以由任何可用伺服器回答,這十分適合雲計算之類的環境。客戶端可以快取資料以改進效能。

在伺服器端,應用程式狀態和功能可以分為各種資源。資源是乙個有趣的概念實體,它向客戶端公開。資源的例子有:應用程式物件、資料庫記錄、演算法等等。每個資源都使用 uri (universal resource identifier) 得到乙個惟一的位址。所有資源都共享統一的介面,以便在客戶端和伺服器之間傳輸狀態。使用的是標準的 http 方法,比如 get、put、post 和 delete。hypermedia 是應用程式狀態的引擎,資源表示通過超連結互聯。

另乙個重要的 rest 原則是分層系統,這表示元件無法了解它與之互動的中間層以外的元件。通過將系統知識限制在單個層,可以限制整個系統的複雜性,促進了底層的獨立性。

當 rest 架構的約束條件作為乙個整體應用時,將生成乙個可以擴充套件到大量客戶端的應用程式。它還降低了客戶端和伺服器之間的互動延遲。統一介面簡化了整個系統架構,改進了子系統之間互動的可見性。rest 簡化了客戶端和伺服器的實現。

restful的實現:restful web 服務與 rpc 樣式的 web 服務

了解了什麼是什麼是rest,我們再看看restful的實現。最近,使用 rpc 樣式架構構建的基於 soap 的 web 服務成為實現 soa 最常用的方法。rpc 樣式的 web 服務客戶端將乙個裝滿資料的信封(包括方法和引數資訊)通過 http 傳送到伺服器。伺服器開啟信封並使用傳入引數執行指定的方法。方法的結果打包到乙個信封並作為響應發回客戶端。客戶端收到響應並開啟信封。每個物件都有自己獨特的方法以及僅公開乙個 uri 的 rpc 樣式 web 服務,uri 表示單個端點。它忽略 http 的大部分特性且僅支援 post 方法。

由於輕量級以及通過 http 直接傳輸資料的特性,web 服務的 restful 方法已經成為最常見的替代方法。可以使用各種語言(比如 j**a 程式、perl、ruby、python、php 和 j**ascript[包括 ajax])實現客戶端。restful web 服務通常可以通過自動客戶端或代表使用者的應用程式訪問。但是,這種服務的簡便性讓使用者能夠與之直接互動,使用它們的 web 瀏覽器構建乙個 get url 並讀取返回的內容。

在 rest 樣式的 web 服務中,每個資源都有乙個位址。資源本身都是方法呼叫的目標,方法列表對所有資源都是一樣的。這些方法都是標準方法,包括 http get、post、put、delete,還可能包括 header 和 options。

在 rpc 樣式的架構中,關注點在於方法,而在 rest 樣式的架構中,關注點在於資源 —— 將使用標準方法檢索並操作資訊片段(使用表示的形式)。資源表示形式在表示形式中使用超連結互聯。

leonard richardson 和 sam ruby 在他們的著作 restful web services 中引入了術語 rest-rpc 混合架構。rest-rpc 混合 web 服務不使用信封包裝方法、引數和資料,而是直接通過 http 傳輸資料,這與 rest 樣式的 web 服務是類似的。但是它不使用標準的 http 方法操作資源。它在 http 請求的 uri 部分儲存方法資訊。好幾個知名的 web 服務,比如 yahoo 的 flickr api 和 del.icio.us api 都使用這種混合架構。

restful的實現:restful web 服務的 j**a 框架

jsr-311是 sun microsystems 的規範,可以為開發 restful web 服務定義一組 j**a api。jersey是對 jsr-311 的參考實現。

jsr-311 提供一組注釋,相關類和介面都可以用來將 j**a 物件作為 web 資源展示。該規範假定 http 是底層網路協議。它使用注釋提供 uri 和相應資源類之間的清晰對映,以及 http 方法與 j**a 物件方法之間的對映。api 支援廣泛的 http 實體內容型別,包括 html、xml、json、gif、jpg 等。它還將提供所需的外掛程式功能,以允許使用標準方法通過應用程式新增其他型別。

restful的實現:構建 restful web 服務的多層架構

圖 1 展示了自動化客戶端,包括 j**a 和各種語言編寫的指令碼,這些語言包括 python、perl、ruby、php 或命令列工具,比如 curl。在瀏覽器中執行且作為 restful web 服務消費者執行的 ajax、flash、j**afx、gwt、部落格和 wiki 都屬於此列,因為它們都代表使用者以自動化樣式執行。自動化 web 服務客戶端在 web 層向 resource request handler 傳送 http 響應。客戶端的無狀態請求在頭部包含方法資訊,即 post、get、put 和 delete,這又將對映到 resource request handler 中資源的相應操作。每個請求都包含所有必需的資訊,包括 resource request handler 用來處理請求的憑據。

從 web 服務客戶端收到請求之後,resource request handler 從業務邏輯層請求服務。resource request handler 確定所有概念性的實體,系統將這些實體作為資源公開,並為每個資源分配乙個惟一的 uri。但是,概念性的實體在該層是不存在的。它們存在於業務邏輯層。可以使用 jersey 或其他框架(比如 restlet)實現 resource request handler,它應該是輕量級的,將大量職責工作委託給業務層。

ajax 和 restful web 服務本質上是互為補充的。它們都可以利用大量 web 技術和標準,比如 html、j**ascript、瀏覽器物件、xml/json 和 http。當然也不需要購買、安裝或配置任何主要元件來支援 ajax 前端和 restful web 服務之間的互動。restful web 服務為 ajax 提供了非常簡單的 api 來處理伺服器上資源之間的互動。

圖 1 中的 web 瀏覽器客戶端作為 gui 的前端,使用表示層中的 browser request handler 生成的 html 提供顯示功能。browser requester handler 可以使用 mvc 模型(jsf、struts 或 spring 都是 j**a 的例子)。它從瀏覽器接受請求,從業務邏輯層請求服務,生成表示並對瀏覽器做出響應。表示供使用者在瀏覽器中顯示使用。表示不僅包含內容,還包含顯示的屬性,比如 html 和 css。

業務規則可以集中到業務邏輯層,該層充當表示層和資料訪問層之間的資料交換的中間層。資料以域物件或值物件的形式提供給表示層。從業務邏輯層中解耦 browser request handler 和 resource request handler 有助於促進**重用,並能實現靈活和可擴充套件的架構。此外,由於將來可以使用新的 rest 和 mvc 框架,實現它們變得更加容易,無需重寫業務邏輯層。

資料訪問層提供與資料儲存層的互動,可以使用 dao 設計模式或者物件-關係對映解決方案(如 hibernate、ojb 或 ibatis)實現。作為替代方案,業務層和資料訪問層中的元件可以實現為 ejb 元件,並取得 ejb 容器的支援,該容器可以為元件生命週期提供便利,管理永續性、事務和資源配置。但是,這需要乙個遵從 j**a ee 的應用伺服器(比如 jboss),並且可能無法處理 tomcat。該層的作用在於針對不同的資料儲存技術,從業務邏輯中分離資料訪問**。資料訪問層還可以作為連線其他系統的整合點,可以成為其他 web 服務的客戶端。

資料儲存層包括資料庫系統、ldap 伺服器、檔案系統和企業資訊系統(包括遺留系統、事務處理系統和企業資源規劃系統)。使用該架構,您可以開始看到 restful web 服務的力量,它可以靈活地成為任何企業資料儲存的統一 api,從而向以使用者為中心的 web 應用程式公開垂直資料,並自動化批量報告指令碼。

什麼是rest:結束語

rest 描述了乙個架構樣式的互聯系統(如 web 應用程式)。rest 約束條件作為乙個整體應用時,將生成乙個簡單、可擴充套件、有效、安全、可靠的架構。由於它簡便、輕量級以及通過 http 直接傳輸資料的特性,restful web 服務成為基於 soap 服務的乙個最有前途的替代方案。用於 web 服務和動態 web 應用程式的多層架構可以實現可重用性、簡單性、可擴充套件性和元件可響應性的清晰分離。ajax 和 restful web 服務本質上是互為補充的。開發人員可以輕鬆使用 ajax 和 restful web 服務一起建立豐富的介面。

什麼是REST,以及RESTful?

rest representational state transfer 直接翻譯 表現層狀態轉移。這個中文直譯經常出現在很多部落格中。尼瑪誰聽得懂 表現層狀態轉移 這是人話嗎?我自己也困惑了很久,查詢了很多資料,花了差不多一年有個還算清晰的理解。分享如下 ivony 老師的一句話概括很精闢 url...

什麼是REST架構

rest架構風格是全新的針對web應用的開發風格,是當今世界最成功的網際網路超 分布式系統架構,它使得人們真正理解了http協議本來面貌。隨著 rest架構成為主流技術,一種全新的網際網路網路應用開發的思維方式開始流行。rest是什麼 rest是英文representational state tr...

嘗試理解SOAP與REST和RESTful

通俗的語言解釋rest restful。一句話 url定位資源,用http動詞 rest不是rest這個詞,rest是指的是網路中client和server的一種互動形式,rest本身並不實用,實用的是如何設計restfulapi。server提供的restfulapi中,url中只適用名詞來指定資...