Skip to content
ADP
API Design PrincipleBETA

[ADP-314] 資源標識符

指導方針

  • 必須(MUST)為資源設置標識符欄位。

  • 應該(SHOULD)優先選擇字串類型而非數字作為標識符。

  • 可以(MAY)使用 UUID 或 ULID 生成 id

    TIP

    💡 作為父資源一部分且無法獨立存在的子資源可能沒有 id 欄位。相反,它們仍會有一個唯一的欄位,如 typename

  • 不應(SHOULD NOT)使用遞增整數作為 id 生成邏輯。

    TIP

    💡 使用遞增整數可能導致潛在的安全風險,例如 ID 容易被預測,這可能被利用來訪問未經授權的資源。此外,遞增整數在分佈式系統中可能會導致可擴展性和唯一性問題。

    TIP

    💡 然而,如果資源數量保證很小,使用 UUID 可能過於複雜。如果沒有安全顧慮,API 設計者可以選擇使用遞增數字(轉換為字串)。

  • 不應(SHOULD)使用外部 ID 作為資源 ID。所謂的外部 ID 指的是不受你控制的 ID,比如第三方系統產生的 ID。

  • 必須(MUST)使用 URL 友好的標識符

    • 為了簡化資源 ID 在 URL 中的編碼,它們必須符合正則表達式 [a-zA-Z0-9:._\-/]*。資源 ID 應只包含使用字母、數字、下劃線、減號、冒號、句點,以及 - 在極少數情況下 - 斜線的 ASCII 字串。
  • 應該(SHOULD)在適當的情況下考慮使用有意義的標識符,在可讀性和安全性之間取得平衡。

  • 必須(MUST)確保標識符在資源類型的範圍內是唯一的。

  • 應該(SHOULD)在相關資源之間使用一致的標識符格式。

示例

主要資源 JSON 表示

json
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "name": "主要資源",
  "type": "primary",
  "subResource": {
    "type": "example",
    "name": "子資源"
  }
}

URI 引用

  • 主要資源:
http
GET /resources/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
  • 主要資源中的子資源:
http
GET /resources/123e4567-e89b-12d3-a456-426614174000/sub-resource HTTP/1.1

最佳實踐

  1. 一致性:在整個 API 中保持一致的標識符格式。
  2. 不可變性:一旦分配,資源標識符不應更改。
  3. 不透明性:避免在標識符中編碼敏感資訊。
  4. 性能:考慮標識符選擇對數據庫索引和查詢性能的影響。
  5. 可擴展性:選擇能夠適應未來增長的標識符格式。

相關 ADP

參考資料