REST 總覽

2018-08-08 11:39 更新

關(guān)于 REST

REST ,英文全稱是 Representational State Transfer ,翻譯成中文是“表述性狀態(tài)轉(zhuǎn)移”。REST 這個術(shù)語是由 Roy Fielding 在他的博士論文 《 Architectural Styles and the Design of Network-based Software Architectures 》中提出的。REST是基于一些現(xiàn)有的流傳較廣的協(xié)議和標(biāo)準(zhǔn),例如 HTTP, URI,以及XML等,由因為 REST,HTTP 協(xié)議有了更加正確的使用。我們可以將REST理解為設(shè)計模式的一種,它不是標(biāo)準(zhǔn),只是一種用來開發(fā)Web 應(yīng)用的架構(gòu)風(fēng)格。 

REST模式與基于 SOAP 和 WSDL 的 Web 服務(wù)相比的優(yōu)勢在于REST提供的實現(xiàn)方案更為簡潔。REST 提供的是松耦合的 Web 服務(wù),適合為客戶創(chuàng)建在互聯(lián)網(wǎng)傳播的輕量級的 Web 服務(wù)的API。REST 應(yīng)用的請求和響應(yīng)是以“資源表述的轉(zhuǎn)移(the transfer of representations of resources)”為中心進行的。我們稱的資源包括數(shù)據(jù)和各種功能,如果要訪問資源,只需要使用統(tǒng)一的資源標(biāo)識符(URI)即可。我們常見的網(wǎng)頁中的鏈接就是典型的 URI。該資源是通過文檔進行描述的,由一組簡單的、有明確定義的操作執(zhí)行。

例如,一個 REST 資源可能是一座城市當(dāng)前的天氣情況??赡芡ㄟ^一個XML文檔、圖像文件或者HTML頁面來對該資源進行表述。我們的客戶端能夠檢索特定的表述,通過更新其數(shù)據(jù)修改的資源,或者完全刪除該資源。

現(xiàn)在,REST 風(fēng)格越來越受歡迎,而且很多 Web 服務(wù)也開始采用它來設(shè)計與實現(xiàn),目前我們所知道的比較著名的 REST 服務(wù)包括了:Google AJAX 搜索 API、Amazon Simple Storage Service (Amazon S3) 等。

為了能夠讓 RESTful 應(yīng)用是輕量的,簡單的并且更快開發(fā),基于 REST 的 Web 服務(wù)需要遵循以下一些基本的設(shè)計原則:

  • 通過 URI 來標(biāo)識資源:系統(tǒng)中的每一個對象或是資源都可以通過一個唯一的 URI 來進行尋址,URI 的結(jié)構(gòu)應(yīng)該簡單、可預(yù)測且易于理解,比如定義目錄結(jié)構(gòu)式的 URI。
  • 統(tǒng)一接口:以遵循 RFC-2616 所定義的協(xié)議的方式顯式地使用 HTTP 方法,建立創(chuàng)建、檢索、更新和刪除(CRUD:Create, Retrieve, Update and Delete)操作與 HTTP 方法之間的一對一映射:
    • 若要在服務(wù)器上創(chuàng)建資源,應(yīng)該使用 POST 方法;
    • 若要檢索某個資源,應(yīng)該使用 GET 方法;
    • 若要更新或者添加資源,應(yīng)該使用 PUT 方法;
    • 若要刪除某個資源,應(yīng)該使用 DELETE 方法。
  • 資源多重表述:URI 所訪問的每個資源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具體的表現(xiàn)形式取決于訪問資源的客戶端,客戶端與服務(wù)提供者使用一種內(nèi)容協(xié)商的機制(請求頭與 MIME 類型)來選擇合適的數(shù)據(jù)格式,最小化彼此之間的數(shù)據(jù)耦合。在 REST 的世界中,資源即狀態(tài),而互聯(lián)網(wǎng)就是一個巨大的狀態(tài)機,每個網(wǎng)頁是其一個狀態(tài);URI 是狀態(tài)的表述;REST 風(fēng)格的應(yīng)用則是從一個狀態(tài)遷移到下一個狀態(tài)的狀態(tài)轉(zhuǎn)移過程。早期互聯(lián)網(wǎng)只有靜態(tài)頁面的時候,通過超鏈接在靜態(tài)網(wǎng)頁間瀏覽跳轉(zhuǎn)的 page->link->page->link… 模式就是一種典型的狀態(tài)轉(zhuǎn)移過程。也就是說早期的互聯(lián)網(wǎng)就是天然的 REST
  • 無狀態(tài):對服務(wù)器端的請求應(yīng)該是無狀態(tài)的,完整、獨立的請求不要求服務(wù)器在處理請求時檢索任何類型的應(yīng)用程序上下文或狀態(tài)。無狀態(tài)約束使服務(wù)器的變化對客戶端是不可見的,因為在兩次連續(xù)的請求中,客戶端并不依賴于同一臺服務(wù)器。一個客戶端從某臺服務(wù)器上收到一份包含鏈接的文檔,當(dāng)它要做一些處理時,這臺服務(wù)器宕掉了,可能是硬盤壞掉而被拿去修理,可能是軟件需要升級重啟——如果這個客戶端訪問了從這臺服務(wù)器接收的鏈接,它不會察覺到后臺的服務(wù)器已經(jīng)改變了。通過超鏈接實現(xiàn)有狀態(tài)交互,即請求消息是自包含的(每次交互都包含完整的信息),有多種技術(shù)實現(xiàn)了不同請求間狀態(tài)信息的傳輸,例如 URI 重新,cookies 和隱藏表單字段等,狀態(tài)可以嵌入到應(yīng)答消息里,這樣一來狀態(tài)在接下來的交互中仍然有效。REST 風(fēng)格應(yīng)用可以實現(xiàn)交互,但它卻天然地具有服務(wù)器無狀態(tài)的特征。在狀態(tài)遷移的過程中,服務(wù)器不需要記錄任何 Session,所有的狀態(tài)都通過 URI 的形式記錄在了客戶端。更準(zhǔn)確地說,這里的無狀態(tài)服務(wù)器,是指服務(wù)器不保存會話狀態(tài)(Session);而資源本身則是天然的狀態(tài),通常是需要被保存的;這里所指無狀態(tài)服務(wù)器均指無會話狀態(tài)服務(wù)器。
