Status Code ของ response
5 family ของ status code (1xx-5xx) + code ที่เจอบ่อย (200/201/301/400/401/403/404/500/503) รู้ว่าเห็นเลขไหนแล้วควรทำยังไงต่อ
บทที่ 4 เราดู method ที่ client ใช้บอก server ว่าจะทำอะไร พอ server ทำงานเสร็จมันต้องตอบกลับว่า ผลเป็นยังไงบรรทัดแรกของ response มีเลข 3 หลักที่เรียกว่า status codeซึ่งบอกทุกอย่างที่ client ต้องรู้ในเลขเดียว
Status code คืออะไร
- เลข 3 หลักในบรรทัดแรกของทุก response เช่น
200,404,500 - บอกว่าการขอรอบนี้ สำเร็จ หรือ พลาด และพลาดเพราะอะไร
- มาพร้อม reason phrase คำอธิบายสั้นๆ เช่น
OK,Not Found,Internal Server Error - เป็นมาตรฐานเดียวกันทั่วโลก client ทุกตัวเข้าใจความหมายเหมือนกัน
Mental model: สีไฟจราจร
เวลาเห็นไฟเขียว/เหลือง/แดง เรารู้ทันทีว่าขับรถต่อได้ ระวัง หรือต้องหยุด status code ก็เหมือนกัน ดูหลักแรกก็รู้ทิศทางก่อนอ่านรายละเอียด
- 2xx เขียว ผ่าน
- 3xx เหลือง ต้องเปลี่ยนทาง
- 4xx แดง client ทำอะไรผิด
- 5xx แดงเข้ม server มีปัญหา
5 family ของ status code
- 200OKGET /menu ดูสำเร็จ
- 201CreatedPOST /orders สร้าง order ใหม่สำเร็จ
- 204No ContentDELETE /orders/123 ลบแล้ว ไม่ต้องส่งอะไรกลับ
1xx Informational (กำลังดำเนินการ)
- บอกว่า server รับ request แล้ว กำลังทำอยู่ ยังไม่เสร็จ
- ใช้น้อยมากในงานปกติ client แทบไม่ต้องรู้
- ตัวอย่าง:
100 Continue(ส่ง body ต่อได้)
2xx Success (สำเร็จ)
200 OKสำเร็จแบบปกติ (ใช้กับ GET ส่วนใหญ่)201 Createdสร้าง resource ใหม่สำเร็จ (ตอบหลัง POST)204 No Contentสำเร็จ แต่ไม่มีอะไรให้ส่งกลับ (ตอบหลัง DELETE)
3xx Redirection (ย้ายที่)
301 Moved PermanentlyURL ย้ายถาวร search engine จะ update index302 Foundย้ายชั่วคราว (ใช้ทำ redirect หลัง login)304 Not Modifiedเนื้อหาไม่ได้เปลี่ยน client ใช้ cache ที่มีอยู่ได้
4xx Client Error (client ทำผิด)
400 Bad Requestrequest ส่งมาไม่ถูก (JSON พัง, field ขาด)401 Unauthorizedยังไม่ได้ login หรือ token หมดอายุ403 Forbiddenlogin แล้วแต่ไม่มีสิทธิ์ใน resource นี้404 Not Foundหาไม่เจอ resource ที่ขอ409 Conflictชนกับ state เดิม เช่น username ซ้ำ429 Too Many Requestsส่ง request บ่อยเกิน server ห้ามสักพัก
5xx Server Error (server พัง)
500 Internal Server Errorserver มี bug ตอบไม่ได้502 Bad Gatewayserver ตัวกลาง (reverse proxy) รับของไม่ดีจาก server ปลายทาง503 Service Unavailableserver ล่มหรือ overload ชั่วคราว504 Gateway Timeoutserver ตัวกลางรอ server ปลายทางเกินเวลา
ตัวอย่างจากแอพกาแฟ
แต่ละ action ที่แอพกาแฟทำได้ มี status ที่เป็นไปได้หลายแบบ
GET /menu→200 OK(ดูสำเร็จ)POST /ordersสำเร็จ →201 CreatedPOST /ordersพร้อม JSON พัง →400 Bad RequestPOST /ordersไม่ได้ login →401 UnauthorizedGET /orders/99999(ไม่มี order นี้) →404 Not FoundDELETE /orders/123(order ของคนอื่น) →403 ForbiddenDELETE /orders/123ของตัวเอง →204 No ContentPOST /ordersช่วง server พัง →500 Internal Server Error
ลองเดา status code ดู
ทำไมต้องแยก 4xx กับ 5xx
ความต่างนี้สำคัญมาก เพราะต้องตัดสินใจต่างกันเวลาเขียน code หรือ operate ระบบ
- 4xx ผิดที่ client retry ด้วย request เดิมก็ยังได้ error เดิม client ต้องแก้ request (เช่น login ก่อน, แก้ JSON, ใช้ URL ถูก)
- 5xx ผิดที่ server request อาจถูกอยู่ server ไม่พร้อม retry อีกสักครู่อาจผ่าน (โดยเฉพาะ 502, 503, 504)
ระบบที่ดีจะ alert ทีม dev เมื่อเจอ 5xx บ่อยๆ เพราะแปลว่า server มีปัญหา ส่วน 4xx อาจเป็นเรื่องปกติของผู้ใช้ใช้ผิด
คำศัพท์จากบทนี้
- Status code เลข 3 หลักใน response บอกผลการขอ
- Reason phrase คำอธิบายสั้นของ status (OK, Not Found)
- Status family กลุ่ม 1xx/2xx/3xx/4xx/5xx
- Client error (4xx) ผิดที่ผู้ขอ
- Server error (5xx) ผิดที่ server
- Redirect (3xx) ไปที่ URL อื่นแทน
สรุป
- Status code = เลข 3 หลัก บอกผลการขอ
- 5 family: 1xx info, 2xx success, 3xx redirect, 4xx client error, 5xx server error
- Code ที่เจอบ่อยที่สุด: 200, 201, 204, 301, 302, 400, 401, 403, 404, 500, 503
- 4xx = client ผิด ต้องแก้ request 5xx = server ผิด retry อาจช่วย
- 200 + error ใน body เป็น anti-pattern ระวัง API แบบนี้
ตอนนี้รู้แล้วว่า request พูดว่าจะทำอะไร (method) response พูดว่าผลเป็นยังไง (status) แต่ทั้ง 2 ฝั่งยังมี “ข้อมูลประกอบ” อีกหลายบรรทัดที่เราเห็นใน message structure บท 3 บรรทัดเหล่านั้นคือ Headers ที่เป็น metadata สำคัญของ HTTP บทถัดไปจะเจาะ header ที่ใช้บ่อยและทำไมต้องแยกออกจาก body