摘要:表形容詞,意為的具有的。指的是一組架構約束條件和原則。協議要優于協議。的操作方法在中有各自的語義,理解它們的語義至為重要。返回結果對于不同操作方法和操作對象集合或個體,服務器返回的結果應該符合以下規范。附錄該文主要參考理解架構設計指南
前言
近十年,前端高速發展,整個互聯網應用經歷了從輕客戶端到重客戶端的變化,隨著前端規模越來越大,交互越來越復雜,前后端分離的設計開始流行。
移動互聯網時代的到來,前端開始泛指各種終端和 web 前端,服務端為多終端提供服務已然成常態。
前后端分離后,前端和后端通過雙方協商好的 API 進行交互,所以設計一套友好的 API 尤其重要。
RESTful 就是目前最流行的前后端交互 API 設計范式。
RESTful 釋義顧名思義,先看一下 RESTful 的單詞拆解:
RESTful = Resources + Representation + State + Transfer + ful
我的理解是, RESTful 是指具有 資源表現層 和 狀態轉換 的架構設計。
資源(Resources)資源,是指服務端向外提供的服務實體。
資源是一個抽象的概念,可以是應用程序對象、數據庫記錄、算法等等。每一個資源用一個 URI 來唯一標識,客戶端通過這個標識對資源進行訪問、操作或請求服務。
表現層(Representation)表現層,是指資源的表現形式。
一個資源可以有多種表現形式。例如,文本數據可以用 XML 格式、JSON 格式表現,甚至可以用二進制格式表示;圖片可以用 JPG 格式表現,也可以用 PNG 格式表現。
狀態(State)狀態,是指資源的某種狀態。
一個資源可能有多種狀態。例如,資源空閑的、占用的、共享的、存在的、不存在的等。
轉化(Transfer)轉化,是指對資源的操作行為。
轉化的行為包括兩種:
資源表現層的轉化
資源狀態的轉化
ful后綴是英文的一種重要構詞法,通過后綴常常可以判斷出一個詞的詞性。
ful 表形容詞,意為“... 的”、“具有 ... 的”。
小結RESTful 是一種抽象的、與具體程序語言和網絡協議無關的網絡服務系統的架構樣式。
它把在服務器端的數據和功能設計成各種的資源,并且通過 URI 定位資源、轉化資源表現和狀態的一種服務架構設計。
RESTful WEBREST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。
目前 RESTful 應用最多的是在 web 服務,在 RESTful Web 服務中,每個資源都有一個地址(URL)。資源是方法調用的目標,方法列表對所有資源都是一樣的。這些方法是 Http 標準方法,如 HTTP GET、POST、PUT、DELETE 等。
下面來描述一下 RESTful Web API 的一些設計原則。
通信協議數據傳輸,安全第一。
HTTPS 協議要優于 HTTP 協議。
API 的根 URLAPI 的根 URL 很重要,它應該設計成可以輕松區別于其他非 API 的 URL。
最好的做法是將 API 部署在專有的域名下。
https://api.example.com
退而求其次,分配一個域名一級目錄給 API。
https://example.org/api/版本信息
為了 API 演變和兼容,為 API 加入版本信息是明智之舉。
應該為 API 設定版本號,并把版本號信息加入到 API 的根 URL 的下一級路徑。
https://api.example.com/v1/
或
https://example.org/api/v1/URL 末端
API 的根 URL + 版本信息 + URL 末端 = 資源位置
URL 末端最終明確指定了一個資源或一種資源的集合。URL 末端中不應該出現動詞,只能是名詞。如果該資源可以取其集合,對應的名詞應該采用復數形式。
舉個例子,有一組 API 提供公司員工的信息。
那么,獲取所有員工信息,末端應該設計成 /employees, 即:
https://api.example.com/v1/employees
獲取員工編號 007 員工的信息,末端應該設計成 /employees/007, 即:
https://api.example.com/v1/employees/007操作資源
資源的操作無外乎增、刪、改、查,對應即是 HTTP 的各個操作方法。
HTTP的操作方法在 RESTful 中有各自的語義,理解它們的語義至為重要。
方法 | 語義 | 例子 | 說明 |
---|---|---|---|
GET | 選擇、獲取 | GET /employees/007 | 獲取編號 007 員工的信息 |
POST | 新建 | POST /employees | 新建一個員工的信息 |
PUT | 更新(完整) | PUT /employees/007 | 更新編號 007 員工的全部信息,客戶端提供該員工的全部信息 |
PATCH | 更新(局部) | PATCH /employees/007 | 更新編號 007 員工的部分信息,客戶端只提供該員工的部分信息 |
DELETE | 刪除 | DELETE /employees/007 | 刪除編號 007 員工的信息 |
HEAD | 獲取(元數據) | HEAD /employees/007 | 獲取編號 007 員工的元數據,如員工數據的哈希值或最后修改時間 |
OPTIONS | 獲取(權限信息) | OPTIONS /employees/007 | 獲取客戶端能編號 007 員工進行哪些操作,即操作的權限 |
本章中,自此以上講述的都是如何描述"資源(Resources)",而這小節講述的是"轉化(Transfer)",轉化資源的狀態。
另外,轉化還包括資源的"表現層(Representation)",它是通過 HTTP 頭部 Content Type 指定的。
過濾資源如果資源很多,通常你不會希望服務端一次性全部的數據,API 應該提供過濾資源的能力。
這里資源過濾依靠 URL 的查詢參數,通常放置在 GET 請求的URL中。
?limit=10: 限制返回的資源數量
?offset=10: 指定返回的資源的開始位置
?sortby=name&order=asc: 對資源按特定屬性進行排序
狀態碼狀態碼用以反映資源的操作結果或所處狀態。
HTTP 狀態碼本身是具有語義的,這剛好配對了 RESTful 的狀態。
以下列舉常用的狀態碼:
狀態碼 | 語義 | HTTP 方法 | 說明 |
---|---|---|---|
200 | OK | GET | 成功返回用戶請求的數據 |
201 | Created | POST/PUT/PATCH | 用戶新建或修改資源成功 |
202 | Accepted | * | 成功發起一個異步任務 |
204 | No Content | DELETE | 刪除資源成功 |
400 | INVALID REQUEST | POST/PUT/PATCH | 請求有錯誤,服務端沒有對資源進行任何操作 |
401 | Unauthorized | * | 表示用戶沒有權限(令牌、用戶名、密碼錯誤) |
403 | Forbidden | * | 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的 |
404 | NOT FOUND | * | 請求對應的資源不存在 |
406 | Not Acceptable | GET | 用戶請求的格式不可得(比如用戶請求JSON格式,但是只有XML格式), 即未支持的表現層 |
410 | Gone | GET | 用戶請求的資源被永久刪除,且不會再得到的 |
422 | Unprocesable entity | POST/PUT/PATCH | 當創建一個對象時,發生一個驗證錯誤 |
如果狀態碼是4xx,就應該向用戶返回出錯信息。一般來說,返回的信息中將error作為鍵名,出錯信息作為鍵值。
{ error: "param error" }返回結果
對于不同操作方法和操作對象(集合或個體),服務器返回的結果應該符合以下規范。
示例 | 返回 |
---|---|
GET /collection | 返回資源對象的列表(數組) |
GET /collection/resource | 返回單個資源對象 |
POST /collection | 返回新生成的資源對象 |
PUT /collection/resource | 返回完整的資源對象 |
PATCH /collection/resource | 返回完整的資源對象 |
DELETE /collection/resource | 返回一個空文檔 |
另外,返回的數據格式(Representation)應該盡量使用JSON。
最后在 RESTful WEB 的實現中,使用 URL 定位資源,HTTP 方法操作資源,使得語義明確、結構清晰、易于理解和擴展。
RESTful 的這些優勢,使得它成為了目前最流行的一種互聯網服務架構。
附錄該文主要參考:
Principles of good RESTful API Design
理解RESTful架構
RESTful API 設計指南
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11772.html
摘要:表形容詞,意為的具有的。指的是一組架構約束條件和原則。協議要優于協議。的操作方法在中有各自的語義,理解它們的語義至為重要。返回結果對于不同操作方法和操作對象集合或個體,服務器返回的結果應該符合以下規范。附錄該文主要參考理解架構設計指南 前言 近十年,前端高速發展,整個互聯網應用經歷了從輕客戶端到重客戶端的變化,隨著前端規模越來越大,交互越來越復雜,前后端分離的設計開始流行。 移動互聯網...
摘要:其他交互一般會遵循一些數據結構協議或者狀態值,比如不同的操作結果對應不同的狀態值,且出錯會返回指定的錯誤信息方便前端進行提示等。 RESTful這種架構已經具有很長的時間和歷程了,但似乎最近restful這個詞出現的頻率特別高,目前不是很清楚是因為我自個兒現在是以restful風格寫程序產生的孕婦效應,還是單頁面程序開發的流行造成的。 其實一開始我也是不想寫這篇文章的,因為網絡上與re...
摘要:它的理論比較抽象不太具體,理解它主要在于理解這些概念資源表現層狀態轉換。基于原則設計的,一般稱為,需要遵守以下這些原則。返回結果,結果應該包括多種情況,異常錯誤信息正確結果目前而言最好使用格式傳輸數據。參考的理解,阮一峰 RESTful API 目前的異步加載橫行的時候,異步請求已經遍地都是,而規定請求接口的時候,如果不能有很好的風格的話,很多時候會讓開發者誤解,一個好的API接口 設...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:一什么是架構即的縮寫,我們把他翻譯為表述性狀態傳遞,是博士在年他的博士論文中提出來的一種軟件架構風格。是個無狀態的協議,所以狀態就保存在服務器端。只要少量的數據就可使用,支持和。同時支持,同時提供一系列的查詢方法如。 一、什么是RESTful架構? REST即Representational State Transfer的縮寫,我們把他翻譯為表述性狀態傳遞,是Roy Fielding博...
閱讀 3333·2021-11-22 14:44
閱讀 2537·2019-08-30 14:10
閱讀 2588·2019-08-30 13:12
閱讀 1217·2019-08-29 18:36
閱讀 1341·2019-08-29 16:16
閱讀 3328·2019-08-26 10:33
閱讀 1761·2019-08-23 18:16
閱讀 379·2019-08-23 18:12