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

การเลือก Status Code

status code เพียงไม่กี่ตัวครอบคลุมเกือบทุกกรณี ความเชี่ยวชาญอยู่ที่กรณีใกล้เคียงกัน — คู่ที่สับสนได้ง่าย

  • 200 OK — สำเร็จพร้อม body
  • 201 Created — มีการสร้าง resource ขึ้น; ใส่ header Location ไปด้วย
  • 204 No Content — สำเร็จ ไม่มีอะไรต้องส่งกลับ (เช่น DELETE)
  • 400 Bad Request — request ผิดรูปแบบ (JSON เสีย, ขาดส่วนที่จำเป็น)
  • 401 Unauthorized — ไม่มี/credential ไม่ถูกต้อง; client ต้อง authenticate
  • 403 Forbidden — authenticate แล้ว แต่ไม่มีสิทธิ์
  • 404 Not Found — ไม่มี resource ดังกล่าว
  • 409 Conflict — request ขัดแย้งกับสถานะปัจจุบัน (ซ้ำ, version ชนกัน)
  • 422 Unprocessable Entity — ถูกต้องตาม syntax แต่ผิดความหมาย (validation ไม่ผ่าน)
  • 429 Too Many Requests — ถูกจำกัด rate
  • 500 Internal Server Error / 503 Service Unavailable — server ล้มเหลว
  • 200 vs 201 vs 204 — ส่ง body กลับ → 200; สร้าง resource → 201; ไม่มีอะไรจะบอก → 204
  • 400 vs 422 — server แม้แต่ parse request ได้หรือไม่? parse ไม่ได้ → 400; parse ได้ดีแต่ค่าไม่ถูกต้อง → 422
  • 401 vs 403 — เรารู้หรือไม่ว่าคุณเป็นใคร? ยังไม่ได้ authenticate → 401; authenticate แล้วแต่ไม่ได้รับอนุญาต → 403
  • 404 vs 409 — ไม่มี resource นั้นอยู่ → 404; มีอยู่แต่ request ขัดแย้งกับสถานะปัจจุบันของ resource → 409
JavaScript
Status Rangeความหมายตัวอย่าง
2xxสำเร็จ200 OK, 201 Created, 204 No Content
3xxRedirect301 Moved, 304 Not Modified
4xxClient error400 Bad Request, 401, 403, 404, 409, 422, 429
5xxServer error500 Internal, 503 Service Unavailable

Return 200 พร้อม Error ใน Body อาการ:

  • HTTP 200 OK พร้อม { "success": false, "error": "Not found" }
  • monitoring ที่ดู HTTP status คิดว่า request สำเร็จ
  • alert และ SLA measurement ผิดพลาด
  • ใช้ status code ที่ถูกต้อง: 404 ไม่ใช่ 200

ใช้ 500 สำหรับ Client Error อาการ:

  • validation ผิด → server throw exception → return 500
  • client ไม่รู้ว่า request ของตัวเองผิด หรือ server มีปัญหา
  • ต้อง catch validation error ก่อน → return 400 หรือ 422

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

GitHub API:

  • 422 Unprocessable Entity สำหรับ validation error — field ผิด rule
  • 409 Conflict สำหรับ duplicate resource
  • 403 Forbidden สำหรับ action ที่ไม่มีสิทธิ์ (ต่างจาก 401 ที่ยังไม่ authenticate)

Stripe API:

  • status code ครบ: 400 invalid request, 401 auth failed, 402 payment failed, 429 rate limit
  • HTTP status code map ตรงกับ error type เสมอ
request body เป็น JSON ที่ถูกต้องแต่ขาด field ที่จำเป็น code ที่ดีที่สุดคือ?
ผู้เรียก authenticate แล้วแต่ไม่มีสิทธิ์ ควรใช้ code ใด?
request สร้างของซ้ำกับ resource ที่มีอยู่แล้ว code ใดเหมาะสม?