[ADP-702] 可枚舉值約定
指導原則
- 必須(MUST)使用大寫蛇形命名法(UPPER_SNAKE_CASE)來表示可枚舉值,除非在特定情況下,該可枚舉值在業界普遍使用小寫,則可以例外。
- 應該(SHOULD)使用基於字串的枚舉而非數值。
- 例外:該可枚舉值為類似
1.0
的版本號碼時。
- 例外:該可枚舉值為類似
- 應該(SHOULD)為每個可枚舉值提供清晰、自我解釋、一致且具描述性的名稱。
- 不應(SHOULD NOT)使用非廣泛認知的縮寫。
- 理想情況下,每個列舉值的含義應該是顯而易見的,使得 API 使用者無需查閱文件即可理解。
- 可以(MAY)在API文件中為每個可枚舉值提供描述。
- 在可能的情況下應(SHOULD)使用可擴充式枚舉。。
- 要棄用某個可枚舉值時,應該(SHOULD)在文件中標記為
deprecated
。 - 整份文件應該(SHOULD)使用同一個枚舉值設計來描述特定資料。
設計思路
雖然"type"欄位的命名通常看起來是可枚舉的,但對於problem+json
來說,它必須是一個uri-reference。有關兼容性要求,請參見[ADP-401] HTTP問題基礎。
可枚舉值應在整個API中保持一致,以提高可讀性和可維護性。使用大寫蛇形命名法為可枚舉值提供了明確的視覺區分,並與常見的編程慣例保持一致。
相比於數值,更傾向於使用基於字串的枚舉,因為它們是自文件化的,且不易出錯。它們還能在API回應和文件中提供更好的可讀性。
示例
正確做法:
http
{
"role": "GROUP_ADMINISTRATOR",
"status": "ACTIVE",
"permission": "READ_WRITE"
}
錯誤做法:
http
{
"role": "groupAdministrator",
"status": "active",
"permission": "rw"
}
不建議做法:
http
{
"role": 1,
"status": 2,
"permission": 3
}
- 如果該值後續不用於計算,則始終返回基於字串的枚舉。
OpenAPI示例
yaml
openapi: 3.0.0
info:
title: 角色API
version: 1.0.0
paths:
/roles:
get:
summary: 獲取角色
responses:
'200':
description: 角色列表
content:
application/json:
schema:
type: array
items:
type: object
properties:
role:
type: string
enum:
- GROUP_ADMINISTRATOR
- USER
- MODERATOR
example: GROUP_ADMINISTRATOR
status:
type: string
enum:
- ACTIVE
- INACTIVE
- SUSPENDED
example: ACTIVE
post:
summary: 創建角色
requestBody:
content:
application/json:
schema:
type: object
properties:
role:
type: string
enum:
- GROUP_ADMINISTRATOR
- USER
- MODERATOR
example: GROUP_ADMINISTRATOR
status:
type: string
enum:
- ACTIVE
- INACTIVE
example: ACTIVE
responses:
'201':
description: 角色已創建
相關ADPs
- [ADP-401] HTTP問題基礎
- [ADP-42] API生命週期管理
- [ADP-701] 屬性設計
參考資料
- https://api.otto.de/portal/guidelines/r004090
- https://opensource.zalando.com/restful-api-guidelines/#240
- RFC 8259: JavaScript對象表示法(JSON)數據交換格式
Changelog
2024.11.11
: Add self-explanatory to enum value.