HTTP 請求方法在RESTful Web 服務(wù)中的典型應(yīng)用
資源GETPUTPOSTDELETE
一組資源的URI,
比如 http://www.waylau.com/resources/ 
列出 URI,以及該資源組中每個資
源的詳細信息(后者可選)。
使用給定的一組資源替換當(dāng)前整組資源。在本組資源中創(chuàng)建/追加一個新的資源。 該操作往往返回新資源的URL。刪除 整組資源。
單個資源的URI,比如http://www.waylau.com/resources/142獲取 指定的資源的詳細信息,格式可以自選一個合適的網(wǎng)絡(luò)媒體類型(比如:XML、JSON等)替換/創(chuàng)建 指定的資源。并將其追加到相應(yīng)的資源組中。把指定的資源當(dāng)做一個資源組,并在其下創(chuàng)建/追加一個新的元素,使其隸屬于當(dāng)前資源。刪除 指定的元素。

Java REST

針對 REST 在 Java 中的規(guī)范,主要是 JAX-RS(Java API for RESTful Web Services),該規(guī)范使得 Java 程序員可以使用一套固定的接口來開發(fā) REST 應(yīng)用,避免了依賴于第三方框架。同時,JAX-RS 使用 POJO 編程模型和基于標(biāo)注的配置,并集成了 JAXB,從而可以有效縮短 REST 應(yīng)用的開發(fā)周期。Java EE 6 引入了對 JSR-311 的支持,Java EE 7 支持JSR-339 規(guī)范。

JAX-RS 定義的 API 位于 javax.ws.rs 包中。

伴隨著 JSR 311 規(guī)范的發(fā)布,Sun 同步發(fā)布該規(guī)范的參考實現(xiàn) Jersey。JAX-RS 的具體實現(xiàn)第三方還包括 Apache 的 CXF 以及 JBoss 的 RESTEasy 等。未實現(xiàn)該規(guī)范的其他 REST 框架還包括 SpringMVC 等。

截至目前, JAX-RS 最新的版本是 2.0 (JSR-339

Why Jersey

在 Java 中,既然 規(guī)范的制定者和實現(xiàn)者都是 Sun 公司(現(xiàn)在是 Oracle),那么 Jersey 毫無疑問就是事實上的標(biāo)準(zhǔn),對于 Java REST 的初學(xué)者來說盡量要跟著標(biāo)準(zhǔn)走。當(dāng)然,所有規(guī)范的實現(xiàn),在用法上基本上沒有差別,只是相對來說 Jersey 的實現(xiàn)更全面一些。

本書所有的例子都是基于 Jersey 的,有關(guān) Jersey 的參考,可詳見《Jersey 2.x 用戶指南》。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號