>
> 換句話說,任何可能成為作者超文本引用目標的概念都必須符合資源的定義。
>
> 資源是對一組實體的概念映射,而不是與任何特定時間點的映射相對應的實體。—[羅伊·菲爾丁的論文](http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1_1)

### 1.1.單人和收集資源

__資源可以是單人或集合__。

例如,“`customers`”是集合資源,而“`customer`”是單例資源(在銀行領域中)。

我們可以使用URI“`/customers`”來識別“`customers`”集合資源。我們可以使用URI“`/customers/{customerId}`”識別單個“`customer`”資源。

“`
/customers //is a collection resource

/customers/{id} // is a singleton resource
“`

### 1.2.收集和子收集資源

__資源也可能包含子集合資源__。

例如,可以使用URN“`/customers/{customerId}/accounts`”(在銀行域中)識別特定“`customer`”的子收集資源“`accounts`”。

同樣,子集合資源“`accounts`”中的單元資源“`account`”可以識別如下:“`/customers/{customerId}/accounts/{accountId}`”。

“`
/customers //is a collection resource

/customers/{id}/accounts // is a sub-collection resource
“`

### 1.3.URI

REST API使用[統一資源標識符](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier)(URI)來尋址資源。REST API設計者應該創建URI,將REST API的資源模型傳達給API的潛在客戶端。當資源命名得當時,API是直觀且易于使用的。如果做得不好,同樣的API使用和理解可能具有挑戰性。

> *統一接口的約束部分通過URI和HTTP動詞的組合以及根據標準和慣例使用它們來解決。*

