# Tham Khảo Nhanh Mã Trạng Thái HTTP

*Mã trạng thái, headers, và các mẫu response phổ biến*

> Source: HTTP/1.1 Specification (RFC 9110) · MIT

## Thông Tin 1xx

### Mã 1xx

| Command | Description |
|---------|-------------|
| `100` | Continue — server nhận headers, client nên gửi body |
| `101` | Switching Protocols — nâng cấp lên WebSocket hoặc HTTP/2 |
| `102` | Processing — server nhận request, vẫn đang xử lý (WebDAV) |
| `103` | Early Hints — preload tài nguyên trước response cuối |

### Ghi Chú Sử Dụng

```
# 100 Continue: client sends Expect header, waits for 100
curl -H "Expect: 100-continue" -d @large.json URL
# 101: upgrade to WebSocket
Connection: Upgrade / Upgrade: websocket
```

## Thành Công 2xx

### Mã 2xx

| Command | Description |
|---------|-------------|
| `200` | OK — response thành công tiêu chuẩn |
| `201` | Created — tài nguyên tạo thành công (POST/PUT) |
| `202` | Accepted — nhận request, đang xử lý bất đồng bộ |
| `203` | Non-Authoritative Info — đã biến đổi bởi proxy |
| `204` | No Content — thành công nhưng không có body (DELETE) |
| `205` | Reset Content — thành công, client nên reset form |
| `206` | Partial Content — đã đáp ứng range request |
| `207` | Multi-Status — nhiều mã trạng thái (WebDAV) |

### Sử Dụng REST API

| Command | Description |
|---------|-------------|
| `GET → 200` | Trả về tài nguyên kèm body |
| `POST → 201` | Tài nguyên đã tạo, thêm Location header |
| `PUT → 200/204` | Đã cập nhật tài nguyên (có/không có body) |
| `DELETE → 204` | Đã xóa, không có body trả về |
| `PATCH → 200` | Cập nhật một phần, trả về tài nguyên đã sửa đổi |

## Chuyển Hướng 3xx

### Mã 3xx

| Command | Description |
|---------|-------------|
| `300` | Multiple Choices — có nhiều biểu diễn khả dụng |
| `301` | Moved Permanently — tài nguyên đã chuyển, cập nhật bookmark |
| `302` | Found — redirect tạm thời (thường bị dùng sai thay 303) |
| `303` | See Other — redirect bằng GET sau POST |
| `304` | Not Modified — dùng phiên bản cache (ETag/If-Modified) |
| `307` | Temporary Redirect — cùng method, vị trí tạm thời |
| `308` | Permanent Redirect — cùng method, vị trí vĩnh viễn |

### Hành Vi Redirect

| Command | Description |
|---------|-------------|
| `301/308` | Vĩnh viễn — search engine cập nhật index |
| `302/307` | Tạm thời — URL gốc vẫn là canonical |
| `301/302` | Có thể đổi method thành GET khi redirect |
| `307/308` | Phải giữ nguyên method HTTP gốc |

## Lỗi Client 4xx

### Lỗi Client Phổ Biến

| Command | Description |
|---------|-------------|
| `400` | Bad Request — cú pháp sai hoặc tham số không hợp lệ |
| `401` | Unauthorized — cần hoặc thất bại xác thực |
| `403` | Forbidden — đã xác thực nhưng không được phép |
| `404` | Not Found — tài nguyên không tồn tại |
| `405` | Method Not Allowed — method HTTP không được hỗ trợ |
| `406` | Not Acceptable — không thể đáp ứng Accept header |
| `408` | Request Timeout — client quá chậm để gửi request |
| `409` | Conflict — request xung đột với trạng thái hiện tại |

### Thêm Lỗi Client

| Command | Description |
|---------|-------------|
| `410` | Gone — tài nguyên bị xóa vĩnh viễn (không chỉ thiếu) |
| `411` | Length Required — thiếu Content-Length header |
| `412` | Precondition Failed — If-Match/If-Unmodified thất bại |
| `413` | Content Too Large — body request vượt giới hạn |
| `414` | URI Too Long — URL vượt giới hạn server |
| `415` | Unsupported Media Type — Content-Type không được chấp nhận |
| `422` | Unprocessable Content — cú pháp hợp lệ, lỗi ngữ nghĩa |
| `429` | Too Many Requests — vượt giới hạn tần suất |

