有關REST的一點學習筆記

REST的意思是表徵狀態轉移(Representational State Transfer),它是一種基於HTTP協議的網絡應用接口風格,充分利用HTTP的方法實現統一風格接口的服務。其中包括了一下8種方法:

  • GET: 請求獲取指定資源
  • POST: 向指定資源提交數據
  • PUT: 請求服務器存儲一個資源
  • HEAD: 獲取資源的響應頭
  • DELETE: 請求服務器刪除指定資源
  • TRACE: 回顯服務器收到的請求用於診斷調試
  • CONNECT: 設置連接方式、代理服務器等
  • OPTIONS: 返回服務器支持的HTTP請求方法


其中常用的幾種就是POST/DELETE/PUT/GET,達到增刪改查的效果。REST模式的Web應用和服務較SOAP和XML-RPC來說更加簡潔明瞭,但同時也會對安全性提出更高的要求。這裏有兩個概念:安全,冪等。安全是指沒有副作用,連續訪問多次所獲得的結果不受訪問者影響。而冪等指的是重複請求多次與一次請求效果是一樣的。在四中常用的操作中,GET是非安全的,其他三個都是安全無副作用的;POST是非冪等的,其他三個都是冪等的。

設計REST的人認爲:良好的網絡應用表現爲一系列的網頁,可以看作一個個的虛擬狀態機,用戶選擇這些鏈接導致下一個網頁傳輸到用戶終端呈現給用戶,所以REST服務核心思想是狀態的改變

值得提醒的是: REST是設計的風格而不是標準,REST通常基於使用HTTP、URI、XML、HTML這些現有廣泛流行的協議和標準。

  • 資源由URI來指定
  • 對資源的操作包括獲取、修改、創建和刪除
  • 通過操作資源的表現形式來提供服務
  • 資源的表現形式是XML或者HTML取決於讀者是機器還是人,是消費Web服務的客戶端軟件還是瀏覽器,或者其他什麼的


RESTful Web服務也稱爲RESTful Web API,是一個使用HTTP並遵循REST原則的Web服務。它從以下三個方面資源進行定義:

  • URI
  • Web服務接受與返回的互聯網媒體類型,比如Json, XML, YAML等
  • Web服務在資源上所支持的一系列請求方法,比如POST, GET, DELETE 和 PUT

說了這麼多,到底爲什麼要用REST這種設計風格呢,好處如下:

  • 可以充分利用緩存cache來提高響應速度
  • 通訊本身的無狀態可以讓不同的服務器的處理所有類型的請求,提供了服務器的擴展性
  • 瀏覽器就可以充當客戶端,簡化軟件需求
  • 相對於其他疊加在HTTP協議只上的極致,REST依賴性更小
  • 不需要額外的資源發現機制
  • 在軟件技術演進中長期來看具有良好的兼容性


Node.js開發中常用到的一個模塊叫Express,它支持REST風格的請求方式。Express對每種HTTP請求都設計了不同的路由綁定函數。包括了:

  • GET: app.get(path, callback)
  • POST: app.post(path, callback)
  • PUT: app.put(path, callback)
  • DELETE: app.delete(path, callback)
  • PATCH: app.patch(path, callback) - 新增HTTP方法,功能是定義部分更新某個資源
  • TRACE: app.trace(path, callback)
  • CONNECT: app.connect(path, callback)
  • OPTIONS: app.options(path, callback)
  • ALL: app.all(path, callback)

筆者覺得REST這種設計風格比較適應當下錯綜複雜的互聯網時代,多樣化的用戶終端(瀏覽器、iPad、手機甚至任何軟件本身)正好能發揮REST簡潔、兼容的巨大優勢。同時對於研發團隊而言,瞬息萬變的需求也非常適用於REST思想,因爲它能大大降低研發的複雜性,提高整個系統的伸縮性。“通過URL來設計系統結構” 這句話就是對REST的一種很直白的解釋。對研發團隊中的測試人員來說,這也是大大提高系統可測性和簡化測試門檻的一種手段。試想一下,每一個URL對應一個resource,代表一種表現形式,那麼每種表現形式,都可以順利成章的設計成test case,實施TDD(測試驅動開發)就會變得簡單而輕鬆愉快,因爲當系統設計好之後,test case就能很自然地產生,哪怕一個功能都還沒有實現。所以筆者認爲REST的思想,與TDD其實是不謀而合的,通過抽象URL來設計系統,正如通過test case來設計代碼一樣!

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