你真的了解restful api嗎?

2021-09-13 02:30:23 字數 3192 閱讀 9763

在以前,乙個**的完成總是「all in one」,頁面,資料,渲染全部在服務端完成,這樣做的最大的弊端是後期維護,擴充套件極其痛苦,開發人員必須同時具備前後端知識。於是慢慢的後來興起了前後端分離的思想:

後端負責資料編造,而前端則負責資料渲染,前端靜態頁面呼叫指定api獲取到有固定格式的資料,再將資料展示出來,這樣呈現給使用者的就是乙個」動態「的過程,而關於api這部分的設計則成了乙個問題。如何設計出乙個便於理解,容易使用的api則成了乙個問題。

而所謂的restful就是用來規範我們的api的一種約束。

restrepresentational state transfer三個單詞的縮寫,由roy fielding於2023年**中提出,它代表著分布式服務的架構風格。而如果想你的api被稱為restful api,只要遵循其規定的約束即可。

客戶端-伺服器:通過將使用者ui與資料儲存分開,我們可以簡化伺服器元件來提高跨多個平台的使用者介面的可移植性並提高可伸縮性。 它可以比表現成前後端分離的思想。

無狀態:從客戶端到伺服器的每個請求都必須包含理解請求所需的所有資訊,並且不能利用伺服器上任何儲存的上下文。 這表示你應該盡可能的避免使用session,由客戶端自己標識會話狀態。(token)

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

可快取: 快取約束要求將對請求的響應中的資料隱式或顯式標記為可快取或不可快取。如果響應是可快取的,則客戶端快取有權重用該響應資料以用於以後的等效請求。 它表示get請求響應頭中應該表示有是否可快取的頭(cache-control)

其中1,2,3約束最為重要,其中1容易理解。接下來我們就談談無狀態和規範介面的原則。

資源的描述構成了uri,它一般有以下約束:

使用名詞。如 user, student, class

http method對應不同的請求動作(資料庫或者業務邏輯)

get:查詢操作:

post:新增操作:

put更新操作(代表更新乙個實體的所有屬性)

patch部分更新(代表更新乙個屍體的部分屬性)由於有的瀏覽器相容性問題,一般推薦使用put

delete刪除操作

使用連字元( - )而不是(_)來提高uri的可讀性

//更易讀

//更容易出錯

在uri中使用小寫字母

不要使用副檔名 副檔名看起來很糟糕,不會增加任何優勢。刪除它們也會減少uri的長度。沒理由保留它們。

/ 不要使用它 /

/ *這是正確的uri * /

使用查詢元件過濾uri集合

很多時候,我們會遇到需要根據某些特定資源屬性對需要排序,過濾或限制的資源集合的要求。為此,請不要建立新的api - 而是在資源集合api中啟用排序,過濾和分頁功能,並將輸入引數作為查詢引數傳遞。例如

?region=usa

?region=usa&brand=xyz

?region=usa&brand=xyz&sort=installation-date

不要在末尾使用/

作為uri路徑中的最後乙個字元,正斜槓(/)不會新增語義值,並可能導致混淆。最好完全放棄它們。

使用http狀態碼定義api執行結果

1xx:資訊

通訊傳輸協議級資訊。

2xx:成功

表示客戶端的請求已成功接受。

3xx:重定向

表示客戶端必須執行一些其他操作才能完成其請求。

4xx:客戶端錯誤

此類錯誤狀態**指向客戶端。

5xx:伺服器錯誤

伺服器負責這些錯誤狀態**。

另外完整的更為詳細的狀態碼此處不做贅述。一般簡化版本的api會使用200,400,500,其中400代表客戶端呼叫有誤,將錯誤資訊放入response:

api版本定義

當我們需要對現有的api介面公升級的時候,因為該api介面已經投入使用,所以新新增的業務可能無法保證相容原來的邏輯,這個時候就需要新的介面,而這個介面一般表示對原來的介面的公升級(不同版本),那版本怎麼定義呢?

使rest api無狀態有一些非常顯著的優點:

無狀態通過將api部署到多個伺服器,有助於將api擴充套件到數百萬併發使用者。任何伺服器都可以處理任何請求,因為沒有與會話相關的依賴。(集群)

無狀態使得rest api不那麼複雜 - 可以刪除所有伺服器端狀態同步邏輯。(刪除session,清理多餘空間)

無狀態api也很容易快取。特定軟體可以通過檢視該乙個請求來決定是否快取http請求的結果。從先前的請求中獲得的狀態可能會影響這個請求的可快取性,這並不存在任何不確定性。它提高了應用程式的效能。

伺服器永遠不會忘記每個客戶端身份」,因為客戶端會在每個請求中傳送所有必要的資訊。(攜帶token)

那麼無狀態又要怎麼實現呢?前面我們已經說了,服務端不應該再儲存session會話,這個工作全部交由http請求去標識,而最常見的做法則是使用token。生成token可以考慮使用jwt,oauth。其中jwt可以參考我的另一篇文章:

我們首先介紹rest服務背景,引出rest架構的介紹,最後重點介紹了rest api的約束設計。

關注我,這裡只有乾貨!

你真的了解Java嗎?

三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...

你真的了解sizeof 麼?

sizeof並不是c語言和c 語言中的乙個函式,而是乙個關鍵字,乙個操作符。它的作用是返回乙個物件或者型別名的長度,也就是說這個物件或者型別所佔的記憶體位元組數。它的返回值型別為size t usinged int 長度的單位是位元組。1 對基本資料型別運用sizeof操作,得到其占用記憶體的位元組...

你真的了解git嗎?

看了幾遍廖雪峰的git教程和阮一峰的git教程之後,覺得自己使用git已經是得心應手了,腦中也構建出了一副關於git操作的影象。學習乙個新東西的時候我總是喜歡把知識形象化出乙個圖譜在腦中,這樣記憶的更加深刻。但是隨著使用的深入,我發現我腦中的影象與git的實際行為存在出入。稍微進入一下正題。假如你的...