1. 程式人生 > 實用技巧 >理解 RESTful API 設計規範

理解 RESTful API 設計規範

一、什麼是REST?

REST這個詞,是Roy Thomas Fielding在他2000年的博士論文中提出的。Fielding是一個非常重要的人,他是HTTP協議(1.0版和1.1版)的主要設計者、Apache伺服器軟體的作者之一、Apache基金會的第一任主席。

Fielding將他對網際網路軟體的架構原則,定名為REST,即Representational State Transfer的縮寫。翻譯是"表現層狀態轉化"。

它是基於HTTP、URI、XML、JSON等標準和協議,支援輕量級、跨平臺、跨語言的架構設計。

二、REST設計原則:

需要符合如下的一些原則:

1. 每一個URI代表一種資源;
2. 同一種資源有多種表現形式(xml/json);
3. 所有的操作都是無狀態的。
4. 規範統一介面。
5. 返回一致的資料格式。
6. 可快取(客戶端可以快取響應的內容)。

三、什麼是RESTful?

如果一個架構符合REST原則,就稱它為RESTful架構。RESTful是目前最流行的API設計規範,通過一套統一的介面為所有web相關提供服務,實現前後端分離。

四、理解規範統一的介面

Rest介面約束定義為: 資源識別;請求動作;響應資訊; 它表示通過uri表示出要操作的資源,通過請求動作(http method)標識要執行的操作,通過返回的狀態碼來表示這次請求的執行結果。

比如說,未使用Rest規範之前,我們可能有增刪改查 等介面,會設計出類似這樣的介面:/xxx/newAdd (新增介面), /xxx/delete(刪除介面), /xxx/query (查詢介面), /xxx/uddate(修改介面)等這樣的。增刪改查有四個不同的介面,維護起來可能也不好。

Restful規範,請求只需要一個介面,比如設計該介面為 /xxx/apis 這樣的一個介面就可以了,然後請求方式(method)有 GET--查詢(從伺服器獲取資源); POST---新增(從伺服器中新建一個資源); PUT---更新(在伺服器中更新資源),DELETE---刪除(從伺服器刪除資源),PATCH---部分更新(從伺服器端更新部分資源) 等這些方式來做,伺服器端返回的資料也可以是相同的,只是我們前端會根據狀態碼來判斷請求成功或失敗的狀態值來判斷。

五、 URL及引數設計規範

1. url設計規範

1) url末尾不需要出現斜槓/
2) 在url中使用斜槓/是表達層級關係的。
3) 在uri中可以使用連線符-, 來提升可讀性。
比如 http://xxx.com/xx-yy 比 http://xxx.com/xx_yy中的可讀性更好。
4) 在url中不允許出現下劃線字元_.
5) 在url中儘量使用小寫字元。
6) 在url中不允許出現副檔名. 比如介面為 /xxx/api, 不要寫成 /xxx/api.php 這樣的是不合法的。
7) 在url中使用複數形式。
具體可以看:(

https://blog.restcase.com/7-rules-for-rest-api-uri-design/

在RESTful架構中,每個url代表一種資源,因此url設計中不能使用動詞,只能使用名詞,並且名詞中也應該儘量使用複數形式。使用者應該使用相應的http動詞 GET、POST、PUT、PATCH、DELETE等操作這些資源即可。

那麼在我們未使用RESTful規範之前,我們是如下方式來定義介面的,形式是不固定的,並且沒有統一的規範。比如如下形式:

http://xxx.com/api/getallUsers; // GET請求方式,獲取所有的使用者資訊
http://xxx.com/api/getuser/1;   // GET請求方式,獲取標識為1的使用者資訊
http://xxx.com/api/user/delete/1 // GET、POST 刪除標識為1的使用者資訊
http://xxx.com/api/updateUser/1  // POST請求方式 更新標識為1的使用者資訊
http://xxx.com/api/User/add      // POST請求方式,新增新的使用者

如上我們可以看到,在未使用Restful規範之前,介面形式是不固定的,沒有統一的規範,下面我們來看下使用RESTful規範的介面如下,兩者之間對比下就可以看到各自的優點了。

http://xxx.com/api/users;     // GET請求方式 獲取所有使用者資訊
http://xxx.com/api/users/1;   // GET請求方式 獲取標識為1的使用者資訊
http://xxx.com/api/users/1;   // DELETE請求方式 刪除標識為1的使用者資訊
http://xxx.com/api/users/1;   // PATCH請求方式,更新標識為1的使用者部分資訊
http://xxx.com/api/users;     // POST請求方式 新增新的使用者

如上我們可以看到,增刪改成我們都是使用同一個api介面,只是請求的方式 GET(查詢)、POST(新增)、DELETE(刪除)、PACTH(部分更新)來代表的是增刪改查操作的方式。然後開發獲取到該請求的header頭部資訊,就可以知道是什麼方式來請求資料的了。

2. HTTP請求規範

GET (SELECT): 查詢;從伺服器取出資源.
POST(CREATE): 新增; 在伺服器上新建一個資源。
PUT(UPDATE): 更新; 在伺服器上更新資源(客戶端提供改變後的完整資源)。
PATCH(UPDATE): 更新;在伺服器上更新部分資源(客戶端提供改變的屬性)。
DELETE(DELETE): 刪除; 從伺服器上刪除資源。

3. 引數命名規範

引數推薦採用下劃線命名的方式。比如如下demo:

http://xxx.com/api/today_login // 獲取今天登入的使用者。
http://xxx.com/api/today_login&sort=login_desc // 獲取今天登入的使用者、登入時間降序排序。

六、 http狀態碼相關的

狀態碼範圍

客戶端的每一次請求, 伺服器端必須給出迴應,迴應一般包括HTTP狀態碼和資料兩部分。

1xx: 資訊,請求收到了,繼續處理。
2xx: 代表成功. 行為被成功地接收、理解及採納。
3xx: 重定向。
4xx: 客戶端錯誤,請求包含語法錯誤或請求無法實現。
5xx: 伺服器端錯誤.

七、返回資料格式

RESTful規範中的請求應該返回統一的資料格式。對於返回的資料,一般會包含如下欄位:

1) code: http響應的狀態碼。
2) status: 包含文字, 比如:'success'(成功), 'fail'(失敗), 'error'(異常)

當status的值為 'fail' 或 'error'時,需要新增 message 欄位,用於顯示錯誤資訊。

3) data: 當請求成功的時候, 返回的資料資訊。 但是當狀態值為 'fail' 或 'error' 時,data僅僅包含錯誤原因或異常資訊等。

返回成功的響應JSON格式一般為如下:

{
    "code": 200,
    "status": "success",
    "data": [{
        "userName": "tugenhua",
        "age": 31
    }]
}

返回失敗的響應json格式為如下:

{
    "code": 401,
    "status": "error",
    "message": '使用者沒有許可權',
    "data": null
}

參考連結:

https://www.cnblogs.com/tugenhua0707/p/12153857.html

http://www.ruanyifeng.com/blog/2011/09/restful.html