REST 總覽

2018-08-08 11:39 更新

關(guān)于 REST

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

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

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

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

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

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

Java REST

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

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

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

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

Why Jersey

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)