## Lỗi Server 5xx

### Mã 5xx

| Command | Description |
|---------|-------------|
| `500` | Internal Server Error — exception chưa xử lý trên server |
| `501` | Not Implemented — server không hỗ trợ method |
| `502` | Bad Gateway — upstream server gửi response không hợp lệ |
| `503` | Service Unavailable — quá tải hoặc đang bảo trì |
| `504` | Gateway Timeout — upstream server không phản hồi kịp thời |
| `505` | HTTP Version Not Supported — phiên bản không được xử lý |
| `507` | Insufficient Storage — server không thể lưu request (WebDAV) |
| `511` | Network Auth Required — cần đăng nhập captive portal |

### Chiến Lược Retry

| Command | Description |
|---------|-------------|
| `500` | Retry với backoff; có thể tạm thời |
| `502/504` | Retry — sự cố upstream có thể tự giải quyết |
| `503` | Kiểm tra Retry-After header trước khi retry |
| `501/505` | Không retry — sửa request phía client |

## Mã Thường Dùng

### Mã Dùng Nhiều Nhất (tóm tắt)

| Command | Description |
|---------|-------------|
| `200` | OK — mọi thứ hoạt động |
| `201` | Created — tài nguyên mới đã tạo |
| `204` | No Content — thành công, body rỗng |
| `301` | Moved Permanently — cập nhật URL |
| `304` | Not Modified — dùng cache |
| `400` | Bad Request — sửa request của bạn |
| `401` | Unauthorized — đăng nhập trước |
| `403` | Forbidden — không đủ quyền |
| `404` | Not Found — URL sai hoặc đã xóa |
| `422` | Unprocessable — lỗi validation |
| `429` | Too Many Requests — chậm lại |
| `500` | Server Error — không phải lỗi của bạn |
| `502` | Bad Gateway — lỗi proxy/upstream |
| `503` | Unavailable — thử lại sau |

## Tham Khảo Headers

### Request Headers

| Command | Description |
|---------|-------------|
| `Accept` | Loại media response mong muốn (vd: application/json) |
| `Authorization` | Thông tin xác thực (Bearer token, Basic base64) |
| `Content-Type` | Loại media của body request |
| `If-None-Match` | Có điều kiện: ETag cho xác thực cache |
| `If-Modified-Since` | Có điều kiện: ngày cho xác thực cache |
| `Cache-Control` | Chỉ thị caching (no-cache, max-age) |
| `User-Agent` | Chuỗi nhận dạng client |

### Response Headers

| Command | Description |
|---------|-------------|
| `Content-Type` | Loại media của body response |
| `Location` | URL đích redirect hoặc tài nguyên vừa tạo |
| `ETag` | Entity tag cho xác thực cache |
| `Cache-Control` | Chỉ thị caching (max-age, no-store) |
| `Retry-After` | Thời gian chờ trước khi retry (429/503) |
| `WWW-Authenticate` | Scheme xác thực cần thiết (gửi kèm 401) |
| `Set-Cookie` | Đặt cookie trên client |

## Mẫu Phổ Biến

### Luồng Caching

```
# First request — server returns ETag
GET /api/data → 200, ETag: "abc123"
# Subsequent request — conditional
GET /api/data, If-None-Match: "abc123"
→ 304 Not Modified (use cache)
```

### Luồng Xác Thực

```
# Unauthenticated request
GET /api/secret → 401, WWW-Authenticate: Bearer
# With token
GET /api/secret, Authorization: Bearer <token>
→ 200 OK
```

### Giới Hạn Tần Suất

```
# Rate limited response
429 Too Many Requests
Retry-After: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1700000000
```

### Thương Lượng Nội Dung

```
# Client prefers JSON, accepts XML
Accept: application/json, application/xml;q=0.9
# Server can't satisfy → 406 Not Acceptable
# Server returns best match → 200 + Content-Type
```
