2024-10-09 restAPI設計標準
REST(Representational State Transfer)是一種常用的軟體架構風格,專門用來設計基於網絡的應用程序(通常是 Web API)。REST API 的設計標準包括一些最佳實踐和原則,用來確保 API 的結構清晰、一致、易於使用和擴展。以下是 REST API 設計中的核心標準和最佳實踐:
1. 使用 HTTP 方法
REST API 基於 HTTP 協議,因此需要遵循 HTTP 方法來表達不同的操作,這有助於使 API 更符合 HTTP 協議的語義。
- GET:用於查詢資源。只讀操作,應該是無副作用的。
- 例如:
GET /api/packages
查詢所有包裹。
- 例如:
- POST:用於創建資源。一般會創建一個新的資源並返回其詳細信息。
- 例如:
POST /api/packages
創建一個新的包裹。
- 例如:
- PUT:用於更新資源。替換或更新現有的資源。
- 例如:
PUT /api/packages/123
更新包裹123
的信息。
- 例如:
- PATCH:用於部分更新資源。只更新資源的部分屬性。
- 例如:
PATCH /api/packages/123
部分更新包裹123
。
- 例如:
- DELETE:用於刪除資源。
- 例如:
DELETE /api/packages/123
刪除包裹123
。
- 例如:
2. 資源的標識與命名(URI)
在 REST API 中,資源是通過 URI(Uniform Resource Identifier)來標識的。設計好的 URI 是清晰、可理解的,並且表達了資源的含義。
- URI 結構:
- 資源應使用名詞來表示,而不是動詞。例如,使用
/packages
而不是/getPackages
。 - 資源標識應遵循層級結構。例如,包裹的項目可能是
/packages/123/items
。
- 資源應使用名詞來表示,而不是動詞。例如,使用
- 良好的 URI 設計例子:
GET /api/users
:獲取所有用戶。GET /api/users/42
:獲取用戶 ID 為42
的詳細信息。POST /api/users
:創建一個新用戶。PUT /api/users/42
:更新用戶42
。
3. 使用合適的 HTTP 狀態碼
在 REST API 中,應用程序狀態是通過 HTTP 狀態碼來表示的。使用正確的 HTTP 狀態碼可以提高 API 的可用性和可讀性。
- 200 OK:請求成功,一般用於
GET
、PUT
、DELETE
等操作。 - 201 Created:資源創建成功,一般用於
POST
操作。 - 204 No Content:操作成功,但沒有需要返回的內容,一般用於
DELETE
操作。 - 400 Bad Request:請求無效,當請求參數錯誤時使用。
- 401 Unauthorized:未經授權,當請求需要身份驗證時使用。
- 403 Forbidden:已經授權,但沒有操作許可權。
- 404 Not Found:找不到資源,當請求的資源不存在時使用。
- 500 Internal Server Error:服務器錯誤,當服務器內部發生錯誤時使用。
4. 返回統一的數據格式(通常是 JSON)
- JSON 作為首選格式:大多數 REST API 使用 JSON 作為數據格式,因為它輕量且易於解析和讀取。
- 返回一致的結構:返回的數據應該保持一致的格式,這樣客戶端可以更容易地解析和使用。通常應包括狀態、消息、數據等,例如:
1
2
3
4
5
6
7
8{
"status": "success",
"data": {
"id": 123,
"name": "Package 1",
"status": "In Transit"
}
}
5. 版本控制
版本控制可以避免接口的突然更改影響到用戶,特別是在需要進行 API 更新時。
- 在 URI 中添加版本號:
- 例如:
/api/v1/packages
或/v2/users
。這樣可以確保向後兼容。
- 例如:
- 通過標頭版本控制(較少見,但也是可選方式):
- 可以通過自定義的 HTTP 標頭來傳遞版本信息,例如
Accept: application/vnd.myapi.v1+json
。
- 可以通過自定義的 HTTP 標頭來傳遞版本信息,例如
6. HATEOAS(Hypermedia as the Engine of Application State)
- HATEOAS 原則:這是一種為 API 客戶端提供可導航鏈接的方式,這些鏈接幫助客戶端了解可用的下一步操作。
- 例子:
- 在返回包裹信息時,還可以返回可導航的鏈接:
1
2
3
4
5
6
7
8{
"trackingNumber": "12345",
"status": "In Transit",
"_links": {
"self": { "href": "/api/packages/12345" },
"cancel": { "href": "/api/packages/12345/cancel" }
}
} - HATEOAS 的主要優勢在於增加了 API 的自描述性,讓客戶端知道應用程序的下一步操作。
- 在返回包裹信息時,還可以返回可導航的鏈接:
7. 遵循 REST 的無狀態性
- 無狀態性:每個請求應該包含所有必要的信息,以便服務器能夠理解並處理請求。服務器不應該保存客戶端的狀態。
- 好處:這樣的設計提高了系統的可伸縮性,因為每個請求可以獨立處理,而不需要了解前一個請求的上下文。
8. 使用合適的錯誤處理與錯誤消息
- 在發生錯誤時,應返回有意義的錯誤信息,幫助用戶了解發生了什麼。
- 例子:
1
2
3
4
5
6
7{
"type": "https://example.com/errors/invalid-data",
"title": "Invalid data provided",
"status": 400,
"detail": "The provided 'trackingNumber' is invalid.",
"instance": "/api/packages/123"
} - 提供錯誤細節:應包括
status
(狀態碼)、detail
(具體錯誤描述)等字段。
9. 安全性考慮
- 身份驗證:可以使用 OAuth2 或 JWT(JSON Web Token) 進行身份驗證。
- 授權控制:使用授權策略,確保只有合適的用戶可以訪問某些資源。
- HTTPS:所有的 API 請求應該通過 HTTPS 發送,以防止數據在傳輸過程中被竊取。
小結
- 使用適當的 HTTP 方法和狀態碼,保持語義化。
- URI 應該清晰且簡潔,代表資源。
- 返回統一的數據格式(通常是 JSON),保持數據結構一致。
- 使用版本控制 來管理 API 的演化。
- 遵循 REST 的無狀態性原則,每個請求應該是獨立的。
- 實施安全措施,如身份驗證和 HTTPS。
這些設計標準和最佳實踐可以幫助您創建一個清晰、一致、易於使用的 REST API。如果還有其他問題,隨時問我!