Skip to content

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ĩaSafe?Idempotent?
GETĐọc dữ liệu, không thay đổi trạng thái serverCóCó
POSTTạo mới resource (hoặc hành động không idempotent khác)KhôngKhông
PUTThay thế toàn bộ resourceKhôngCó
PATCHCập nhật một phần resourceKhôngTuỳ cách implement
DELETEXoá resourceKhôngCó (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 GET an 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. PUT thay 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. POST thường không idempotent — gọi POST /orders 2 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.