1、什么是REST?

要想更清楚地了解restful api是什么,我們還需要簡(jiǎn)單了解下REST是什么?它是一種軟件架構(gòu),決定了 API 的工作條件。2000年,羅伊·菲爾丁提出了代表狀態(tài)轉(zhuǎn)移(REST)作為設(shè)計(jì)網(wǎng)絡(luò)服務(wù)的架構(gòu)方法,REST 最初作為管理復(fù)雜網(wǎng)絡(luò)(例如互聯(lián)網(wǎng))上的通信的指南而建立。使用者可以使用基于 REST 的架構(gòu)為高性能和可靠的大規(guī)模通信提供支持;可以輕松應(yīng)用和修改此種架構(gòu),為任何 API 系統(tǒng)帶來可見性和跨平臺(tái)可能性。
REST架構(gòu)是一種基于超媒體構(gòu)建分布式系統(tǒng)的建筑風(fēng)格,它獨(dú)立于任何底層協(xié)議,不一定與HTTP綁定,唯一的要求是它們要符合以下六種 架構(gòu)約束(架構(gòu)約定):

  1. 統(tǒng)一接口。 無論請(qǐng)求來自何處,對(duì)同一資源發(fā)出的所有 API 請(qǐng)求都應(yīng)該看起來相同。 REST API 應(yīng)確保同一條數(shù)據(jù)(例如用戶的姓名或電子郵件地址)僅屬于一個(gè)統(tǒng)一資源標(biāo)識(shí)符 (URI)。 資源不應(yīng)過大,但應(yīng)包含客戶可能需要的每一條信息。
  2. 客戶端/服務(wù)器解耦。 在 REST API 設(shè)計(jì)中,客戶端和服務(wù)器的應(yīng)用程序必須彼此完全獨(dú)立。 客戶端應(yīng)用程序應(yīng)該知道的唯一信息是所請(qǐng)求資源的 URI;它不能以任何其他方式與服務(wù)器應(yīng)用程序交互。 同樣,除了通過 HTTP 將客戶端應(yīng)用程序傳遞到所請(qǐng)求的數(shù)據(jù)外,服務(wù)器應(yīng)用程序不應(yīng)修改客戶端應(yīng)用程序。
  3. 無狀態(tài)。 REST API 是無狀態(tài)的,這意味著每個(gè)請(qǐng)求都需要包含處理它所需的全部信息。 換句話說,REST API 不需要任何服務(wù)器端會(huì)話。 不允許服務(wù)器應(yīng)用程序存儲(chǔ)與客戶端請(qǐng)求相關(guān)的任何數(shù)據(jù)。
  4. 可緩存性。 如果可能,資源應(yīng)該可以在客戶端或服務(wù)器端緩存。 服務(wù)器響應(yīng)還需要包含有關(guān)是否允許對(duì)交付的資源進(jìn)行緩存的信息。 目標(biāo)是提高客戶端的性能,同時(shí)增強(qiáng)服務(wù)器端的可擴(kuò)展性。
  5. 分層系統(tǒng)架構(gòu)。 在 REST API 中,調(diào)用和響應(yīng)都會(huì)經(jīng)過多個(gè)不同的層。 根據(jù)經(jīng)驗(yàn),不要假設(shè)客戶端和服務(wù)器應(yīng)用程序直接連接到彼此。 通信環(huán)路中可能包含多個(gè)不同的中介服務(wù)器。 需要設(shè)計(jì) REST API,讓客戶端和服務(wù)器都無法判斷它是與最終應(yīng)用程序還是中介服務(wù)器進(jìn)行通信。
  6. 按需編碼(可選)。 REST API 通常發(fā)送靜態(tài)資源,但在某些情況下,響應(yīng)也可以包含可執(zhí)行代碼(例如 Java 小程序)。 在這些情況下,代碼只應(yīng)按需運(yùn)行。

簡(jiǎn)而言之,在REST架構(gòu)風(fēng)格中,數(shù)據(jù)和功能被視為資源,并使用統(tǒng)一資源標(biāo)識(shí)符(URI)進(jìn)行訪問。

2、Rest api 是什么?

了解了REST是什么,我們?cè)賮砹私庀翿est api 是什么?一般情況下,遵循 REST 架構(gòu)風(fēng)格的 API 稱為 REST API。因?yàn)镽EST 是一組架構(gòu)規(guī)范,并非協(xié)議或標(biāo)準(zhǔn),API 開發(fā)人員可以采用各種方式實(shí)施 REST。例如,當(dāng)客戶端通過 REST API 提出請(qǐng)求時(shí),它會(huì)將資源狀態(tài)表述傳遞給請(qǐng)求者或終端。該信息或表述通過 HTTP 以下列某種格式傳輸:JSON(Javascript 對(duì)象表示法)、HTML、XLT、Python、PHP 或純文本。

