天天看點

RESTful架構的了解

概念

本質:一種軟體架構風格,通過 REST 可以實作系統的高性能、可伸縮、通用性、簡單性、可修改性和可擴充等特性。

核心:面向資源設計的API

解決問題:

  • 降低開發的複雜性
  • 提高系統的可伸縮性

例如:設計一套API,為多個終端服務。

設計概念和準則

  • 網絡上的所有事物都可以被抽象為資源
  • 每一個資源都有唯一的資源辨別,對資源的操作不會改變這些辨別
  • 所有的操作都是無狀态的(本次操作、下次操作、上次操作之間無關系)

資源:網絡上的一個實體、具體資訊。

設計RESTful API

資源路徑(URI):RESTful的核心是面向資源,如何規劃資源路徑很重要

HTTP動詞(請求方式):如get,post,delete,put

過濾資訊:例如擷取資源清單時有分頁操作/查詢操作,這時要合理配置設定過濾資訊,過濾資訊設定太多,有可能會違反RESTful API 關于URI方面的限定。

狀态碼:當用戶端發送一個請求時,服務端應當響應什麼狀态碼

錯誤處理:如當發現用戶端傳入的參數有問題時,該傳回什麼樣的狀态資訊。

傳回結果:如POST資源的時候,需要傳回一個資源執行個體;GET資源清單時,需要傳回一個資源數組;

資源路徑

在RESTful架構中,每個網址代表一個資源,是以網址中不能有動詞,隻能有名詞。一般而言,API中的名詞應該使用複數。例如,使用users反映使用者資源的URI,而不是使用user。

URL結尾不應該包含斜杠“/”,這是作為URL路徑中進行中最重要的規則之一,正斜杠(/)不會增加語義值,且可能導緻混淆。REST API不允許一個尾部的斜杠,不應該将它們包含在提供給用戶端的連結的結尾處。rul的路徑中的正斜杠“/“字元用于訓示資源之間的層次關系。

例如:有一個API提供動物園(zoo)的資訊,還包括各種動物和雇員的資訊,那麼它的資源路徑應設計成如下樣子。

https://api.example.com/v1/zoos  //動物園資源。使用https協定頭;加入v1版本号,因為以後可能會更改api。版本号的加入有兩種做法,一種是加入到位址中,另一種是加入到HTTP請求頭中;zoos複數

https://api.example.com/v1/animals //動物資源

https://api.example.com/v1/employees //雇員資源

HTTP動詞

對資源的操作有建立、讀取、更新、删除(CURD),由HTTP動詞表示。

GET : 從伺服器去擷取資源

POST :在伺服器建立一個資源

PUT:在伺服器更新資源(用戶端提供改變後的完整資源,服務端傳回完整的更新字段)

PATCH:在伺服器更新資源(用戶端提供改變的屬性,服務端傳回隻發生了更新的字段)

DELETE:從伺服器删除資源

例如:

POST/zoos : 建立一個動物園

GET/zoos/ID : 擷取某個指定動物園的資訊

PUT/zoos/ID : 更新某個指定動物園的資訊

DELETE/zoos/ID : 删除某個動物園

過濾資訊

如果記錄數量過多,伺服器不可能都将它們傳回給使用者。這時就需要進行篩選。篩選時,API應該提供一個參數,過濾一下傳回的結果。

例如:

?offset = 10 :指定傳回記錄的開始位置

?page = 2&per_page = 100 :指定第幾頁,以及每頁的記錄數

?sortby = name&order = asc :指定傳回結果排序,以及排序順序

?animal_type_id = 1 :指定篩選條件

狀态碼

伺服器向使用者傳回的狀态碼和提示資訊,使用标準的HTTP狀态碼

200 OK 伺服器成功傳回使用者請求的資料

201 CREATED 建立或修改資料成功

204 NO CONTENT 删除資料成功

400 BAD REQUEST 使用者發出的請求有錯誤

401 Unauthorized 表示使用者沒有認證,無法進行目前操作

403 Forbidden 表示使用者的通路是被禁止的

422 Unprocesable Entity 當建立一個對象時,發生一個驗證錯誤。例如建立使用者資源時需要使用者名、密碼,而前端隻提供使用者名字段,那麼就要傳回一個422 狀态碼,并傳回錯誤資訊:”密碼不能為空“

500 INTERNAL SERVER ERROR 伺服器内部錯誤,此時服務端無法處理任何請求。

錯誤處理

如果狀态碼是4xx或5xx,就應該向使用者傳回出錯資訊。一般而言,傳回的資訊中将error作為鍵名,出錯資訊作為鍵值即可,例如:

{

  "error":"參數錯誤"

}

傳回結果

針對不同操作(如GET,POST),伺服器向使用者傳回的結果應該符合以下規範:

GET/collections: 傳回資源對象的清單(數組)

GET/collections/identity : 讀取資源時,傳入辨別符(identity),服務端傳回辨別符指定的單個資源對象

POST/collections : 傳回新生成的資源對象

PUT/collections/identity : 傳回完整的資源對象

PATCH/collections/identity : 傳回被修改的屬性

DELETE/collections/identity : 傳回一個204狀态碼和空響應體

綜述

綜合上面的解釋,我們總結一下什麼是RESTful架構:

  (1)每一個URI代表一種資源;

  (2)用戶端和伺服器之間,傳遞這種資源的某種表現層;

  (3)用戶端通過四個HTTP動詞,對伺服器端資源進行操作,實作"表現層狀态轉化"。

繼續閱讀