Restful API 接口設(shè)計(jì)標(biāo)準(zhǔn)及規(guī)范

RESTful概念

理解和評估以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件的架構(gòu)設(shè)計(jì),得到一個功能強(qiáng)、性能好、適宜通信的架構(gòu)。REST指的是一組架構(gòu)約束條件和原則。" 如果一個架構(gòu)符合REST的約束條件和原則,我們就稱它為RESTful架構(gòu)。

REST本身并沒有創(chuàng)造新的技術(shù)、組件或服務(wù),而隱藏在RESTful背后的理念就是使用Web的現(xiàn)有特征和能力, 更好地使用現(xiàn)有Web標(biāo)準(zhǔn)中的一些準(zhǔn)則和約束。雖然REST本身受Web技術(shù)的影響很深, 但是理論上REST架構(gòu)風(fēng)格并不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關(guān)的實(shí)例。 所以我們這里描述的REST也是通過HTTP實(shí)現(xiàn)的REST。

RestfulAPI 導(dǎo)圖

Restful導(dǎo)圖

理解RESTful

要理解RESTful架構(gòu),需要理解Representational State Transfer這個詞組到底是什么意思,它的每一個詞都有些什么涵義。我們圍繞資源展開討論,從資源的定義、獲取、表述、關(guān)聯(lián)、狀態(tài)變遷等角度,列舉一些關(guān)鍵概念并加以解釋。

  • 資源與URI
  • 統(tǒng)一資源接口
  • 資源的表述
  • 資源的鏈接
  • 狀態(tài)的轉(zhuǎn)移

資源與URI

URI 表示資源,資源一般對應(yīng)服務(wù)器端領(lǐng)域模型中的實(shí)體類

  • URI 是地址也是資源
  • URI里邊帶上版本號、后綴來區(qū)分表述格式
  • 必備約定
    • 用名詞、不用動詞
    • 層級結(jié)構(gòu)明確、用/來表示
    • 用?用來過濾資源

統(tǒng)一資源接口

標(biāo)準(zhǔn)HTTP方法包含:GET、POST、PUT、DELETE、Patch,他們的使用功能如下列表所示

方法作用列表

Get方法執(zhí)行流程原理如下所示

Get方法執(zhí)行流程圖

Put 方法執(zhí)行流程圖如下所示

Put方法執(zhí)行流程圖

安全性和冪等性

  • 1、安全性:不會改變資源狀態(tài),可以理解為只讀的;
  • 2、冪等性:執(zhí)行1次和執(zhí)行N次,對資源狀態(tài)改變的效果是等價的。
接口 安全性 冪等性
GET
POST × ×
PUT ×
DELETE ×

安全性和冪等性均不保證反復(fù)請求能拿到相同的response。以 DELETE 為例,第一次DELETE返回200表示刪除成功,第二次返回404提示資源不存在,這是允許的。

資源的表述

什么是資源?什么是表述?

就本質(zhì)而言,任何足夠重要并被引用的事物都可以是資源。如果你的用戶“想要建立指向它的超文本鏈接,指出或者反對關(guān)于它的斷言,獲取或者緩存它的表述,共另外的表述引用它的全部或者部分,給它增加注釋信息,或者對它執(zhí)行某些操作”,(源自《萬維網(wǎng)的架構(gòu)》),你都應(yīng)該將它定義為資源。

每個資源必須擁有URL,在web上,我們使用URL來為每個資源提供一個全球唯一的地址,將一個事物賦以URL,它就會成為一個資源。

石榴可以是一個資源,但是你不可能通過互聯(lián)網(wǎng)傳輸它,數(shù)據(jù)庫中的一條記錄可以是一個資源,并且可以通過互聯(lián)網(wǎng)傳輸。

當(dāng)客戶端對一個資源發(fā)起一個Get請求的時候,服務(wù)器會以一種有效的方式提供一個采集了資源信息的文檔作為回應(yīng)。這種資源信息的文檔就是一種表述,一種以機(jī)器可讀的方式對資源當(dāng)前的狀態(tài)進(jìn)行說明

資源有多重表述

一個資源可以有多種表述。比如,有的資源可以有整體概括性的表述,也可以有面面俱到的詳細(xì)表述,又或者可能以JSON格式或者XML格式來表述同一個資源。

資源的連接

我們知道REST是使用標(biāo)準(zhǔn)的HTTP方法來操作資源的,但僅僅因此就理解成帶CURD的Web數(shù)據(jù)庫架構(gòu)就太過于簡單了。

這種反模式忽略了一個核心概念:"超媒體即應(yīng)用狀態(tài)引擎(hypermedia as the engine of application state)"。 超媒體是什么?

當(dāng)你瀏覽Web網(wǎng)頁時,從一個連接跳到一個頁面,再從另一個連接跳到另外一個頁面,就是利用了超媒體的概念:把一個個把資源鏈接起來.

要達(dá)到這個目的,就要求在表述格式里邊加入鏈接來引導(dǎo)客戶端。在《RESTful Web Services》一書中,作者把這種具有鏈接的特性成為連通性。下面我們具體來看一些例子。

下面展示的是github獲取某個組織下的項(xiàng)目列表的請求,可以看到在響應(yīng)頭里邊增加Link頭告訴客戶端怎么訪問下一頁和最后一頁的記錄。 而在響應(yīng)體里邊,用url來鏈接項(xiàng)目所有者和項(xiàng)目地址。

上面的例子展示了如何使用超媒體來增強(qiáng)資源的連通性。很多人在設(shè)計(jì)RESTful架構(gòu)時,使用很多時間來尋找漂亮的URI,而忽略了超媒體。所以,應(yīng)該多花一些時間來給資源的表述提供鏈接,而不是專注于"資源的CRUD"。

狀態(tài)的轉(zhuǎn)移

訪問一個網(wǎng)站,就代表了客戶端和服務(wù)器的一個互動過程。在這個過程中,勢必涉及到數(shù)據(jù)和狀態(tài)的變化;

互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個無狀態(tài)協(xié)議。這意味著,所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶端想要操作服務(wù)器,必須通過某種手段,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的,所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化";

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容