一、概述
Representational State Transfer (REST) is a software architecture style consisting of guidelines and best practices for creating scalable web services. REST is a coordinated set of constraints applied to the design of components in a distributed hypermedia system that can lead to a more performant and maintainable architecture.
REST是一種軟件架構(gòu)風(fēng)格,是創(chuàng)建可擴(kuò)展web服務(wù)的指南和最佳實(shí)踐。在分布式系統(tǒng)中提出一系列約束和規(guī)范,以創(chuàng)建高性能和可維護(hù)的架構(gòu)。如果一個(gè)架構(gòu)符合REST原則,就可以稱它為RESTful架構(gòu)。
二、概念
1、資源
所謂資源,就是網(wǎng)絡(luò)上的一個(gè)實(shí)體,可以是一段文本、一張圖片、一種服務(wù)等具體的存在。用URI(統(tǒng)一資源標(biāo)識(shí)符)來指向資源,每種資源對(duì)應(yīng)一個(gè)特定的URI。要想獲取資源,訪問該資源的URI即可。
2、表現(xiàn)層
網(wǎng)絡(luò)實(shí)體(資源)可以有多種表現(xiàn)形式,其具體表現(xiàn)出來的形式,稱為它的表現(xiàn)層。比如文本可以用txt格式表現(xiàn),也可以使用HTML格式、XML格式、JSON格式表現(xiàn)。圖片可以用JPG格式表現(xiàn),也可以使用PNG格式表現(xiàn)。URI只代表資源的位置,它的表現(xiàn)形式應(yīng)該在請(qǐng)求的頭信息中指定。
3、狀態(tài)轉(zhuǎn)換
當(dāng)客戶端與服務(wù)器之間進(jìn)行互動(dòng)時(shí),會(huì)涉及到數(shù)據(jù)和狀態(tài)的變化。由于HTTP協(xié)議是一個(gè)無狀態(tài)協(xié)議,客戶端需要通過HTTP動(dòng)作使服務(wù)器端發(fā)生狀態(tài)轉(zhuǎn)化。
三、約束
要想構(gòu)建RESTful的架構(gòu),有以下幾個(gè)約束:
- 使用客戶端/服務(wù)器模型。
- 使用層次化的系統(tǒng)。
- 無狀態(tài)??蛻舳嗽诿看伟l(fā)送請(qǐng)求時(shí)都需要提供足夠的信息。
- 可緩存。能夠緩存請(qǐng)求,以盡量減少客戶端和服務(wù)器之間的信息傳輸。
- 統(tǒng)一的接口。使用統(tǒng)一的接口來完成用戶與服務(wù)之間以及各子系統(tǒng)之間的交互。
關(guān)于接口,有以下幾個(gè)原則:
- 每個(gè)資源都擁有一個(gè)資源標(biāo)識(shí)。
- 消息的自描述性。所傳遞的消息需要能夠提供自身的足夠信息。
- 資源的自描述性。所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息。
- HATEOAS。只可以通過服務(wù)端所返回各結(jié)果中所包含的信息來得到下一步操作所需要的信息。
四、設(shè)計(jì)原則
1、資源識(shí)別
REST中的API是以資源為中心,而不是以執(zhí)行的動(dòng)作為中心。通常所執(zhí)行動(dòng)作的對(duì)象被看成是系統(tǒng)中的資源。如果一個(gè)動(dòng)作沒有明確的操作對(duì)象,就需要考慮該動(dòng)作產(chǎn)生了哪些影響或哪些狀態(tài)發(fā)生了改變,發(fā)生變化的實(shí)體就是資源。
在抽象出資源的過程中,按照自頂向下的方式,首先識(shí)別出主要資源,然后識(shí)別主要資源的子資源,依次迭代。
判斷一個(gè)資源定義是否合理,有以下幾種方法:
- 對(duì)資源的CRUD是否有意義。
- 是否需要除CRUD之外的操作。
- 資源是否被整體使用。
2、資源的URL
當(dāng)標(biāo)識(shí)出一個(gè)資源之后,需要為資源分配對(duì)應(yīng)的URL。一個(gè)URL主要由幾部分組成:
- 協(xié)議,即HTTP或HTTPS。
- 域名,盡量將API部署在專有域名下。如果API很簡單,不會(huì)進(jìn)一步擴(kuò)展,也可以放在主域名下。
- 相對(duì)路徑,每個(gè)網(wǎng)址代表一種資源,所以只使用名詞,而不使用動(dòng)詞。所用的名詞通常與數(shù)據(jù)庫對(duì)應(yīng),并且數(shù)據(jù)庫通常都是記錄的集合,所以API中的名詞應(yīng)該使用復(fù)數(shù)形式。如果API版本更迭,應(yīng)該將API的版本號(hào)也放到URL中。
- 請(qǐng)求參數(shù),即由“?”開始,并由“&”連接的多個(gè)鍵值對(duì)組成的字符串。
對(duì)于返回的記錄數(shù)量很多的場(chǎng)合,API應(yīng)該提供參數(shù),過濾返回結(jié)果:
- ?Limit=10,指定返回記錄的數(shù)量。
- ?offset=10,指定返回記錄的開始位置。
- ?page=2&per_page=100,指定第幾頁,以及每頁的記錄數(shù)。
- ?sortby=name&order=asc,指定返回結(jié)果按照哪個(gè)屬性排序,以及排序的升降順序。
- ?type_id=1,指定過濾條件。
3、使用合適的動(dòng)詞
對(duì)資源的具體操作類型,由HTTP動(dòng)詞表示。
- GET(SELECT),從服務(wù)器獲取資源。
- POST(CREATE),在服務(wù)器創(chuàng)建一個(gè)資源。
- PUT(UPDATE),更新服務(wù)器上的資源(客戶端提供更新后的完整資源)。
- PATCH(UPDATE),更新服務(wù)器上的資源(客戶端提供更新的屬性)。
- DELETE(DELETE),刪除服務(wù)器上的資源。
- HEAD,獲取資源的元數(shù)據(jù)。
- OPTIONS,獲取關(guān)于資源的哪些屬性是可以改變的信息。
()內(nèi)表示與動(dòng)詞等價(jià)的數(shù)據(jù)庫操作。
4、使用標(biāo)準(zhǔn)的狀態(tài)碼
服務(wù)器向客戶端返回的狀態(tài)碼和提示信息,具體可參見HTTP響應(yīng)碼。如果狀態(tài)碼是4xx,就應(yīng)該向客戶端返回出錯(cuò)信息。通常返回的信息中將error作為鍵名,出錯(cuò)信息作為鍵值。
5、選擇適當(dāng)?shù)谋硎窘Y(jié)構(gòu)
服務(wù)器返回的數(shù)據(jù)格式,應(yīng)該盡量使用JSON,避免使用XML。