PUT, PATCH & DELETE
สาม method นี้ครอบคลุมส่วน “U” และ “D” ของ CRUD จุดที่ละเอียดอ่อนคือความแตกต่างระหว่าง PUT และ PATCH — ทำให้ถูกต้องแล้วการอัปเดตจะคาดเดาได้เสมอ
PUT — การแทนที่ทั้งหมด
หัวข้อที่มีชื่อว่า “PUT — การแทนที่ทั้งหมด”PUT แทนที่ resource ที่ URI หนึ่งด้วย representation ที่อยู่ใน body ให้ส่ง resource ทั้งหมด ไป field ไหนที่คุณละไว้ ในเชิงความหมายคือสั่งล้างค่าทิ้ง และเพราะ PUT body เดิมสองครั้งได้ผลเท่ากับทำครั้งเดียว PUT จึงเป็น idempotent
PUT /articles/42 HTTP/1.1Content-Type: application/json
{ "title": "Updated title", "body": "Full new body" }PATCH — การอัปเดตบางส่วน
หัวข้อที่มีชื่อว่า “PATCH — การอัปเดตบางส่วน”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 — การลบ
หัวข้อที่มีชื่อว่า “DELETE — การลบ”DELETE ลบ resource ออก และเป็น idempotent เพราะสั่งลบของที่ลบไปแล้ว ผลลัพธ์ก็ยังคือถูกลบอยู่ดี ให้คืน 204 No Content (หรือ 200 OK พร้อม body) เมื่อสำเร็จ ส่วน DELETE ครั้งที่สองอาจคืน 204 หรือ 404 ขึ้นอยู่กับนโยบายของคุณ — เลือกอย่างใดอย่างหนึ่งและทำให้สม่ำเสมอ
การอัปเดตใน API ที่กำลังทำงานจริง
หัวข้อที่มีชื่อว่า “การอัปเดตใน API ที่กำลังทำงานจริง”| 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 ของ repoDELETE /repos/\{owner\}/\{repo\}— ลบ repo (idempotent — 404 ครั้งที่สอง)Stripe API:
- PATCH สำหรับ update customer info
- ไม่มี true DELETE สำหรับ charge — ใช้ refund แทน (audit trail)