RESTful快速入門

一、概述

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è)約束:

  1. 使用客戶端/服務(wù)器模型。
  2. 使用層次化的系統(tǒng)。
  3. 無狀態(tài)??蛻舳嗽诿看伟l(fā)送請(qǐng)求時(shí)都需要提供足夠的信息。
  4. 可緩存。能夠緩存請(qǐng)求,以盡量減少客戶端和服務(wù)器之間的信息傳輸。
  5. 統(tǒng)一的接口。使用統(tǒng)一的接口來完成用戶與服務(wù)之間以及各子系統(tǒng)之間的交互。

關(guān)于接口,有以下幾個(gè)原則:

  1. 每個(gè)資源都擁有一個(gè)資源標(biāo)識(shí)。
  2. 消息的自描述性。所傳遞的消息需要能夠提供自身的足夠信息。
  3. 資源的自描述性。所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息。
  4. 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 一說到REST,我想大家的第一反應(yīng)就是“啊,就是那種前后臺(tái)通信方式。”但是在要求詳細(xì)講述它所提出的各個(gè)約束,以及如...
    時(shí)待吾閱讀 3,598評(píng)論 0 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評(píng)論 25 709
  • 歡呼起來吧 愚笨的生靈 蝙蝠掠過天空 只留下一片沉寂 短促尖細(xì)的叫聲 摻雜著稀薄的空氣和風(fēng) 把健康與寧靜輕輕喚醒 ...
    絳洞花王閱讀 290評(píng)論 9 5
  • 愛情有著各種各樣的偽裝,有如波濤洶涌的,也有細(xì)水長流的,有天崩地裂的,也有恬靜安寧的,可是無論我們看過多少種愛情的...
    荏苒_追憶閱讀 268評(píng)論 0 0

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