以下是一些提示,讓您在為新[API](http://www.dlbhg.com/wiki/api/)創建資源URI時繼續前進。

PauseNextUnmute

CurrentTime1:24

/

Duration1:45

[Loaded](http://www.dlbhg.com/provider/uid202411207000278b58f5):99.94%SubtitlesFullscreen

## 2.最佳實踐

### 2.1.使用名詞來表示資源

RESTful URI應該引用一個事物(名詞)的資源,而不是引用一個動作(動詞),因為名詞具有動詞沒有的屬性——同樣,資源也有屬性。資源的一些例子是:

– 系統的用戶
– 用戶帳戶
– 網絡設備等

他們的資源URI可以設計如下:

“`
/device-management/managed-devices

/device-management/managed-devices/{device-id}

/user-management/users

/user-management/users/{id}
“`

為了更清楚起見,讓我們將__資源原型__分為三類(文檔、集合和存儲)。那么,__您__最好__始終將資源放入一個原型中,然后始終如一地使用其命名約定__。

*為了一致性,抵制設計多個原型混合資源的誘惑。*

#### 2.1.1. 文件

文檔資源是一個類似于對象實例或數據庫記錄的單一概念。

在REST中,您可以將其視為資源集合中的單個資源。文檔的狀態表示通常包括具有值的字段和與其他相關資源的鏈接。

使用“*單數*”名稱來表示文檔資源原型。

“`
http://api.example.com/device-management/managed-devices/{device-id}
http://api.example.com/user-management/users/{id}
http://api.example.com/user-management/users/admin
“`

#### 2.1.2. 收集

集合資源是服務器管理的資源目錄。

客戶可能會提出將新資源添加到集合中。然而,由集合資源來選擇是否創建新資源。

集合資源選擇它想要包含的內容,并決定每個包含資源的URI。

__使用“復數”名稱來表示集合資源原型。__

“`
/device-management/managed-devices
/user-management/users
/user-management/users/{id}/accounts
“`

#### 2.1.3. 商店

存儲是客戶端管理的資源存儲庫。存儲資源允許API客戶端將資源放入,將其取回,并決定何時刪除它們。

存儲從不生成新的URI。相反,每個存儲的資源都有一個URI。當資源最初放入商店時,客戶端選擇了URI。

使用“復數”名稱來表示存儲資源原型。

“`
/song-management/users/{id}/playlists
“`

### 2.2.一致性是關鍵

使用一致的資源命名約定和URI格式,以實現最小的模糊性和最大的可讀性和可維護性。您可以實現以下設計提示以實現一致性:

#### 2.2.1.使用正斜杠(/)來指示分層關系

正斜杠(/)字符用于URI的路徑部分,以指示資源之間的分層關系。例如

“`
/device-management
/device-management/managed-devices
/device-management/managed-devices/{id}
/device-management/managed-devices/{id}/scripts
/device-management/managed-devices/{id}/scripts/{id}
“`

#### 2.2.2.不要在URI中使用尾隨正斜杠(/)

作為URI路徑中的最后一個字符,正斜杠(/)不會增加語義值,可能會混淆。最好把它從URI中刪除。

“`
http://api.example.com/device-management/managed-devices/
http://api.example.com/device-management/managed-devices /*This is much better version*/
“`

#### 2.2.3.使用連字符(-)來提高URI的可讀性

為了使您的URI易于人們掃描和解釋,請使用連字符(-)字符來提高長路徑段中名稱的可讀性。

“`
http://api.example.com/devicemanagement/manageddevices/
http://api.example.com/device-management/managed-devices /*This is much better version*/
“`

#### 2.2.4.不要使用下劃線(_)

可以使用下劃線代替連字符作為分隔符——但根據應用程序的字體,下劃線(_)字符可能會部分被遮擋或完全隱藏在某些瀏覽器或屏幕中。

為了避免這種混淆,請使用連字符(-)而不是下劃線(_)。

“`
http://api.example.com/inventory-management/managed-entities/{id}/install-script-location //More readable

http://api.example.com/inventory-management/managedEntities/{id}/installScriptLocation //Less readable
“`

#### 2.2.5.在URI中使用小寫字母

方便時,在URI路徑中應始終首選小寫字母。

“`
http://api.example.org/my-folder/my-doc //1
HTTP://API.EXAMPLE.ORG/my-folder/my-doc //2
http://api.example.org/My-Folder/my-doc //3
“`

在上述示例中,1和2是相同的,但3不是因為它使用大寫字母的__My-Folder__。

### 2.3.不要使用文件擴展名

文件擴展名看起來很糟糕,不會增加任何優勢。刪除它們也會減少URI的長度。沒有理由保留它們。

除了上述原因外,如果您想使用文件擴展名突出顯示API的媒體類型,那么您應該__依靠通過__`Content-Type`__標題____傳達的媒體類型____來確定如何處理正文的內容__。

“`
/device-management/managed-devices.xml /*Do not use it*/

/device-management/managed-devices /*This is correct URI*/
“`

### 2.4.切勿在URI中使用CRUD函數名

我們不應該使用URI來指示[CRUD](http://www.dlbhg.com/wiki/what-is-crud/)函數。URI只能用于識別資源,而不是對它們進行任何獨特的操作。

我們應該使用[HTTP](http://www.dlbhg.com/wiki/what-are-http-and-https/)請求方法來指示執行了哪個CRUD函數。

“`
HTTP GET /device-management/managed-devices //Get all devices
HTTP POST /device-management/managed-devices //Create new Device

HTTP GET /device-management/managed-devices/{id} //Get device for given Id
HTTP PUT /device-management/managed-devices/{id} //Update device for given Id
HTTP DELETE /device-management/managed-devices/{id} //Delete device for given Id
“`

### 2.5.使用查詢組件過濾URI集合

通常,您會遇到需要根據某些特定資源屬性進行排序、過濾或限制的資源集合。

對于此要求,不要創建新的API——相反,在資源收集API中啟用排序、過濾和分頁功能,并將輸入參數作為查詢參數傳遞。例如

“`
/device-management/managed-devices
/device-management/managed-devices?region=USA
/device-management/managed-devices?region=USA&brand=XYZ
/device-management/managed-devices?region=USA&brand=XYZ&sort=installation-date
“`

一站搜索、試用、比較全球API!
冪簡集成已收錄 4968種API!
試用API,一次比較多個渠道