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

Method และ Status Code

คำศัพท์เล็ก ๆ สองชุดทำงานส่วนใหญ่ใน REST API นั่นคือ HTTP method ไม่กี่ตัวที่บอกเจตนา และ status code ที่รายงานผลลัพธ์ เรียนรู้สองสิ่งนี้ให้ดีแล้วการตัดสินใจด้านการออกแบบส่วนใหญ่จะง่ายขึ้น

MethodความหมายSafeIdempotent
GETอ่าน resourceyesyes
HEADอ่านเฉพาะ headeryesyes
POSTสร้าง / ส่งข้อมูลnono
PUTแทนที่ resourcenoyes
PATCHอัปเดตบางส่วนnono
DELETEลบ resourcenoyes
OPTIONSอธิบายว่าทำอะไรได้บ้างyesyes

Safe หมายถึงการเรียกนั้นไม่มี side effect ที่สังเกตได้ คืออ่านอย่างเดียว ส่วน idempotent หมายถึงเรียกซ้ำหลายครั้งได้ผลเท่ากับเรียกครั้งเดียว สองคุณสมบัตินี้เป็นตัวกำหนดความถูกต้องอยู่มาก เพราะ client และ proxy จะ retry request ที่ safe/idempotent ได้อย่างอิสระ แต่ต้องระวังเป็นพิเศษเวลาจะ retry POST

flowchart TD
  R[Response status] --> I[1xx Informational]
  R --> S[2xx Success]
  R --> RD[3xx Redirection]
  R --> C[4xx Client error]
  R --> SE[5xx Server error]
  S --> S2[200 OK / 201 Created / 204 No Content]
  C --> C2[400 / 401 / 403 / 404 / 409 / 422]
  SE --> SE2[500 / 503]
ห้าตระกูล; ในทางปฏิบัติคุณใช้เพียงส่วนย่อยเล็ก ๆ เท่านั้น

ตัวที่คุณใช้อยู่ตลอด: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 500 Internal Server Error กฎทองคือ 2xx หมายถึง request สำเร็จ 4xx หมายถึง client ต้องเปลี่ยนแปลงอะไรบางอย่าง และ 5xx หมายถึง server ทำงานล้มเหลว

แอป Hono ตัวนี้เปิดสาม route ที่คืน method และ status ต่างกัน ลองเปิดใน StackBlitz เพื่อรัน server จริงแล้วยิงเข้า endpoint ดู:

JavaScript
HTTP MethodIntentIdempotent?
GETอ่านข้อมูล✅ ใช่
POSTสร้าง resource ใหม่❌ ไม่ใช่
PUTแทนที่ resource ทั้งหมด✅ ใช่
PATCHแก้ไขบางส่วนอาจใช่
DELETEลบ resource✅ ใช่

ใช้ POST สำหรับทุก operation อาการ:

  • POST /getUser, POST /updateUser, POST /deleteUser
  • ไม่มีวิธีรู้ว่า request ทำอะไรโดยไม่อ่าน body
  • ใช้ method ที่ตรงกับ intent: GET อ่าน, DELETE ลบ, PATCH แก้

Return 200 แม้เกิด Error อาการ:

  • { "status": "error", "message": "Not found" } พร้อม HTTP 200
  • monitoring tool คิดว่า request สำเร็จ — alert ไม่ทำงาน
  • ใช้ status code ที่ถูกต้อง: 404 เมื่อไม่พบ, 400 เมื่อ request ผิด

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

GitHub API:

  • GET /repos/{owner}/{repo} — อ่านข้อมูล repo
  • DELETE /repos/{owner}/{repo} — ลบ repo
  • PATCH /repos/{owner}/{repo} — แก้ไข repo settings
  • method บอก intent ทันที โดยไม่ต้องอ่าน URL

Stripe API:

  • POST /charges — สร้าง charge ใหม่
  • GET /charges/{id} — ดู charge
  • status code ครบ: 200, 201, 400, 401, 402, 404, 429, 500
คุณสมบัติใดที่หมายถึง "การเรียกหลายครั้งให้ผลเหมือนกับเรียกครั้งเดียว"?
status code แบบ 4xx บ่งบอกถึงอะไร?
method ใดที่ไม่ใช่ idempotent?
status ใดที่เหมาะสมที่สุดกับการสร้าง resource สำเร็จ?