1. 程式人生 > >怎樣理解 REST、RESTful

怎樣理解 REST、RESTful

本文雖然是參考別人的內容,但是是作者花很多心思整理出來,整理本文章的目的是為了自己可以好理解REST和方便其他人理解,如果要轉載,請徵求作者意見!

一、什麼是API?

    為了解釋清楚REST,必須理解API。API(Application Programming Interface,應用程式程式設計介面),通俗來講就是像一個公司比如騰訊、阿里之類,他們可以提供一個API,然後我們或者其他的小公司可以編一個軟體去跟這個介面(API)進行相連或者互動。舉個例子,比如你可以用手機的其他軟體分享內容到微信朋友群或者新浪微微博,這些軟體就是與微信和微博的API進行互動。

二、什麼是WEB?

      為了解釋清楚什麼是REST架構風格,必須提到WEB,因為REST是以Web為平臺的。Web是分散式資訊系統為超文字檔案和其他物件(資源)提供訪問入口。其中資源

是Web架構的關鍵點,需要以下3個操作,識別(identity)、表示(represent)、互動(interact with),通過這三個操作,有引出三個概念URI(統一資源識別符號包括URL和URN)是用來識別資源,representation(例如html、xml、圖片、視訊等等)是用來表示資源,通過協議(包括http、ftp等等)來與資源進行互動。

三、什麼是URI和URL?

 (1) 統一資源標誌符URI

         就是在某一規則下能把一個資源獨一無二地標識出來。拿人做例子,假設這個世界上所有人的名字都不能重複,那麼名字就是URI的一個例項,通過名字這個字串就可以標識出唯一的一個人。現實當中名字當然是會重複的,所以身份證號才是URI,通過身份證號能讓我們能且僅能確定一個人。

(2)統一資源定位符URL

       也拿人做例子然後跟HTTP的URL做類比,就可以有:動物住址協議://地球/中國/浙江省/杭州市/西湖區/某大學/14號宿舍樓/525號寢/張三.人可以看到,這個字元串同樣標識出了唯一的一個人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置來唯一確定一個人的。

         在上文我們用身份證號也可以唯一確定一個人。對於這個在杭州的張三,我們也可以用:身份證號:123456789來標識他。所以不論是用定位的方式還是用編號的方式,我們都可以唯一確定一個人,都是URl的一種實現,而URL就是用定位的方式實現的URI。

        回到Web上,假設所有的Html文件都有唯一的編號,記作html:xxxxx,xxxxx是一串數字,即Html文件的身份證號碼,這個能唯一標識一個Html文件,那麼這個號碼就是一個URI。
        而URL則通過描述是哪個主機上哪個路徑上的檔案來唯一確定一個資源,也就是定位的方式來實現的URI。對於現在網址我更傾向於叫它URL,畢竟它提供了資源的位置資訊,如果有一天網址通過號碼來標識變成了
741236985.html
,那感覺叫成URI更為合適,不過這樣子的話還得想辦法找到這個資源咯

四、什麼是REST?

     REST全稱是Resource REpresentational State Transfer,中文翻譯是表現層狀態轉移,理解起來很困難。這裡引用@Ivony老師的一句話概括很精闢:URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。REST是一種架構風格,騰訊公司或者其他公司建立API是都要遵守的一種規則/風格,當然也有其他的 規則可以使用。  下面是REST全稱中每個單詞的含義: 

        (1)Transfer:通俗來講就是:資源在網路中以某種表現形式進行狀態轉移。分解開來:
        (2)Resource:資源,即資料(前面說過網路的核心)。比如 newsfeed,friends等;
        (3)Representational:某種表現形式,比如用JSON,XML,JPEG等;
        (4) State Transfer:狀態變化。通過HTTP動詞實現。

       所以REST就是通過使用http協議和URI,利用client/server model對資源進行CRUD(Create、Read、Updata、Delete)增加改查操作。

