RESTful API淺談

 

REST

REST全稱是Representational State Transfer,中文翻譯的話有很多種說法,比如:表現層狀態轉化、表述性狀態轉移、表述性狀態傳遞等等,不管怎麼翻譯,大致的意思都是:資源在網絡中以某種表現形式進行狀態轉移。

理解“表現層狀態轉化”:

1. Representational(表現層)

某種表現形式,比如用JSON,XML,JPEG等。我們把"資源"具體呈現出來的形式,叫做它的"表現層"。

2. State Transfer(狀態轉化)

訪問一個網站,就代表了客戶端和服務器的一個互動過程。在這個過程中,勢必涉及到數據和狀態的變化。

互聯網通信協議HTTP協議,是一個無狀態協議。這意味着,所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生"狀態轉化"。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。

客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議裏面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。

它首次出現在2000年Roy Fielding的博士論文中,Roy Fielding是HTTP規範的主要編寫者之一。 他在論文中提到:"我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網絡爲基礎的應用軟件的架構設計,得到一個功能強、性能好、適宜通信的架構。REST指的是一組架構約束條件和原則。" 

首先要明確一點:REST 實際上只是一種設計風格,它並不是標準。(所以你可以看到網上一大堆的各種最佳實踐,設計指南,但是沒有人說設計標準)。既然不是標準,我可以遵守,也可以不遵守。

REST本身並沒有創造新的技術、組件或服務,而隱藏在RESTful背後的理念就是使用Web的現有特徵和能力, 更好地使用現有Web標準中的一些準則和約束。雖然REST本身受Web技術的影響很深, 但是理論上REST架構風格並不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關的實例。 所以我們這裏描述的REST也是通過HTTP實現的REST。

用一句話來概括REST:

    REST就是就是用URL定位資源,用HTTP描述操作。

這句還看不懂的話,沒關係,一句不懂的話我換三句來講,如下:

    看URL就知道要什麼;
    看HTTP method就知道幹什麼;
    看HTTP status code就知道結果如何。

這些總該懂了吧。你要是還不懂,那就沒辦法了,我們就只能往下看了,然後再回來看上面幾句話,保你秒懂。 

 

RESTful 與 RESTful API

REST 是一組架構約束條件和原則,而滿足這些約束條件和原則的應用程序或設計就是 RESTful。基於RESTful設計的API,我們就叫做RESTful API。

REST 是面向資源的,這個概念非常重要,而資源是通過 URI 進行暴露。在RESTful架構中,每個URI代表一種資源,所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表名對應,一般來說,數據庫中的表都是同種記錄的”集合”,所以API中的名詞也應該使用複數。

換句話說,URI 的設計只要負責把資源通過合理方式暴露出來就可以了。對資源的操作與它無關,操作是通過 HTTP動詞來體現,所以REST 通過 URI 暴露資源時,會強調不要在 URI 中出現動詞。

比如:左邊是錯誤的設計,而右邊是正確的

GET /rest/api/getDogs --> GET /rest/api/dogs 獲取所有小狗狗 
GET /rest/api/addDogs --> POST /rest/api/dogs 添加一個小狗狗 
GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一個小狗狗 
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 刪除一個小狗狗 

REST API 是基於 HTTP的,所以你的API應該去使用 HTTP的一些標準。這樣所有的HTTP客戶端(如瀏覽器)才能夠直接理解你的API(當然還有其他好處,如利於緩存等等)。REST 實際上也非常強調應該利用好 HTTP本來就有的特徵,而不是隻把 HTTP當成一個傳輸層這麼簡單了。

HTTP動詞:

GET     獲取一個資源 
POST    添加一個資源 
PUT     修改一個資源 
DELETE  刪除一個資源 

實際上,這四個動詞實際上就對應着增刪改查四個操作,這就利用了HTTP動詞來表示對資源的操作。

HTTP狀態碼:

200 OK 
400 Bad Request 
500 Internal Server Error

在 APP 與 API 的交互當中,其結果無非就三種狀態:

  • 所有事情都按預期正確執行完畢 - 成功
  • APP 發生了一些錯誤 – 客戶端錯誤
  • API 發生了一些錯誤 – 服務器端錯誤

這三種狀態與上面的狀態碼是一一對應的。

HTTP報頭:

Authorization 認證報頭 
Cache-Control 緩存報頭 
Cnotent-Type  消息體類型報頭 
......

報頭還有很多,不一一列舉。HTTP報頭是描述HTTP請求或響應的元數據,它的作用是客戶端 與 服務器端進行相互通信時,告訴對方應該如何處理本次請求。

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