ข้ามไปยังเนื้อหา

PUT, PATCH & DELETE

สาม method นี้ครอบคลุมส่วน “U” และ “D” ของ CRUD จุดที่ละเอียดอ่อนคือความแตกต่างระหว่าง PUT และ PATCH — ทำให้ถูกต้องแล้วการอัปเดตจะคาดเดาได้เสมอ

PUT แทนที่ resource ที่ URI หนึ่งด้วย representation ที่อยู่ใน body ให้ส่ง resource ทั้งหมด ไป field ไหนที่คุณละไว้ ในเชิงความหมายคือสั่งล้างค่าทิ้ง และเพราะ PUT body เดิมสองครั้งได้ผลเท่ากับทำครั้งเดียว PUT จึงเป็น idempotent

PUT /articles/42 HTTP/1.1
Content-Type: application/json
{ "title": "Updated title", "body": "Full new body" }

PATCH ใช้การแก้ไขแบบ บางส่วน มีสองรูปแบบที่พบบ่อย:

  • JSON Merge Patch (application/merge-patch+json): ส่งเฉพาะ field ที่จะเปลี่ยน โดย null หมายถึง “ลบ field นี้ออก”
  • JSON Patch (application/json-patch+json): ส่ง array ของ operation ที่ระบุชัดเจน (add, remove, replace, …)

โดยทั่วไป PATCH ไม่รับประกันว่าจะ idempotent (operation อย่าง “ต่อท้ายลงใน list” ไม่ idempotent) แม้ว่า merge-patch หลายกรณีจะบังเอิญ idempotent ก็ตาม

DELETE ลบ resource ออก และเป็น idempotent เพราะสั่งลบของที่ลบไปแล้ว ผลลัพธ์ก็ยังคือถูกลบอยู่ดี ให้คืน 204 No Content (หรือ 200 OK พร้อม body) เมื่อสำเร็จ ส่วน DELETE ครั้งที่สองอาจคืน 204 หรือ 404 ขึ้นอยู่กับนโยบายของคุณ — เลือกอย่างใดอย่างหนึ่งและทำให้สม่ำเสมอ

JavaScript
Methodส่ง Body?Idempotent?ใช้เมื่อ
PUT✅ ทั้ง resourceแทนที่ resource ทั้งหมด
PATCH✅ เฉพาะที่แก้อาจใช่แก้บาง field
DELETEบางครั้งลบ resource

ใช้ PUT เพื่อ Partial Update อาการ:

  • PUT /users/\{id\} ส่งแค่ { "name": "New Name" } — field อื่น reset เป็น null
  • PUT ต้องส่ง resource ทั้งหมด — ขาด field = null/default
  • ใช้ PATCH สำหรับ partial update

DELETE ที่ไม่ Idempotent อาการ:

  • DELETE /users/\{id\} ครั้งแรก return 200, ครั้งที่สอง return 500 (server error)
  • ควร return 404 หรือ 204 ในครั้งที่สอง ไม่ใช่ 500
  • DELETE ที่ resource ไม่มีแล้วควร return 404 หรือ 204 สม่ำเสมอ

💡 ตัวอย่างจากของจริง

GitHub API:

  • PATCH /repos/\{owner\}/\{repo\} — แก้บาง setting ของ repo
  • DELETE /repos/\{owner\}/\{repo\} — ลบ repo (idempotent — 404 ครั้งที่สอง)

Stripe API:

  • PATCH สำหรับ update customer info
  • ไม่มี true DELETE สำหรับ charge — ใช้ refund แทน (audit trail)
PUT ทำอย่างไรกับ field ที่ไม่ได้ส่งมาใน request body?
ใน JSON Merge Patch การตั้ง field ให้เป็น null หมายความว่าอย่างไร?
ทำไม DELETE จึงถูกถือว่าเป็น idempotent?