- PUT: thay thế toàn bộ representation của resource bằng payload gửi lên (RFC 9110). Field không gửi coi như bị xóa/reset — client phải gửi bản đầy đủ.
- PATCH: cập nhật một phần — chỉ gửi những field muốn đổi (RFC 5789).
PUT /users/1 { "name": "An", "email": "an@x.vn", "phone": null }
PATCH /users/1 { "phone": "0901234567" }Idempotency:
- PUT idempotent theo spec: gửi cùng payload 1 lần hay 10 lần, trạng thái cuối như nhau (cùng một bản thay thế) → client/proxy retry an toàn khi timeout.
- PATCH không được spec đảm bảo idempotent — tùy nội dung patch. Patch kiểu "set field = value" (JSON merge patch) lặp lại vô hại; nhưng patch dạng thao tác tương đối ("tăng số dư thêm 10", "chèn phần tử vào mảng") lặp lại là sai kết quả → retry PATCH cần điều kiện If-Match/ETag hoặc idempotency key.
Chọn trong thực tế: đa số API "update" chỉ sửa vài field → PATCH đúng ngữ nghĩa hơn; PUT hợp khi client sở hữu toàn bộ representation (editor lưu cả document, upload object lên key cố định).
Bẫy hay gặp: endpoint đặt tên PUT nhưng implement kiểu partial (field thiếu được giữ nguyên) — sai spec, client khác team hiểu nhầm là bản thay thế đầy đủ.