RESTful必須知道的那些事

為什么會出現(xiàn)RESTful

先不要急著知道RESTful到底是什么,它沒那么高深的。要想清楚的知道RESTful,首先回顧下HTTP協(xié)議,以及API(Application Programming Interface,應(yīng)用程序編程接口)。這樣可以知道RESTful的來歷及意義所在。

  • API

    應(yīng)用程序編程接口,說白了就是預(yù)定義一些功能,供其他調(diào)用,從而做到提供服務(wù)的作用。

  • HTTP
    在這里不說具體HTTP的含義,及相關(guān)基礎(chǔ)的概念。想了解可以參考《圖解HTTP》這本書,講的很詳細(xì)也很生動。在這里只想說說HTTP協(xié)議的基本構(gòu)成。

HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求。Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。這里就涉及到HTTP請求Request)和響應(yīng)(Response),對于一個完整的請求(Request)、響應(yīng)(Response)來說,還是有一定規(guī)范的(有套路的),這里我們看一下HTTP請求和響應(yīng)的一些基本信息。

舉個栗子:

我們用Fiddler抓了一下360瀏覽器的任務(wù)中心的API接口信息,如下是它的請求信息:

GET http://task.browser.#/online/setpoint HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Pragma: no-cache
Content-Type: application/x-www-form-urlencoded
Host: task.browser.#
Content-Length: 449
Cookie:__guid=91251416.3523784108665864700.1520256100246.427D%25PO%25QR%25P9%25R1%25P0%25RS%25O5%25P4%25PO%25N7%25

得到的服務(wù)器響應(yīng)結(jié)果,如下所示:

```
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Sat, 10 Mar 2018 03:37:00 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
{"errno":"10003","errmsg":"\u7b7e\u540d\u9519\u8bef"}
    ```

我們可以看到:

  • 請求Request :

    1. 請求的方式 GET
    2. 請求的地址 URL(http://task.browser.#/online/setpoint
    3. 版本號(HTTP/1.1)
    4. 請求的頭部信息,headers(Accept,Host,cookie等在于此處存著)
    5. 附屬體信息 (通常為自定義傳的參數(shù),這里并沒有體現(xiàn))
  • 響應(yīng)Response :

    1. 版本號
    2. 狀態(tài)碼 (http協(xié)議的狀態(tài)碼)
    3. 相應(yīng)頭部信息headers (時間、數(shù)據(jù)格式、編碼等信息)
    4. 附屬體信息(通常為相應(yīng)的自定義數(shù)據(jù)體)

那么問題來了,既然HTTP協(xié)議是有其規(guī)則的,那么我們在設(shè)計API的時候,也應(yīng)該有一定的規(guī)則。這里頭最有名的就是RESTful API規(guī)范了。

RESTful為何物?

首先來解釋下它的直面意思,它是Representational State Transfer的縮寫,翻譯過來就是“表現(xiàn)層狀態(tài)轉(zhuǎn)換”。(直面意思都這么高深的樣子)其實這里省略了它的主語resource(資源),即resource representational state transfer(資源表現(xiàn)層狀態(tài)轉(zhuǎn)換)。那資源指的又是什么呢?表現(xiàn)層又是什么?狀態(tài)轉(zhuǎn)化是做了什么呢?

  • resource(資源):其實就是網(wǎng)絡(luò)上的某個信息,例如一段文本、一張圖片、一首歌曲等。每個資源對應(yīng)一個特定的URL。要獲取這個資源,訪問它的URL就可以,因此URI就成了每一個資源的地址或獨一無二的識別符。

  • representation(表現(xiàn)層):"資源"是一種信息實體,它可以有多種外在表現(xiàn)形式。比如,一段文本我們可以用md格式或者txt等格式表現(xiàn);圖片可以用JPG格式表現(xiàn),也可以用PNG格式表現(xiàn)。我們把"資源"具體呈現(xiàn)出來的形式,叫做它的"表現(xiàn)層"。因此所說的表現(xiàn)層是建立在資源上的。

  • state transfer(狀態(tài)轉(zhuǎn)換):我們知道,客戶端與服務(wù)端是一種互動的關(guān)系,這就意味著,客戶端的操作會改變服務(wù)端資源的狀態(tài),這種狀態(tài)的變換叫做state transfer(狀態(tài)轉(zhuǎn)換),而這種狀態(tài)轉(zhuǎn)換是基于表現(xiàn)層,也就是說是對資源表現(xiàn)層的狀態(tài)轉(zhuǎn)換。所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。

我們知道客戶端操作是通過HTTP請求對服務(wù)端資源操作的,HTTP/1.1中,請求方法有(GET, POST, PUT, PATCH, DELETE)這些,并且有具體的含義。

GET(SELECT):從服務(wù)器取出資源(一項或多項)。
POST(CREATE):在服務(wù)器新建一個資源。
PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源)。
PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性)。
DELETE(DELETE):從服務(wù)器刪除資源。

