[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-http-status-codes-explained-all--*":3,"academy-blog-faqs-kol6xjzoq7xwh4e-th":89,"academy-blog-translations-kol6xjzoq7xwh4e":114},{"data":4,"page":88,"perPage":88,"totalItems":88,"totalPages":88},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_l_url":11,"cover_image_m_url":12,"cover_image_path":13,"cover_image_s_url":14,"created":15,"created_by":16,"expand":17,"id":81,"keywords":82,"locale":51,"published_at":83,"scheduled_at":68,"school_blog":77,"short_description":84,"status":75,"title":85,"updated":86,"updated_by":87,"slug":78,"views":80},"ปกบทความ HTTP Status Code ภาพมาโครไฟสัญญาณแบบเก่าดวงสีเขียวและสีส้มแดงบนพื้นมืด พร้อมแถบสรุป 4 กลุ่ม 2xx สำเร็จ, 3xx ย้าย, 4xx ฝั่งผู้ขอผิด และ 5xx ฝั่งเซิร์ฟเวอร์พัง","sclblg987654321","school_blog_translations","\u003Cp>ลองนึกภาพว่าคุณกดปุ่มบนหน้าเว็บที่กำลังทำอยู่ แล้วข้อมูลที่ควรขึ้นกลับไม่ขึ้นมาสักบรรทัด สัญชาตญาณแรกคือเปิดโค้ดไล่หาจุดผิด แต่สิ่งที่ควรดูก่อนไม่ใช่โค้ดสักบรรทัด เป็นตัวเลขสามหลักตัวเดียวที่เซิร์ฟเวอร์ตอบกลับมา เพราะตัวเลขนั้นบอกได้ตั้งแต่วินาทีแรกว่าปัญหาอยู่ฝั่งไหน ถ้าขึ้นต้นด้วย 4 ให้กลับไปดูคำขอของเราเอง ถ้าขึ้นต้นด้วย 5 ต่อให้แก้โค้ดฝั่งหน้าเว็บทั้งคืนก็ไม่หาย\u003C\u002Fp>\u003Cp>วันนี้ Superdev Academy จะพาไปดูว่า HTTP Status Code มีอะไรบ้าง ตัวไหนที่มือใหม่เจอบ่อยจริงๆ วิธีแยก 401 กับ 403 และ 502 กับ 503 ที่คนสับสนกันเยอะ และวิธีเปิดดูตัวเลขนี้เองใน DevTools ของเบราว์เซอร์\u003C\u002Fp>\u003Ch2>ทำไมต้องอ่าน Status Code ก่อนอ่านโค้ด\u003C\u002Fh2>\u003Cp>ทุกครั้งที่เบราว์เซอร์หรือโค้ดของเราส่งคำขอ (Request) ไปหาเซิร์ฟเวอร์ เซิร์ฟเวอร์จะส่งคำตอบ (Response) กลับมาพร้อมรหัสสถานะ (Status Code) เป็นตัวเลขสามหลักเสมอ ถ้ายังไม่คุ้นกับภาพรวมของ Request และ Response ลองอ่าน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fwhat-is-api-beginners-guide\">API คืออะไร\u003C\u002Fa> ประกอบ แล้วค่อยกลับมาต่อที่นี่\u003C\u002Fp>\u003Cp>มาตรฐาน RFC 9110 ซึ่งเป็นเอกสารกำหนดความหมายของ HTTP เขียนไว้ชัดว่า ตัวเลขหลักแรกเป็นตัวบอกกลุ่มของคำตอบ ส่วนสองหลักหลังไม่มีหน้าที่จัดกลุ่มอะไรเลย และรหัสที่ถูกต้องทั้งหมดอยู่ในช่วง 100 ถึง 599 เท่านั้น นี่คือเหตุผลที่เราเริ่มจากหลักแรกก่อนเสมอ เพราะแค่หลักเดียวก็ตัดทางเลือกไปได้ครึ่งหนึ่งแล้ว\u003C\u002Fp>\u003Cp>ขั้นตอนนี้เป็นส่วนหนึ่งของนิสัยการแก้บั๊กที่ดี ถ้าอยากเห็นภาพใหญ่ว่าควรทำอะไรก่อนหลังตอนเจอบั๊ก อ่านต่อได้ที่ \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fwhat-do-you-do-first-when-debugging\">เวลาติด Bug คุณทำอะไรก่อน อ่าน Error, ค้น Google หรือถาม AI\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>HTTP Status Code มีอะไรบ้าง: 5 กลุ่มจากเลขตัวแรก\u003C\u002Fh2>\u003Cp>จำสั้นๆ แค่นี้: 2xx สำเร็จ \u002F 3xx ย้าย \u002F 4xx ฝั่งผู้ขอผิด \u002F 5xx ฝั่งเซิร์ฟเวอร์พัง ส่วน 1xx เป็นกลุ่มที่มือใหม่แทบไม่เคยเห็นเอง ตารางนี้สรุปความหมายของทั้ง 5 กลุ่มตาม RFC 9110\u003C\u002Fp>\u003Ctable style=\"min-width: 100px;\">\u003Ccolgroup>\u003Ccol style=\"min-width: 25px;\">\u003Ccol style=\"min-width: 25px;\">\u003Ccol style=\"min-width: 25px;\">\u003Ccol style=\"min-width: 25px;\">\u003C\u002Fcolgroup>\u003Ctbody>\u003Ctr>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>กลุ่ม\u003C\u002Fp>\u003C\u002Fth>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>ความหมายตาม RFC 9110\u003C\u002Fp>\u003C\u002Fth>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>ตัวที่เจอบ่อย\u003C\u002Fp>\u003C\u002Fth>\u003Cth colspan=\"1\" rowspan=\"1\">\u003Cp>ใครต้องแก้\u003C\u002Fp>\u003C\u002Fth>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>1xx\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ได้รับคำขอแล้ว กำลังดำเนินการต่อ\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>100\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ปกติไม่ต้องทำอะไร\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>2xx\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ได้รับ เข้าใจ และรับคำขอสำเร็จ\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>200, 201, 204\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ไม่มีอะไรต้องแก้\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>3xx\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ต้องทำอะไรเพิ่มอีกขั้นเพื่อให้คำขอสำเร็จ\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>301, 302, 304\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ส่วนใหญ่เบราว์เซอร์จัดการให้\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>4xx\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>คำขอมีรูปแบบผิด หรือทำตามไม่ได้\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>400, 401, 403, 404, 429\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ฝั่งที่ส่งคำขอ\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>5xx\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>เซิร์ฟเวอร์ทำคำขอที่ดูถูกต้องไม่สำเร็จ\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>500, 502, 503\u003C\u002Fp>\u003C\u002Ftd>\u003Ctd colspan=\"1\" rowspan=\"1\">\u003Cp>ฝั่งเซิร์ฟเวอร์\u003C\u002Fp>\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Cp>มีอีกกติกาหนึ่งที่มีประโยชน์มาก RFC 9110 บอกว่าโปรแกรมฝั่ง Client ไม่จำเป็นต้องรู้จักทุกรหัส แต่ต้องเข้าใจกลุ่มจากหลักแรก และถ้าเจอรหัสที่ไม่รู้จัก ให้ถือว่าเป็นรหัส x00 ของกลุ่มนั้น เอกสารยกตัวอย่างว่าถ้าได้รหัส 471 ซึ่งไม่มีใครรู้จัก ก็ให้ถือเหมือนได้ 400 เพราะหลักแรกบอกแล้วว่าคำขอของเรามีปัญหา พูดง่ายๆ คือ ต่อให้จำรหัสไม่ได้สักตัว แค่ดูหลักแรกก็เริ่มแก้ถูกทางแล้ว\u003C\u002Fp>\u003Cblockquote>\u003Cp>Fun Fact: ในหน้ารวม Status Code ของ MDN มีรหัส 418 I'm a teapot อยู่ด้วย มาจาก RFC 2324 ที่เขียนเป็นมุก April Fools เรื่องโปรโตคอลสั่งหม้อต้มกาแฟ ไม่ใช่รหัสที่ต้องใช้ในงานจริง\u003C\u002Fp>\u003C\u002Fblockquote>\u003Ch2>2xx และ 3xx: กลุ่มที่ส่วนใหญ่ไม่ต้องแก้อะไร\u003C\u002Fh2>\u003Cp>\u003Cstrong>200 OK\u003C\u002Fstrong> คือคำขอสำเร็จ ส่วนเนื้อหาที่ส่งกลับมาขึ้นอยู่กับ Method ที่ใช้ เช่น GET จะได้ข้อมูลของสิ่งที่ขอ เป็นรหัสที่เห็นบ่อยที่สุดเมื่อทุกอย่างปกติ\u003C\u002Fp>\u003Cp>\u003Cstrong>201 Created\u003C\u002Fstrong> คือคำขอสำเร็จ และมีข้อมูลใหม่ถูกสร้างขึ้น มักเจอหลังส่ง POST เพื่อสมัครสมาชิกหรือเพิ่มรายการใหม่ RFC 9110 ระบุว่าตำแหน่งของข้อมูลที่เพิ่งสร้างจะบอกผ่าน Header ชื่อ Location ถ้ามี\u003C\u002Fp>\u003Cp>\u003Cstrong>204 No Content\u003C\u002Fstrong> คือคำขอสำเร็จ แต่ไม่มีเนื้อหาส่งกลับมาเลย มักเจอหลังลบข้อมูลหรือบันทึกค่าที่ไม่ต้องตอบอะไรกลับ จุดที่มือใหม่พลาดบ่อยคือเขียนโค้ดอ่าน JSON จาก Response ทุกครั้งโดยไม่เช็กก่อน พอเจอ 204 ก็เกิด Error ทั้งที่คำขอสำเร็จไปแล้ว\u003C\u002Fp>\u003Cp>\u003Cstrong>301 Moved Permanently\u003C\u002Fstrong> กับ \u003Cstrong>302 Found\u003C\u002Fstrong> คือการย้ายที่อยู่ ต่างกันที่ 301 เป็นการย้ายถาวร ส่วน 302 เป็นการย้ายชั่วคราว ที่อยู่ใหม่จะมากับ Header ชื่อ Location และเบราว์เซอร์จะพาไปให้เองโดยอัตโนมัติ\u003C\u002Fp>\u003Cp>\u003Cstrong>304 Not Modified\u003C\u002Fstrong> ไม่ใช่ Error แม้จะดูแปลกตา มันเกิดเมื่อเบราว์เซอร์ถามเซิร์ฟเวอร์ว่า \"ไฟล์นี้เปลี่ยนไปหรือยัง\" แล้วเซิร์ฟเวอร์ตอบว่ายังไม่เปลี่ยน เบราว์เซอร์จึงใช้สำเนาใน Cache (ที่เก็บไฟล์ชั่วคราว) ที่มีอยู่แล้ว ไม่ต้องโหลดซ้ำ\u003C\u002Fp>\u003Ch2>4xx: คำขอของเรามีปัญหา\u003C\u002Fh2>\u003Cp>เจอรหัสกลุ่มนี้เมื่อไหร่ ให้หันกลับมาดูสิ่งที่เราส่งไปก่อน ทั้ง URL, Method, Header และ Body\u003C\u002Fp>\u003Cp>\u003Cstrong>400 Bad Request\u003C\u002Fstrong> คือเซิร์ฟเวอร์ไม่ประมวลผลคำขอ เพราะมองว่าผิดที่ฝั่งผู้ขอ เช่น รูปแบบคำขอเสีย ในงาน API มักเจอเมื่อ JSON ที่ส่งไปพิมพ์ผิดรูปแบบ หรือขาดฟิลด์ที่บังคับ RFC 9110 ยังมี 422 Unprocessable Content สำหรับกรณีที่รูปแบบถูกแต่เซิร์ฟเวอร์ประมวลผลเนื้อหาข้างในไม่ได้ ซึ่ง API หลายตัวใช้กับข้อมูลที่ไม่ผ่านเงื่อนไข จึงควรอ่านข้อความใน Response Body ประกอบเสมอ\u003C\u002Fp>\u003Cp>\u003Cstrong>404 Not Found\u003C\u002Fstrong> คือเซิร์ฟเวอร์ไม่พบสิ่งที่ขอ สาเหตุที่เจอบ่อยที่สุดคือ URL สะกดผิด ขาดหรือเกินเครื่องหมาย \u002F หรือเรียก Endpoint ที่ยังไม่ได้ Deploy RFC 9110 ยังบอกด้วยว่า 404 ไม่ได้บอกว่าหายชั่วคราวหรือถาวร ถ้าเซิร์ฟเวอร์รู้ว่าลบถาวรแล้ว ควรตอบ 410 Gone แทน\u003C\u002Fp>\u003Cp>\u003Cstrong>429 Too Many Requests\u003C\u002Fstrong> มาจาก RFC 6585 แปลว่าคุณส่งคำขอถี่เกินกว่าที่กำหนดในช่วงเวลาหนึ่ง หรือที่เรียกว่า Rate Limit (การจำกัดจำนวนคำขอ) เซิร์ฟเวอร์อาจแนบ Header ชื่อ Retry-After มาบอกว่าควรรอนานเท่าไหร่ สิ่งที่ไม่ควรทำคือเขียนลูปยิงซ้ำทันที เพราะยิ่งยิงถี่ก็ยิ่งเกินโควตาซ้ำ และบางระบบอาจจำกัดนานขึ้นอีก\u003C\u002Fp>\u003Cp>ส่วน 401 กับ 403 ขอแยกไว้เป็นหัวข้อของมันเอง เพราะเป็นคู่ที่คนสับสนกันมากที่สุด\u003C\u002Fp>\u003Ch2>401 กับ 403 ต่างกันยังไง\u003C\u002Fh2>\u003Cp>ชื่อ 401 Unauthorized ชวนให้เข้าใจผิดตั้งแต่ต้น ตามความหมายใน RFC 9110 รหัส 401 คือคำขอยังไม่ถูกดำเนินการ เพราะไม่มีข้อมูลยืนยันตัวตน (Authentication) ที่ใช้ได้ พูดง่ายๆ คือเซิร์ฟเวอร์ยังไม่รู้ว่าคุณเป็นใคร และเซิร์ฟเวอร์ที่ตอบ 401 ต้องส่ง Header ชื่อ WWW-Authenticate มาบอกด้วยว่าต้องยืนยันตัวตนแบบไหน\u003C\u002Fp>\u003Cp>ส่วน 403 Forbidden คือเซิร์ฟเวอร์เข้าใจคำขอแล้ว แต่ปฏิเสธ RFC 9110 เขียนว่า ถ้าคำขอแนบข้อมูลยืนยันตัวตนมาแล้ว แปลว่าเซิร์ฟเวอร์มองว่าข้อมูลนั้นมีสิทธิ์ไม่พอ และไม่ควรส่งซ้ำด้วยข้อมูลชุดเดิม\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>เจอ 401: เช็กว่าแนบ Token มาหรือยัง Token หมดอายุไหม สะกดชื่อ Header ถูกไหม หรือ API Key ถูกตัวไหม\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>เจอ 403: ตัวตนผ่านแล้ว แต่บัญชีนี้ไม่มีสิทธิ์ทำสิ่งนี้ ต้องไปขอสิทธิ์เพิ่ม ไม่ใช่ล็อกอินใหม่ซ้ำๆ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>ถ้ากำลังทำงานกับ API ที่ต้องใช้ Key ลองอ่าน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fapi-key-env-keep-secrets-safe\">วิธีเก็บ API Key ให้ปลอดภัยด้วยไฟล์ .env\u003C\u002Fa> ประกอบ เพราะ Key ที่อ่านไม่เจอหรือสะกดชื่อตัวแปรผิดเป็นต้นเหตุของ 401 ที่พบบ่อย\u003C\u002Fp>\u003Ch2>5xx: ฝั่งเซิร์ฟเวอร์พัง\u003C\u002Fh2>\u003Cp>รหัสกลุ่มนี้หมายถึงคำขอของเราดูถูกต้องแล้ว แต่เซิร์ฟเวอร์ทำไม่สำเร็จเอง การล้าง Cache หรือแก้โค้ดหน้าเว็บจะไม่ช่วยอะไร\u003C\u002Fp>\u003Cp>\u003Cstrong>500 Internal Server Error\u003C\u002Fstrong> คือเซิร์ฟเวอร์เจอเหตุการณ์ที่ไม่คาดคิดจนทำคำขอไม่สำเร็จ เป็นรหัสกว้างที่สุดของกลุ่ม ถ้าคุณเขียน Backend เอง ที่ที่ต้องไปดูคือ Log ของเซิร์ฟเวอร์ ไม่ใช่ Console ของเบราว์เซอร์ ถ้าอยากเห็นว่าฝั่ง Backend ส่ง Status Code ออกไปยังไงในโค้ดจริง ลองดู \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fep-30-http-requests-responses-js-go\">JS2GO EP.30 การทำงานกับ HTTP Requests และ Responses\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>502 กับ 503 ต่างกันยังไง\u003C\u002Fh2>\u003Cp>สองตัวนี้เกี่ยวกับโครงสร้างที่มือใหม่มักมองไม่เห็น คือในระบบจริง คำขอของเรามักไม่ได้วิ่งตรงไปถึงแอป แต่ผ่านตัวกลางก่อน เช่น Nginx หรือ Load Balancer ที่ทำหน้าที่เป็น Gateway หรือ Proxy (ตัวกลางรับคำขอแล้วส่งต่อ)\u003C\u002Fp>\u003Cp>\u003Cstrong>502 Bad Gateway\u003C\u002Fstrong> คือตัวกลางนั้นไปเรียกเซิร์ฟเวอร์ตัวหลังแล้วได้คำตอบที่ใช้ไม่ได้กลับมา ตัวกลางยังทำงาน แต่ของที่อยู่ข้างหลังมีปัญหา เช่น แอปตัวหลังล่มไปแล้ว\u003C\u002Fp>\u003Cp>\u003Cstrong>503 Service Unavailable\u003C\u002Fstrong> คือเซิร์ฟเวอร์รับงานไม่ไหวชั่วคราว จากโหลดเกินหรือปิดปรับปรุงตามกำหนด RFC 9110 บอกว่าอาการนี้น่าจะหายไปเองหลังรอสักพัก และเซิร์ฟเวอร์อาจส่ง Retry-After มาบอกเวลารอเหมือน 429\u003C\u002Fp>\u003Cp>ถ้าให้สรุปเป็นประโยคเดียว: 502 คือ \"คนที่อยู่ข้างหลังตอบมาแปลกๆ\" ส่วน 503 คือ \"ตอนนี้รับไม่ไหว ขอเวลาก่อน\" ส่วน 504 Gateway Timeout ที่หน้าตาคล้ายกัน คือตัวกลางรอคำตอบจากตัวหลังนานเกินไปจนหมดเวลา\u003C\u002Fp>\u003Ch2>ดู Status Code ใน DevTools แท็บ Network ยังไง\u003C\u002Fh2>\u003Cp>ไม่ต้องติดตั้งอะไรเพิ่ม เบราว์เซอร์หลักทุกตัวมีเครื่องมือนี้อยู่แล้ว ใน Chrome หรือ Edge ทำตามนี้ได้เลย\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>กด F12 หรือ Ctrl+Shift+I บน Windows (Cmd+Option+I บน Mac) เพื่อเปิด DevTools\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>เลือกแท็บ Network แล้วกดรีเฟรชหน้าเว็บ เพราะ DevTools จะบันทึกเฉพาะคำขอที่เกิดหลังจากเปิดแท็บนี้\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ดูคอลัมน์ Status จะเห็นรหัสของทุกคำขอ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ถ้าสนใจเฉพาะการเรียก API ให้กดตัวกรอง Fetch\u002FXHR เพื่อซ่อนไฟล์รูปและ CSS\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>คลิกที่แถวที่มีปัญหา ในแท็บ Headers จะเห็น Status Code และ Header ทั้งหมด ส่วนแท็บ Response จะเห็นข้อความที่เซิร์ฟเวอร์ส่งกลับมา\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>ถ้าหน้าเว็บเปลี่ยนหน้าแล้วรายการหายหมด ให้ติ๊ก Preserve log เพื่อเก็บรายการไว้ ขั้นตอนเหล่านี้ใช้คู่กับวิธีคิดใน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fwhat-is-debugging-why-good-coders-master-bug-fixing\">Debug คืออะไร ทำไมคนเขียนโค้ดเก่งต้องเก่งการแก้บั๊ก\u003C\u002Fa> ได้ดี เพราะเป็นการเก็บหลักฐานก่อนเดา\u003C\u002Fp>\u003Ch2>Status Code บอกความจริงทุกครั้งหรือเปล่า\u003C\u002Fh2>\u003Cp>ไม่เสมอไป และนี่คือเรื่องที่ควรรู้ไว้ก่อนเชื่อตัวเลขร้อยเปอร์เซ็นต์ RFC 9110 เปิดช่องให้เซิร์ฟเวอร์ที่ไม่อยากให้ใครรู้ว่ามีข้อมูลนั้นอยู่ ตอบ 404 แทน 403 ได้ แปลว่าบาง 404 ที่เห็น จริงๆ แล้วคือเราไม่มีสิทธิ์ ไม่ใช่ URL ผิด\u003C\u002Fp>\u003Cp>อีกเรื่องคือ RFC 9110 เองยอมรับว่าเซิร์ฟเวอร์ที่โหลดเกินไม่จำเป็นต้องตอบ 503 เสมอ บางตัวแค่ปฏิเสธการเชื่อมต่อไปเลย ซึ่งในกรณีนั้นจะไม่มี Status Code ให้อ่านด้วยซ้ำ และในงานจริงยังมี API บางตัวที่ตอบ 200 ทุกกรณี แล้วไปบอกว่า Error ในเนื้อหาข้างใน\u003C\u002Fp>\u003Cp>เพราะฉะนั้นกติกาที่ใช้ได้จริงคือ อ่าน Status Code เพื่อเลือกว่าจะเริ่มดูฝั่งไหน แล้วเปิดแท็บ Response อ่านข้อความที่เซิร์ฟเวอร์ส่งมาประกอบทุกครั้ง\u003C\u002Fp>\u003Cp>ตัวเลขชี้ทาง ข้อความใน Body คือหลักฐาน\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป: เห็นเลขแล้วเริ่มแก้ตรงไหน\u003C\u002Fh2>\u003Cp>HTTP Status Code มี 5 กลุ่มตามหลักแรก และสิ่งที่ต้องจำจริงๆ มีแค่นี้: 2xx สำเร็จ \u002F 3xx ย้าย \u002F 4xx ฝั่งผู้ขอผิด \u002F 5xx ฝั่งเซิร์ฟเวอร์พัง เจอ 4xx ให้กลับไปดู URL, Token และข้อมูลที่ส่ง เจอ 5xx ให้ไปดู Log ฝั่งเซิร์ฟเวอร์หรือแจ้งผู้ดูแล 401 คือยังไม่รู้ว่าคุณเป็นใคร 403 คือรู้แล้วแต่ไม่ให้เข้า 502 คือตัวหลังตอบผิด 503 คือรับไม่ไหวชั่วคราว\u003C\u002Fp>\u003Cp>ลองเปิดแท็บ Network ในเว็บที่คุณกำลังทำอยู่ตอนนี้ แล้วนับดูว่ามีคำขอไหนที่ไม่ใช่ 2xx บ้าง ครั้งหน้าที่เจอบั๊ก คุณจะเริ่มจากตัวเลขตัวเดียวแทนการเดาทั้งไฟล์ ถ้าอยากอ่านนิยามฉบับเต็ม เปิด \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9110.html#name-status-codes\">RFC 9110 หัวข้อ Status Codes\u003C\u002Fa>, \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc6585.html#section-4\">RFC 6585 หัวข้อ 429\u003C\u002Fa> และ \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FStatus\">หน้ารวม HTTP response status codes ของ MDN\u003C\u002Fa> ได้เลย\u003C\u002Fp>\u003Cp>ติดตามบทความและเทคนิคสำหรับคนเริ่มต้นสายโปรแกรมเมอร์ได้ที่ช่องทางของเรา\u003C\u002Fp>\u003Cp>Facebook: \u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong> (\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fa>)\u003C\u002Fp>\u003Cp>YouTube: \u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong> (\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\u003C\u002Fa>)\u003C\u002Fp>\u003Cp>Instagram: \u003Cstrong>@superdevacademy\u003C\u002Fstrong> (\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\u003C\u002Fa>)\u003C\u002Fp>\u003Cp>TikTok: \u003Cstrong>@superdevacademy\u003C\u002Fstrong> (\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fa>)\u003C\u002Fp>","cover_cover_k4zbzm1y0h.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fu86b9wkmg678dym\u002Fl\u002Fcover_cover_k4zbzm1y0h.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fu86b9wkmg678dym\u002Fm\u002Fcover_cover_k4zbzm1y0h.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fu86b9wkmg678dym\u002Fcover_cover_k4zbzm1y0h.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fu86b9wkmg678dym\u002Fs\u002Fcover_cover_k4zbzm1y0h.webp","2026-09-28 06:48:28.363Z","wfztm6bp9384v3u",{"keywords":18,"locale":45,"school_blog":55},[19,25,29,33,37,41],{"collectionId":20,"collectionName":21,"created":22,"created_by":16,"id":23,"name":24,"updated":22,"updated_by":16},"sclkey987654321","school_keywords","2026-09-28 06:48:28.354Z","j1euruov88dou04","http status code",{"collectionId":20,"collectionName":21,"created":26,"created_by":16,"id":27,"name":28,"updated":26,"updated_by":16},"2026-09-28 06:48:28.355Z","0p3shlpozj3m2o9","http status code มีอะไรบ้าง",{"collectionId":20,"collectionName":21,"created":30,"created_by":16,"id":31,"name":32,"updated":30,"updated_by":16},"2026-09-28 06:48:28.356Z","7pdnr3cate1d89l","status code 401 vs 403",{"collectionId":20,"collectionName":21,"created":34,"created_by":16,"id":35,"name":36,"updated":34,"updated_by":16},"2026-09-28 06:48:28.357Z","tcf80l3257f482d","502 vs 503",{"collectionId":20,"collectionName":21,"created":38,"created_by":16,"id":39,"name":40,"updated":38,"updated_by":16},"2026-09-28 06:48:28.358Z","s562vfhukkz3v33","http status code 500",{"collectionId":20,"collectionName":21,"created":42,"created_by":16,"id":43,"name":44,"updated":42,"updated_by":16},"2026-09-28 06:48:28.359Z","d2gi3qfr2ntpsh5","devtools network",{"code":46,"collectionId":47,"collectionName":48,"created":49,"flag":50,"id":51,"is_default":52,"label":53,"updated":54},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":56,"collectionId":57,"collectionName":58,"created":59,"expand":60,"id":77,"slug":78,"updated":79,"views":80},"rfxf19ot4iq992c","pbc_2105096300","school_blogs","2026-09-28 06:48:28.360Z",{"category":61},{"blogIds":62,"collectionId":63,"collectionName":64,"created":65,"created_by":66,"id":56,"image":67,"image_alt":68,"image_path":69,"image_s_url":70,"label":71,"name":72,"priority":73,"publish_at":74,"scheduled_at":68,"status":75,"updated":76,"updated_by":66},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:32:03.969Z","76qprkevbgfdps8","7acfigk1qkd_lv1k6bkji3_7h89h9h63a.webp","","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Frfxf19ot4iq992c\u002F7acfigk1qkd_lv1k6bkji3_7h89h9h63a.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Frfxf19ot4iq992c\u002Fs\u002F7acfigk1qkd_lv1k6bkji3_7h89h9h63a.webp",{"en":72,"th":72},"Web Development",0,"2025-01-21 03:43:00.282Z","published","2026-08-18 14:48:42.218Z","kol6xjzoq7xwh4e","http-status-codes-explained","2026-10-25 12:21:02.055Z",149,"u86b9wkmg678dym",[23,27,31,35,39,43],"2026-10-01 04:42:20.239Z","HTTP Status Code มีอะไรบ้าง สรุป 5 กลุ่ม 1xx-5xx และรหัสที่มือใหม่เจอบ่อย พร้อมวิธีแยก 401 กับ 403, 502 กับ 503 และวิธีดู Status Code ในแท็บ Network","HTTP Status Code คืออะไร มีอะไรบ้าง อ่านให้รู้ว่าใครพัง 4xx\u002F5xx","2026-10-24 17:03:08.477Z","ebkf8ra4nd55ual",1,[90,94,98,102,106,110],{"answer":91,"id":92,"question":93},"401 Unauthorized แปลว่าเซิร์ฟเวอร์ยังไม่รู้ว่าคุณเป็นใคร เพราะคำขอไม่มีข้อมูลยืนยันตัวตนที่ใช้ได้ เช่น ไม่ได้แนบ Token หรือ Token หมดอายุ ส่วน 403 Forbidden แปลว่าเซิร์ฟเวอร์เข้าใจคำขอแล้วแต่ไม่ให้สิทธิ์เข้าถึง ตาม RFC 9110 เซิร์ฟเวอร์ที่ตอบ 401 ต้องส่ง Header ชื่อ WWW-Authenticate มาด้วย ส่วนกรณี 403 การส่ง Token เดิมซ้ำจะไม่ช่วยอะไร ต้องขอสิทธิ์เพิ่มแทน","6zk7f49u3i6otml","Status Code 401 กับ 403 ต่างกันยังไง",{"answer":95,"id":96,"question":97},"502 Bad Gateway หมายถึงเซิร์ฟเวอร์ที่เป็น Gateway หรือ Proxy (ตัวกลางรับคำขอ เช่น Nginx) ได้คำตอบที่ใช้ไม่ได้จากเซิร์ฟเวอร์ตัวหลังที่มันเรียกต่อ ส่วน 503 Service Unavailable หมายถึงเซิร์ฟเวอร์รับงานไม่ไหวชั่วคราว จากโหลดเกินหรือปิดปรับปรุงตามกำหนด และอาจส่ง Header ชื่อ Retry-After บอกเวลาที่ควรรอ ทั้งสองรหัสเป็นปัญหาฝั่งเซิร์ฟเวอร์ ไม่ใช่โค้ดฝั่งคุณ","zv2xeku6n33ogsn","502 Bad Gateway กับ 503 Service Unavailable ต่างกันยังไง",{"answer":99,"id":100,"question":101},"204 No Content แปลว่าคำขอสำเร็จเหมือน 200 OK แต่เซิร์ฟเวอร์ไม่มีเนื้อหาส่งกลับมาใน Response Body เลย มักเจอหลังคำสั่ง DELETE หรือการบันทึกข้อมูลที่ไม่ต้องตอบอะไรกลับ ถ้าโค้ด JavaScript เรียก response.json() กับคำตอบ 204 จะเกิด Error เพราะไม่มี JSON ให้อ่าน จึงควรเช็ก response.status ก่อนอ่าน Body ทุกครั้ง","7swjjyln20o8cjs","Status Code 204 No Content ต่างจาก 200 OK ยังไง",{"answer":103,"id":104,"question":105},"429 Too Many Requests แปลว่าคุณส่งคำขอถี่เกินกว่าที่เซิร์ฟเวอร์กำหนดในช่วงเวลาหนึ่ง หรือที่เรียกว่า Rate Limit วิธีรับมือคือหยุดยิงซ้ำทันที แล้วดู Header ชื่อ Retry-After ถ้ามี เพราะ RFC 6585 ระบุว่าเซิร์ฟเวอร์อาจใช้ Header นี้บอกเวลาที่ควรรอ จากนั้นค่อยลองใหม่แบบเว้นระยะห่างมากขึ้นทีละรอบ ไม่ใช่วนลูปยิงทันที","lpbv3vryg2c3d8i","เจอ 429 Too Many Requests ต้องทำยังไง",{"answer":107,"id":108,"question":109},"404 Not Found แปลว่าเซิร์ฟเวอร์หาสิ่งที่ขอไม่เจอ ตาม RFC 9110 คือเซิร์ฟเวอร์ต้นทางไม่พบข้อมูลปัจจุบันของ URL นั้น หรือไม่ยอมเปิดเผยว่ามีอยู่ จึงใช้ 404 แทน 403 เพื่อซ่อนหน้าที่เราไม่มีสิทธิ์ได้ด้วย วิธีแก้คือเช็กว่า URL สะกดถูกไหม เครื่องหมาย \u002F ขาดหรือเกินไหม ตัวพิมพ์เล็กใหญ่ตรงไหม และ Endpoint หรือ Route นั้นถูก Deploy ขึ้นเซิร์ฟเวอร์แล้วหรือยัง","4x8gh73oantna3v","404 Not Found คืออะไร แก้ยังไง",{"answer":111,"id":112,"question":113},"500 Internal Server Error แปลว่าเซิร์ฟเวอร์เจอเหตุการณ์ที่ไม่คาดคิดจนทำคำขอไม่สำเร็จ ปัญหาจึงอยู่ที่โค้ดหรือระบบฝั่งเซิร์ฟเวอร์ ไม่ใช่เบราว์เซอร์ การล้าง Cache หรือกดรีเฟรชไม่ได้แก้ต้นเหตุ ถ้าคุณเขียน Backend เอง ให้เปิด Log ของเซิร์ฟเวอร์ดู Stack Trace ถ้าเป็น API ของคนอื่น ให้จดเวลาและ Request ที่ส่งไปแล้วแจ้งผู้ดูแลระบบนั้น","zhd8zvm93seiqzh","HTTP 500 Internal Server Error เป็นความผิดของใคร",{"th":78,"en":78}]