/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day33] HTTP Response Status

วันที่สามสิบสามของ ‪#‎365วันแห่งโปรแกรม วันนี้เราจะคุยกันเรื่อง HTTP Response Status


HTTP Response Status คืออะไร?

ใครที่ได้เขียนโปรแกรมเชื่อมต่อกับ Web Service หรือเป็นคนทำ Web/Web Service ก็จะรู้ว่ามีสิ่งที่เรียกว่า HTTP Response Status ซึ่งมันก็คือตัวเลขๆ นึง ที่เอาไว้บอก Requester ว่าสิ่งที่เขาร้องขอเนี่ยสำเร็จไหม ว่ามีปัญหาอะไรไหม หรือได้ของอะไรกลับไปด้วยไหม

HTTP Response Status นั้นแบ่งออกเป็น 5 ประเภท โดยใช้ตัวเลขหน้าสุดแบ่งประเภท ได้แก่

  • 1xx Informational หมวดนี้ใช้บอกว่า Server ได้รับ Request แล้วนะ กำลังทำงานต่อไป แต่ปกติไม่ค่อยพบคนใช้ Status ในหมวดนี้

  • 2xx Success หมวดนี้บอกว่าได้รับ Request แล้ว อ่านเข้าใจแล้ว และการทำงานสำเร็จแล้ว Status ยอดนิยมในหใวดนี้คือ 200 OK

  • 3xx Redirection หมวดนี้บอกว่าได้รับ Request แล้ว แต่ Client ต้องทำอะไรบางอย่างเพิ่มเติม ส่วนใหญ่จะใช้บอกว่าหน้านี้ถูกย้ายไปแล้ว ให้ไปเรียกอีกหน้านึงแทน

  • 4xx Client Error หมวดนี้บอกว่าได้รับ Request แล้ว แต่ Client ส่งอะไรบางอย่างมาผิด หรือไม่เข้าเงื่อนไขที่ใช้งานได้ หรือหน้าที่เรียกหาไม่มีอยู่จริง Status ยอดนิยมในหใวดนี้คือ 404 Not Found

  • 5xx Server Error หมวดนี้บอกว่าได้รับ Request แล้ว แต่ Server ทำงานไม่ได้ เนื่องจากปัญหาของทางฝั่ง Server เอง

จะเห็นว่า Status แต่ละตัวก็มีความหมายที่เฉพาะเจาะจง และทำให้เรารู้ได้ว่าเมื่อได้รับแล้วต้องทำอย่างไรต่อไป แต่บ่อยครั้งที่นักพัฒนาที่ทำฝั่ง Client ขอให้นักพัฒนาที่ทำฝั่ง Service คืน HTTP Response Status เป็น 200 ตลอด เพื่อจะได้ไม่เกิด Exception ที่ Client ซึ่งนั่นเป็นเรื่องที่รับไม่ได้ และบาปมาก แต่เพราะอะไรน่ะหรือ?

เพราะ Exception ควรเป็น Exception

Exception ควรเป็น Exception ในเมื่อมีอะไรบางอย่างที่ทำให้การทำงานผิดพลาด เราก็ต้องหาทางแก้ไข ไม่ใช่บอกว่ามันถูก >< จะบอกว่าจริงๆ แล้วการคืน Status 200 เมื่อเกิด Exception นั้น ทำให้เราเขียนโค้ดฝั่ง Client ยากกว่าการคืน Status ที่ถูกต้องด้วยซ้ำ

ในกรณีปกติเมื่อ Client ส่ง Http Request ออกไป ก็ต้องมีการดักจับ Exception อยู่แล้ว ซึ่งถ้าเรารับ Http Status ที่ถูกต้อง อะไรที่เป็น Exception ก็จะถูก Catch ไว้ ถ้าโปรแกรมไม่เข้า Catch ก็ถือว่าทำงานถูก ไม่ต้องเช็คอะไรเพิ่ม แต่ถ้า Exception ก็ค่อยว่ากันอีกที แค่นั้นเอง

try
{
	//make http request
    //read result 
    //do something
}
catch (WebException exception)
{
	//check for status code of exception and handle it.
    //do something
}

จากโค้ดด้านบนจะเห็นว่าเราทำการส่ง Request แล้วก็อ่าน Result แล้วก็ทำอะไรต่อได้เลย โดยไม่ต้องสนใจว่าผลลัพธ์ที่ได้มัะนจะผิดมั้ย เพราะเรารู้ว่า Server จะส่ง 2XX มาแน่นอนถ้าทุกอย่างถูกต้อง แต่ถ้ามีอะไรผิดล่ะ? ก็เข้า Catch Block ทันทีเลย แล้วค่อยเช็คต่อ

ถึง status code ที่ส่งมาจะไม่ใช่ success แต่ client ก็สามารถอ่าน body ของ response ได้อยู่ดี จึงไม่ต้องกังวลว่า จะอ่านข้อความ error จาก server ไม่ได้

แต่ถ้าเราลองให้ Server ส่ง 200 มาตลอดเลยไม่ว่าจะเกิดอะไรขึ้นล่ะ?

try
{
	//make http request
    //read result 
    //validate the result
    //do something
}
catch (WebException exception)
{
	//check for exception and handle it.
    //do something
}

จะเห็นว่าโค้ดดูซับซ้อนขึ้นมาทันทีเลยครับ เพราะเราอ่าน Response แล้ว ก็ยังไม่รู้ว่าถูกหรือผิด ต้องมาเช็คอีกรอบ แล้วถ้าเกิด Exception จากระบบ หรือสภาพแวดล้อม ก็ต้องมาเช็คใน Catch Block อีก

จาก 2 ตัวอย่างด้านบน น่าจะพอทำให้เกห็นภาพได้บ้าง จริงๆ แล้วในภาษาที่เป็น Event Driven นั้น จะมี Callback 2 ตัว คือ Callback ของ Success กับ Callback ของ Fail (บางทีอาจจะมีอีกตัวที่จะเรียกขึ้นมาทำงานทุกกรณี) ซึ่งทำให้การเขียนโค้ดดู clean ขึ้นได้อีก แต่ถ้าเรายังคงใช้ 200 อย่างเดียวอยู่ มันก็จะดูขัดๆ และไม่สวยงามอย่างยิ่ง สรุปคือเราควรจะหันมาใช้ HTTP Response Status อย่างจริงๆ จังๆ กันสักทีครับ เพราะการไม่ใช้มันเป็นบาป!!

สามารถไปดู status code ย่อยๆ เพิ่มเติมได้จาก WikiPedia

‪#‎day33 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...