介紹上面基本概念后,總結(jié)下RESTful到底是什么,它就是:利用HTTP的請求方法去操作URL定位的資源,它是一種客戶端與服務(wù)端交互的一種規(guī)范。它的核心思想就是:URL只負(fù)責(zé)描述需要操作的資源,所以URL里頭不應(yīng)該有動詞,應(yīng)該是名詞。HTTP負(fù)責(zé)描述操作。

RESTful示例

例如一個關(guān)于組織機構(gòu)的API設(shè)計應(yīng)該這樣:

http://www.organization.com/orgs
http://www.organization.com/departments
http://www.organization.com/staffs

基于請求的方式和路徑來作為常見的CURD(增刪改查)

GET /orgs 列出所有組織
POST /orgs 新增一個或多個組織
GET /orgs/ID 查詢某個組織
PUT /orgs/ID 更新某個組織
DELETE /orgs/ID 刪除某個組織
GET /orgs/ID/departments 查詢某個組織下的所有部門
DELETE /orgs/ID/departments/ID/staffs 查詢某個組織下的某個部門的所有員工

對于請求后的響應(yīng)結(jié)果,RESTful也做了一個很好得定義:

GET /orgs:返回資源對象的列表(數(shù)組)
GET /orgs/resource:返回單個資源對象
POST /orgs:返回新生成的資源對象
PUT /orgs/resource:返回完整的資源對象
DELETE /orgs/resource:返回一個空文檔

RESTful設(shè)計誤區(qū)

最常見的一種設(shè)計錯誤,就是URI包含動詞。因為"資源"表示一種實體,所以應(yīng)該是名詞,URL不應(yīng)該有動詞,動詞應(yīng)該放在HTTP協(xié)議中。

RESTful優(yōu)點

  • URL具有很強可讀性的,具有自描述性
  • 可提供OpenAPI,便于第三方系統(tǒng)集成,提高互操作性;

RESTful的缺點

  • 請求路徑將表內(nèi)關(guān)系完全暴露,響應(yīng)結(jié)果將表結(jié)構(gòu)暴露,
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 一說到REST,我想大家的第一反應(yīng)就是“啊,就是那種前后臺通信方式?!钡窃谝笤敿?xì)講述它所提出的各個約束,以及如...
    時待吾閱讀 3,594評論 0 19
  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,917評論 0 6
  • 一篇好的關(guān)于RESTFUL API的文章(對英文進行了簡單的翻譯,方便英文閱讀困難的朋友),共讀,閱讀時間約10分...
    CC先生之簡書閱讀 2,798評論 0 7
  • 學(xué)習(xí)體會: 1、雙輪矩陣可以幫助客戶總結(jié)已經(jīng)做了哪些事情,確定更詳細(xì)具體的方案,列出行動計劃。 2、教練在每個工具...
    傳習(xí)錄每日60秒閱讀 612評論 0 1

友情鏈接更多精彩內(nèi)容