什麼是REST API?

什麼是REST API?

微服務之間通過一些輕量級的通信機制進行通信如REST API,那麼如何理解REST API呢?

首先要明確一點:REST 實際上只是一種設計風格,它並不是標準。(所以你可以看到網上一大堆的各種最佳實踐,設計指南,但是沒有人說設計標準)

通俗的講REST就是:

看Url就知道要什麼
看http method就知道幹什麼
看http status code就知道結果如何

更簡潔的來說,就是用URL定位資源,用HTTP描述操作

詳細的介紹我認爲這位大佬的解釋很透徹,不像其他網絡上的解釋的晦澀難懂https://www.zhihu.com/people/houhaichao830/activities

要解釋什麼是REST,你應該先了解什麼是API(Application Programming Interface,應用程序編程接口),形象一點說就是像一個公司比如騰訊,阿里巴巴之類,他們可以提供一個API,然後我們或者一些其他的小公司可以編一個軟件去跟這個接口(API)進行相連或交互。

舉個例子,比如你可以用手機的其他軟件分享內容到微信朋友圈或者新浪微博,這些軟件就是與微信和微博的api進行了交互。知道了API,那麼就容易理解REST了。REST是什麼呢? 它是一種架構風格,騰訊公司或其他公司建立API時要遵守的一種規則/風格,當然也有其他規則可以用。現在稍微具體一下什麼是REST架構風格。REST也就是Representational State Transfer(表現層狀態轉移)。

要具體什麼事REST,我們又必須提到Web,因爲REST是以Web爲平臺的。Web是什麼: 分佈式信息系統爲超文本文件和其他對象(資源)提供訪問入口資源是Web架構的關鍵點,需要 3個操作識別(identify) 表示(represent) 交互(interact with),通過這三個操作,又引出三個概念uri(統一資源標識符包括url和urn)識別資源;representation (例如html,xml,圖片,視頻等等)表示資源;通過協議(包括http,ftp等等)與資源進行交互。所以REST就是選擇通過使用http協議和uri,利用client/server model對資源進行CRUD (Create/Read/Update/Delete)增刪改查操作。那麼爲什麼要使用REST風格呢?肯定是因爲它的優點,所以才選擇使用它呀。因此現在先介紹它的優點,要介紹它的優點又要提到它的六個限制,我看其他答案只提到了限制,但是沒有寫限制的好處,在這裏我列出限制和它的好處:1.客戶-服務器(Client-Server)客戶端服務器分離優點,提高用戶界面的便攜性(操作簡單) 通過簡化服務器提高可伸縮性(高性能,低成本) 允許組件分別優化(可以讓服務端和客戶端分別進行改進和優化)2.無狀態(Stateless)從客戶端的每個請求要包含服務器所需要的所有信息優點:提高可見性(可以單獨考慮每個請求)提高了可靠性(更容易從局部故障中修復)提高可擴展性(降低了服務器資源使用)3.緩存(Cachable)服務器返回信息必須被標記是否可以緩存,如果緩存,客戶端可能會重用之前的信息發送請求。優點:減少交互次數減少交互的平均延遲4.分層系統(Layered System)系統組件不需要知道與他交流組件之外的事情。封裝服務,引入中間層。優點:限制了系統的複雜性提高可擴展性5.統一接口(Uniform Interface)鼓勵單獨改善組件優點:提高交互的可見性6.支持按需代碼(Code-On-Demand 可選)
具體例子參考這位大佬的:

https://www.zhihu.com/people/aisuhua/activities

說說幾個重要的概念:

1、REST 是面向資源的,這個概念非常重要,而資源是通過 URI 進行暴露。
URI 的設計只要負責把資源通過合理方式暴露出來就可以了。對資源的操作與它無關,操作是通過 HTTP動詞來體現,所以REST 通過 URI 暴露資源時,會強調不要在 URI 中出現動詞。

比如:左邊是錯誤的設計,而右邊是正確的

GET /rest/api/getDogs --> GET /rest/api/dogs 獲取所有小狗狗 
GET /rest/api/addDogs --> POST /rest/api/dogs 添加一個小狗狗 
GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一個小狗狗 
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 刪除一個小狗狗 

左邊的這種設計,很明顯不符合REST風格,上面已經說了,URI 只負責準確無誤的暴露資源,而 getDogs/addDogs...已經包含了對資源的操作,這是不對的。相反右邊卻滿足了,它的操作是使用標準的HTTP動詞來體現。

2、REST很好地利用了HTTP本身就有的一些特徵,如HTTP動詞、HTTP狀態碼、HTTP報頭等等
REST API 是基於 HTTP的,所以你的API應該去使用 HTTP的一些標準。這樣所有的HTTP客戶端(如瀏覽器)才能夠直接理解你的API(當然還有其他好處,如利於緩存等等)。REST 實際上也非常強調應該利用好 HTTP本來就有的特徵,而不是隻把 HTTP當成一個傳輸層這麼簡單了。

HTTP動詞

GET     獲取一個資源 
POST    添加一個資源 
PUT     修改一個資源 
DELETE  刪除一個資源 

實際上,這四個動詞實際上就對應着增刪改查四個操作,這就利用了HTTP動詞來表示對資源的操作。

HTTP狀態碼

200 OK 
400 Bad Request 
500 Internal Server Error

在 APP 與 API 的交互當中,其結果無非就三種狀態:

  • 所有事情都按預期正確執行完畢 - 成功
  • APP 發生了一些錯誤 – 客戶端錯誤
  • API 發生了一些錯誤 – 服務器端錯誤

這三種狀態與上面的狀態碼是一一對應的。

HTTP報頭

Authorization 認證報頭 
Cache-Control 緩存報頭 
Cnotent-Type  消息體類型報頭 
......

報頭還有很多,不一一列舉。HTTP報頭是描述HTTP請求或響應的元數據,它的作用是客戶端 與 服務器端進行相互通信時,告訴對方應該如何處理本次請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章