🚦 HTTP 狀態碼
📖 定義
HTTP 狀態碼是一個三位數字,用於告訴客戶端伺服器如何處理其請求。根據第一位數字,它分為五個組別。
🎯 用比喻來理解
餐廳訂單系統
2xx (成功) = "您的餐點已備妥!"
├─ 200: 餐點完成,立即享用
├─ 201: 新菜單已成功登記
└─ 204: 餐具已收拾 (桌面已整理)
3xx (重新導向) = "讓我帶您到別處"
├─ 301: 餐廳已永久遷移
├─ 302: 暫時在其他地方供餐
└─ 304: 不需要重新上菜 (已上過的餐)
4xx (客戶端錯誤) = "這是您的問題"
├─ 400: 無法理解您的訂單
├─ 401: 僅限會員訂餐
├─ 403: 此菜單不可訂購
├─ 404: 查無此菜單
└─ 429: 您訂單太多了
5xx (伺服器錯誤) = "這是我們的錯"
├─ 500: 廚房出問題了
├─ 502: 無法連接廚房
├─ 503: 現在太忙,無法接受訂單
└─ 504: 廚房回應太慢
💡 狀態碼群組
┌─────┬─────────────┬────────────────────┐
│ 代碼│ 分類 │ 意義 │
├─────┼─────────────┼────────────────────┤
│ 1xx │ 資訊 │ 處理中的請求 │
│ 2xx │ 成功 │ 請求成功 │
│ 3xx │ 重新導向 │ 需要額外操作 │
│ 4xx │ 客戶端 │ 客戶端錯誤 │
│ 5xx │ 伺服器錯誤 │ 伺服器錯誤 │
└─────┴─────────────┴────────────────────┘
✅ 2xx - 成功
200 OK
最常見的成功回應
請求:
GET /api/users/123 HTTP/1.1
回應:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "王小明",
"email": "wang@example.com"
}
fetch('https://api.example.com/users/123')
.then(response => {
if (response.status === 200) {
return response.json();
}
})
.then(data => console.log(data));
使用場景:
- GET 請求成功
- PUT、PATCH 請求成功
- 所有包含資料的成功回應
201 Created
成功建立新資源
請求:
POST /api/users HTTP/1.1
Content-Type: application/json
{
"name": "王小明",
"email": "wang@example.com"
}
回應:
HTTP/1.1 201 Created
Location: /api/users/123
Content-Type: application/json
{
"id": 123,
"name": "王小明",
"email": "wang@example.com"
}
fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: '王小明',
email: 'wang@example.com'
})
})
.then(response => {
if (response.status === 201) {
console.log('使用者建立成功!');
// 在 Location 標頭中查看新資源 URL
console.log(response.headers.get('Location'));
return response.json();
}
});
204 No Content
成功,但沒有要傳回的內容
請求:
DELETE /api/users/123 HTTP/1.1
回應:
HTTP/1.1 204 No Content
fetch('https://api.example.com/users/123', {
method: 'DELETE'
})
.then(response => {
if (response.status === 204) {
console.log('刪除成功!');
// 沒有回應主體
}
});
使用場景:
- DELETE 請求成功
- PUT、PATCH 後無回傳資料時
- 作業成功,但無需傳送資料給客戶端