初識RSET

先來點官方介紹,REST全稱是Representational State Transfer,中文意思是表述性狀態轉移,指的是一組架構約束條件和原則,REST架構風格並非綁定在HTTP上,只不過目前HTTP是惟一與REST相關的實例,而符合REST風格的架構,就能夠被成爲RESTful.html

恩,很正式,但是對於理解其真正的含義幫助不大,下面咱們來看看如何經過HTTP實現REST.api

有個好東西,流行了十幾年,忽然有一天,這東西的創造者跑出來講,大家怎麼瞎玩,這東西哪裏是這麼用的,因而:世界崩塌了~~~服務器

HTTP是互聯網使用最多的協議,但是他的創始人說,絕大多數使用者都誤解了HTTP的設計初衷,都在錯誤的使用HTTP.爲何這麼說呢,看下面的API格式對比restful

接口描述 傳統API---[錯誤用法] RESTful API---[正確用法]
新增用戶

http://127.0.0.1/user/save POST架構

http://127.0.0.1/user  POST 異步

刪除用戶

http://127.0.0.1/user/delete GET/POST spa

http://127.0.0.1/user  DELETE .net

修改用戶信息

http://127.0.0.1/user/update POST設計

http://127.0.0.1/user  PUT 3d

根據ID獲取用戶信息

http://127.0.0.1/user/query/1 GET  

http://127.0.0.1/user/1 GET  

經過上面的對比,咱們很容易發現如下問題:

1.URL的不一樣

URL的定義是統一資源定位符,從名字就能看出,URL的關注點是資源,因此它不該該包含動詞,在對比表中咱們能夠看見,傳統API的URL中包含了操做用戶的行爲(上例中的描述已經算是規整了,由於接口相對簡單,現實中每每存在着雜亂不堪的URL),而RESTful API則沒有,只是使用user來表述這是用戶信息資源

2.HTTP動詞使用

傳統API中,咱們只用到了GET和POST,但是HTTP動詞可不止兩個,大家覺得另外幾個是幹嗎用的?因此,正確使用HTTP動詞來描述API針對於資源所要進行的行爲,比較常見的是POST,DELETE,PUT,GET

 

上述表格右側已經給出了基本的RESTful API示例,下面咱們來更加全面的瞭解REST設計細節:

 

關於API版本號:

能夠放在URL中或者HTTP頭信息中,我的傾向前者,更直觀易懂

https://api.example.com/v1/

 

資源定位符:

URL中不能出現動詞,只能出現名詞,名詞建議採用複數形式

https://api.example.com/v1/users

 

HTTP動詞:

使用HTTP動詞來表示資源操做意圖

  • POST(CREATE):在服務器新建一個資源。
  • DELETE(DELETE):從服務器刪除資源。 
  • PUT(UPDATE):在服務器更新資源(客戶端提供改變後的完整資源)。
  • GET(SELECT):從服務器取出資源(一項或多項)。
  • -----------------------使用頻度---------------------------
  • PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
  • HEAD:獲取資源的元數據。
  • OPTIONS:獲取信息,關於資源的哪些屬性是客戶端能夠改變的。

 

HTTP常見狀態碼:

使用HTTP狀態碼來反饋接口錯誤信息,不使用自定義返回信息(暫時沒能說服我,HTTP狀態碼沒法表達業務錯誤信息)

  • 200 OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。
  • 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] 當建立一個對象時,發生一個驗證錯誤。
  • 500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。

 

REST分級:

Level0:能夠簡單的理解成傳統HTTP API

Level1:和Level0的區別是它的關注點換成了資源

Level2:本真RESTful,絕大多數的RESTful就是作到這一層,URL來表示資源,動詞來表示行爲

Level3:完美RESTful,又叫HATEOAS,核心思想就是資源有本身的狀態,在不一樣的狀態下能執行的操做是不同的,即會在響應中加入相關的連接來引導客戶端用戶,而不須要查看文檔

 

總結:REST是一種規則約束,是一種風格,是一種思想,但不是一種規範,固然也就不存在徹底的RESTful,理解REST,能幫助咱們更合理,更正確的使用HTTP規範,而非像以往那樣只是用於傳輸.

 

參考資料地址:

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

https://blog.csdn.net/qq_21383435/article/details/80032375

https://zhuanlan.zhihu.com/p/30396391?group_id=937244108725641216

https://blog.csdn.net/chenxiaochan/article/details/73716617

相關文章
相關標籤/搜索