PUT thay thế toàn bộ resource bằng body gửi lên: field nào không có trong body được coi như bị xoá/đưa về mặc định. PATCH chỉ mô tả phần thay đổi.
PUT /users/7
{ "name": "An", "email": "an@ex.com", "phone": "0900" }
// thiếu phone trong lần PUT sau -> phone bị xoá
PATCH /users/7
Content-Type: application/merge-patch+json
{ "phone": null }
// chỉ đụng vào phoneHai định dạng PATCH phổ biến:
- JSON Merge Patch (application/merge-patch+json): body trông giống resource, giá trị null nghĩa là xoá field. Đơn giản, nhưng vì thế không thể set một field thành null và không sửa được phần tử trong mảng.
- JSON Patch (application/json-patch+json): mảng thao tác add / remove / replace / move / test, có path kiểu JSON Pointer. Diễn đạt được mọi thay đổi, kể cả trên mảng, nhưng body khó đọc hơn.
Lưu ý phỏng vấn hay hỏi: PUT idempotent, PATCH không đảm bảo idempotent (vd operation {"op":"add","path":"/tags/-","value":"vip"} gọi 2 lần thì thêm 2 tag). Thực tế nhiều API dùng PATCH với body merge và giữ nó idempotent — nhưng đó là lựa chọn thiết kế, không phải bảo đảm của giao thức.