由于JSON 能被人和機(jī)器‘’,在當(dāng)下開放API環(huán)境及大部分企業(yè)內(nèi)部應(yīng)用中,實(shí)施REST API時(shí),默認(rèn)都采用REST約定+HTTP+JSON,這種組合已經(jīng)是一種事實(shí)上的標(biāo)準(zhǔn)。 下文及本網(wǎng)站提到的REST API、[[wiki:http-api|HTTP API]、Web API,在具體實(shí)施時(shí),一般都是‘__REST約定+HTTP+JSON’標(biāo)準(zhǔn)API__。

需要注意的地方: RESTful API采用HTTP時(shí),HTTP頭和參數(shù)、 HTTP 方法也很重要,因?yàn)槠渲邪苏?qǐng)求的元數(shù)據(jù)、授權(quán)、統(tǒng)一資源標(biāo)識(shí)符(URI)、緩存、cookie 等重要標(biāo)識(shí)信息。有請(qǐng)求頭和響應(yīng)頭,每個(gè)頭都有自己的 HTTP 連接信息和狀態(tài)碼。在《RESTfal API 設(shè)計(jì)》一文中會(huì)重點(diǎn)講這部分內(nèi)容的設(shè)計(jì)。

與Rest api 是什么?相關(guān)的一些基本概念:

? REST API 是什么- Payload
? REST API 是什么 – HTTP Methods
? REST API 是什么 – HTTP Status Codes

3、RESTful API是什么?

RESTful API就是REST API,術(shù)語 REST API 和 RESTful API 可以互換使用。

學(xué)習(xí)RESTful API時(shí)容易混淆的概念問題:

4、理解"統(tǒng)一接口"原則

統(tǒng)一接口是一切 RESTful Web 服務(wù)設(shè)計(jì)的基礎(chǔ)。其表示服務(wù)器以標(biāo)準(zhǔn)格式傳輸信息。格式化的資源在 REST 中稱為表征。此格式可以與服務(wù)器應(yīng)用程序上資源的內(nèi)部表征不同。例如,服務(wù)器可以將數(shù)據(jù)存儲(chǔ)為文本,但以 JSON 表征格式發(fā)送該數(shù)據(jù)。

統(tǒng)一接口強(qiáng)制實(shí)施四個(gè)架構(gòu)約束:

  1. 請(qǐng)求應(yīng)確定資源。它們通過使用統(tǒng)一的資源標(biāo)識(shí)符實(shí)現(xiàn)此功能。
  2. 客戶端包含資源表征中的足夠信息以修改或刪除資源(如需要)。服務(wù)器通過發(fā)送進(jìn)一步描述資源的元數(shù)據(jù)以符合這一條件。
  3. 客戶端接收有關(guān)如何進(jìn)一步處理表征的信息。服務(wù)器通過發(fā)送自描述信息實(shí)現(xiàn)此功能,該信息包含了有關(guān)客戶端如何以最佳方式使用這些信息的元數(shù)據(jù)。
  4. 客戶端接收有關(guān)其完成任務(wù)需要的所有其他相關(guān)資源的信息。服務(wù)器通過在表征中發(fā)送超鏈接實(shí)現(xiàn)此功能,以便客戶端可以動(dòng)態(tài)發(fā)現(xiàn)更多資源。

二、理解REST資源概念

REST資源中信息的關(guān)鍵抽象是一個(gè)資源。我們可以命名的任何信息都可以成為一種資源。例如,REST資源可以是文檔或圖像、時(shí)間服務(wù)、其他資源的集合或非虛擬對(duì)象(例如一個(gè)人)。
在任何特定時(shí)間,資源的狀態(tài)都被稱為資源表示。資源表示包括:

REST API由一個(gè)相互鏈接的資源組成組成。這組資源被稱為REST API的資源模型。

1)資源標(biāo)識(shí)符

REST使用資源標(biāo)識(shí)符來識(shí)別客戶端和服務(wù)器組件之間交互中涉及的每個(gè)資源。

2)超媒體

表示的數(shù)據(jù)格式被稱為媒體類型。媒體類型標(biāo)識(shí)了一個(gè)規(guī)范,該規(guī)范定義了如何處理表示。