五、RESTful API

       REST描述的是在網路中client和server的一種互動形式;REST本身不實用,實用的是如何設計好的 RESTful API(REST風格的網路介面)。

為什麼要使用RESTful結構呢?

       大家都知道"古代"網頁是前端後端融在一起的,比如之前的PHP,JSP等。在之前的桌面時代問題不大,但是近年來移動網際網路的發展,各種型別的Client層出不窮,RESTful可以通過一套統一的介面為 Web,iOS和Android提供服務。另外對於廣大平臺來說,比如Facebook platform,微博開放平臺,微信公共平臺等,它們不需要有顯式的前端,只需要一套提供服務的介面,於是RESTful更是它們最好的選擇。在RESTful架構下:


六、為什麼要使用REST風格?

    我們使用REST風格肯定是有其的優點,要介紹它的優點又要提到它的留個限制,這裡把它的限制和優點都列出來:

1.客戶--伺服器(Client--Server)

限制:客戶端和伺服器分離

優點:(1)提高使用者介面的便攜性(操作簡單)

(2)通過簡化伺服器提高可伸縮性(高效能,低成本)

(3)允許元件分別優化(可以讓伺服器和客戶端分別進行改進和優化)

2.無狀態(Stateless)

限制:從客戶端的每個請求要包含伺服器所需要的所有資訊

優點:(1)提高可見性(可以單獨考慮每個請求)

(2)提高了可靠性(更容易從區域性故障中修復)

(3)提高可擴充套件性(降低了伺服器資源使用)

3.快取(Cachable)

限制:伺服器返回資訊必須被標記是否可以快取,如果快取,客戶端可能會重用之前的資訊傳送請求。

優點:(1)減少互動次數

(2)減少互動的平均延遲

4.分層系統(Layered System)--約束

限制:系統元件不需要知道與他交流元件之外的事情。封裝服務,引入中間層。

優點:(1)限制了系統的複雜性

(2)提高可擴充套件性

5.統一介面(Uniform Interface)--約束

優點:(1)提高互動的可見性

(2)鼓勵單獨改善元件

6.支援按需程式碼(Code-On-Demand可選)---約束

優點:(1)提高可擴充套件性

七、理解REST的幾點注意事項

第一、REST不是英文單詞“rest”,它們兩者之間沒有任何聯絡!!!!REST是 REpresentational State Transfer這幾個單詞的簡稱。

第二、Server提供的RESTful API中,URL中只使用名詞來指定資源,原則上不使用動詞。“資源”是REST架構或者說整個網路處理的核心。比如:


第三、用HTTP協議裡的動詞來實現資源的新增,修改,刪除等操作。即通過HTTP動詞來實現資源的狀態扭轉,HTTP標準的方法有如下:
(1)GET 用來獲取資源,例如:http://example.com/api/orders,用來檢索order list。
例如:http://example.com/api/orders/123用來獲取某個特定資源的資訊。
(2)POST 用來新建資源(也可以用於更新資源),例如:http://api.qc.com/v1/friends: 新增好友
(3)PUT 用來更新資源,例如:http://example.com/api/orders/123
(4)DELETE 用來刪除資源。比如:http://api.qc.com/v1/friends: 刪除某人的好友 (在http parameter指定好友id)
(5)UPDATE api.qc.com/v1/profile: 更新個人資料
下面是API的圖例:


第四、 Server和Client之間傳遞某資源的一個表現形式,比如用JSON,XML傳輸文字,或者用JPG,WebP傳輸圖片等。當然還可以壓縮HTTP傳輸時的資料(on-wire data compression)。

第五、用 HTTP Status Code傳遞Server的狀態資訊。比如最常用的 200 表示成功,500 表示Server內部錯誤等。

本章內容參考知乎的問答:https://www.zhihu.com/question/28557115下的覃超和的回答。
連結:https://www.zhihu.com/question/21950864/answer/154309494