Appearance
HTTP Methods & Idempotency
Mỗi HTTP method mang một ý nghĩa ngữ nghĩa cố định — dùng sai method là phá vỡ hợp đồng ngầm giữa API và mọi client/proxy/cache đang dựa vào chuẩn HTTP.
Bảng ý nghĩa từng method
| Method | Ý nghĩa | Safe? | Idempotent? |
|---|---|---|---|
GET | Đọc dữ liệu, không thay đổi trạng thái server | Có | Có |
POST | Tạo mới resource (hoặc hành động không idempotent khác) | Không | Không |
PUT | Thay thế toàn bộ resource | Không | Có |
PATCH | Cập nhật một phần resource | Không | Tuỳ cách implement |
DELETE | Xoá resource | Không | Có (xoá lần 2 vẫn cho cùng kết quả: resource không còn tồn tại) |
- Safe = không làm thay đổi trạng thái dữ liệu trên server (chỉ đọc). Nhờ vậy
GETan toàn để cache, để prefetch, để crawler tự động gọi mà không sợ gây tác dụng phụ. - Idempotent = gọi lại nhiều lần với cùng input cho ra cùng kết quả cuối cùng, dù server có thể xử lý nhiều lần.
PUTthay thế toàn bộ resource nên gọi 10 lần cũng ra kết quả giống gọi 1 lần.POSTthường không idempotent — gọiPOST /orders2 lần thường tạo ra 2 đơn hàng khác nhau.
Idempotency key — khi cần POST "an toàn khi retry"
Trong thực tế (đặc biệt khi có AI agent hoặc mobile app tự động retry lúc mất mạng), việc gọi POST không idempotent nhiều lần có thể tạo dữ liệu trùng (ví dụ đặt hàng 2 lần vì client retry request bị timeout). Giải pháp phổ biến: client gửi kèm 1 Idempotency-Key (chuỗi ngẫu nhiên duy nhất cho mỗi thao tác) trong header; server lưu lại key này cùng kết quả lần xử lý đầu tiên — nếu nhận lại đúng key đó, trả về kết quả cũ thay vì xử lý lại từ đầu.
Ghi chú 2026: HTTP QUERY method mới
RFC 10008 (công bố 06/2026) chuẩn hoá method QUERY — cho phép đọc dữ liệu an toàn (safe), cache được nhưng vẫn gửi kèm body phức tạp (điều mà GET không hỗ trợ tốt vì spec HTTP truyền thống không khuyến khích body trong GET). Hữu ích cho các API cần query phức tạp (nhiều điều kiện lọc) mà vẫn muốn giữ ngữ nghĩa "an toàn, cache được" thay vì phải dùng POST (không cache được, không an toàn) chỉ vì cần gửi body.