暑假期間接觸到實際開發專案對開發過程中遇到的restful
介面規範存在疑惑,由於當時主要目的是盡快本地執行專案,嘗試開發,沒有對這個介面規範深入了解。趁著最近時間比較輕鬆,逐步學習restful規範
。
越來越多的人開始意識到,**即軟體,而且是一種新型的軟體。
這種"網際網路軟體"採用客戶端/伺服器模式,建立在分布式體系上,通過網際網路通訊,具有高延時(high latency)、高併發等特點。
**開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網路是兩個不同的領域,很少有交集;軟體開發主要針對單機環境,網路則主要研究系統之間的通訊。網際網路的興起,使得這兩個領域開始融合,現在我們必須考慮,如何開發在網際網路環境中使用的軟體。
restful架構,就是目前最流行的一種網際網路軟體架構。它結構清晰、符合標準、易於理解、擴充套件方便,所以正得到越來越多**的採用。
rest(representational state transfer)
rest的名稱"表現層狀態轉化"中,省略了主語。「表現層"其實指的是"資源」(resources)的"表現層"。
資源(resources)
表現層(representation)
"資源"是一種資訊實體,它可以有多種外在表現形式。我們把"資源"具體呈現出來的形式,叫做它的"表現層"(representation)。
比如,文字可以用txt格式
表現,也可以用html格式
、xml格式
、json格式
表現,甚至可以採用二進位制格式;可以用jpg格式
表現,也可以用png格式
表現。
url
只代表資源的實體,不代表它的形式。嚴格地說,有些**最後的".html"
字尾名是不必要的,因為這個字尾名表示格式,屬於"表現層"範疇,而uri應該只代表"資源"的位置。它的具體表現形式,應該在http請求的頭資訊中用accept
和content-type
字段指定,這兩個欄位才是對"表現層"的描述。
狀態轉化(state transfer)
訪問乙個**,就代表了客戶端和伺服器的乙個互動過程。在這個過程中,勢必涉及到資料和狀態的變化。
網際網路通訊協議http協議,是乙個無狀態協議。這意味著,所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生"狀態轉化"(state transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。
客戶端用到的手段,只能是http協議。具體來說,就是http協議裡面,四個表示操作方式的動詞:get
、post
、put
、delete
。四個表示操作方式對應對應四種基本操作
綜合上面,restful架構
的內容:
每乙個uri代表一種資源;
客戶端和伺服器之間,傳遞這種資源的某種表現層;
客戶端通過四個http動詞,對伺服器端資源進行操作,實現"表現層狀態轉化"。
api與使用者的通訊協議
採用https
協議
網域名稱用api
關鍵字標識介面url
示例:
# 應該盡量將api部署在專用網域名稱之下。
# 表示前後端資料互動
# 應該盡量將api部署在專用網域名稱之下。
路徑
路徑又稱"終點"(endpoint),表示api的具體**。
在restful架構中,每個**代表一種資源(resource),所以**中不能有動詞,只能有名詞,而且所用的名詞往往與資料庫的**名對應。
http動詞
對於資源的具體操作型別,由http動詞表示。
get(select):從伺服器取出資源(一項或多項)。
post(create):在伺服器新建乙個資源。
put(update):在伺服器更新資源(客戶端提供改變後的完整資源)。
patch(update):在伺服器更新資源(客戶端提供改變的屬性)。
delete(delete):從伺服器刪除資源。
不常用
head:獲取資源的元資料。
options:獲取資訊,關於資源的哪些屬性是客戶端可以改變的。
狀態碼
200 ok -
[get]:伺服器成功返回使用者請求的資料,該操作是冪等的(idempotent)。
201 created -
[post/put/patch]:使用者新建或修改資料成功。
202 accepted -[*
]:表示乙個請求已經進入後台排隊(非同步任務)
204 no content -
[delete]:使用者刪除資料成功。
301:永久重定向
302:暫時重定向
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] 當建立乙個物件時,發生乙個驗證錯誤。
500 internal server error -[*
]:伺服器發生錯誤,使用者將無法判斷發出的請求是否成功。
錯誤處理
狀態碼是4xx時,應返回錯誤資訊,error當做key。
返回結果格式
盡量採用json格式避免xml格式
get /collection:返回資源物件的列表(陣列)
get /collection/resource:返回單個資源物件
post /collection:返回新生成的資源物件
put /collection/resource:返回完整的資源物件
patch /collection/resource:返回完整的資源物件
delete /collection/resource:返回乙個空文件
RESTful api介面規範
整體規範建議採用restful 方式來實施。協議api與使用者的通訊協議,總是使用https協議,確保互動資料的傳輸安全。網域名稱應該盡量將api部署在專用網域名稱之下。如果確定api很簡單,不會有進一步擴充套件,可以考慮放在主網域名稱下。api版本控制 應該將api的版本號放入url。v 另一種做...
Restful Api介面規範
用名詞代替動詞表示資源 get employees get employees?state external post employees put employees 56 對可選的 複雜的引數,使用查詢字串 get employees?state internal maturity senior ...
RESTful api介面規範
restful api 的設計規範 restful 介面規範 整體規範建議採用restful 方式來實施。協議api與使用者的通訊協議,總是使用https協議,確保互動資料的傳輸安全。網域名稱應該盡量將api部署在專用網域名稱之下。如果確定api很簡單,不會有進一步擴充套件,可以考慮放在主網域名稱下...