- PUT = thay cả bản ghi: client phải gửi payload đầy đủ, field không gửi coi như bị xóa/reset (RFC 9110).
- PATCH = sửa một phần: chỉ gửi field cần đổi (RFC 5789).
http
PUT /users/1 { "name": "An", "email": "an@x.vn", "phone": null }
PATCH /users/1 { "phone": "0901234567" }Tính idempotent (gọi lại nhiều lần, trạng thái cuối không đổi):
- PUT idempotent theo spec → client/proxy retry an toàn khi timeout.
- PATCH thì tùy payload: "set field = giá trị" lặp lại vô hại, nhưng phép cộng dồn ("tăng số dư thêm 10", "chèn phần tử vào mảng") lặp lại là sai số → muốn retry an toàn phải kèm If-Match/ETag hoặc idempotency key.
Thực tế: API "update" đa số chỉ sửa vài field → PATCH đúng nghĩa hơn. Đặt tên endpoint là PUT nhưng xử lý kiểu partial là sai spec.