RESTful API看起來像超文本。每個(gè)可尋址信息單元都攜帶一個(gè)地址,要么顯式(例如,鏈接和id屬性),要么隱式(例如,從媒體類型定義和表示結(jié)構(gòu)派生)。

3)自我描述

此外,資源表示應(yīng)是自我描述的:客戶不需要知道資源是員工還是設(shè)備。它應(yīng)該根據(jù)與資源相關(guān)的媒體類型進(jìn)行操作。
因此,在實(shí)踐中,我們將創(chuàng)建許多自定義媒體類型——通常與一個(gè)資源關(guān)聯(lián)的一種媒體類型。
每種媒體類型都定義了默認(rèn)處理模型。例如,HTML定義了超文本的渲染過程和圍繞每個(gè)元素的瀏覽器行為。

三、如何描述RESTful API?

RESTful API是隨著互聯(lián)網(wǎng)SAAS業(yè)務(wù)的發(fā)展而興盛,post:開放API給更多的人使用是其核心目標(biāo)之一,2011年由SmartBear Software的首席執(zhí)行官Dann Milner提出OpenAPI描述,逐步發(fā)展為一套R(shí)EST API描述規(guī)范(它類似SOAP的描述規(guī)范WSDL)。
Open API描述規(guī)范 為REST API on HTTP提供了一個(gè)正式的標(biāo)準(zhǔn),它使用YAMLJSON格式,描述API的路徑、參數(shù)、請(qǐng)求和響應(yīng)的結(jié)構(gòu)、錯(cuò)誤碼等信息。
JSON格式示意:

{
"title": "Sample Pet Store App",
"description": "This is a sample server for a pet store.",
"termsOfService": "http://explinks.com/terms/",
"contact": {
"name": "API Support",
"url": "http://cnzze.cn/support",
"email": "support@example.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0.1"
}

YAML格式示意:

title: Sample Pet Store App
description: This is a sample server for a pet store.
termsOfService: http://explinks.com/terms/
contact:
name: API Support
url: http://cnzze.cn/support
email: support@example.com
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.1

由于 OpenAPI 描述是計(jì)算機(jī)可讀的,因此可以使用它來執(zhí)行如下操作:

四、如何設(shè)計(jì)RESTful API?

RESTful API的架構(gòu)約束理解起來很容易,設(shè)計(jì)起來靈活度很大,以下是一些主要設(shè)計(jì)原則:

但在具體操作中卻比較復(fù)雜,網(wǎng)上有大量的API設(shè)計(jì)指導(dǎo)及規(guī)范,我們搜集、整理了一部分:

RESTful API設(shè)計(jì)概要RESTful API 狀態(tài)碼設(shè)計(jì)指南RESTful API 設(shè)計(jì)檢查清單

五、如何評(píng)估RESTful API成熟度?

2008年,Leonard Richardson為Rest API提出了以下 RESTful成熟度模型:

根據(jù)Fielding的定義,第3級(jí)對(duì)應(yīng)于一個(gè)真正的RESTful API。在實(shí)踐中,許多已發(fā)布的Web API大約在2級(jí)左右。

六、RESTful API的安全性

RESTful API的安全性 也始于行業(yè)最佳實(shí)踐,例如使用散列算法確保密碼安全性,使用 HTTPS 實(shí)現(xiàn)安全數(shù)據(jù)傳輸。 像 OAuth 2.0這樣的授權(quán)框架可以幫助限制第三方應(yīng)用程序的特權(quán)。 使用 HTTP 頭中的時(shí)間戳記,API 還可以拒絕在特定時(shí)間段后到達(dá)的任何請(qǐng)求。 同時(shí)也可以通過參數(shù)驗(yàn)證和 JSON Web 令牌等方式來確保只有經(jīng)過授權(quán)的客戶端才能訪問 API。

參考資料:

架構(gòu)風(fēng)格與基于網(wǎng)絡(luò)應(yīng)用軟件的架構(gòu)設(shè)計(jì)(中文修訂版)
10大REST API常見問題?

什么是API?(Aws)
REST與SOAP的區(qū)別?
介紹 Web 基礎(chǔ)架構(gòu)設(shè)計(jì)原則的經(jīng)典論文《架構(gòu)風(fēng)格與基于網(wǎng)絡(luò)的軟件架構(gòu)設(shè)計(jì)》導(dǎo)讀

一站搜索、試用、比較全球API!
冪簡(jiǎn)集成已收錄 4993種API!
試用API,一次比較多個(gè)渠道