อธิบาย Go HTTP Middleware

เลิกคัดลอกและวางโค้ดเดิมซ้ำๆ ลงในทุก handler เสียที

หากคุณต้องตรวจสอบการยืนยันตัวตน (authentication), บันทึกระยะเวลาของ request (log request duration), หรือเพิ่ม unique ID ให้กับทุก request อย่าเขียน logic เหล่านั้นไว้ภายใน business handler ของคุณ หากคุณมี 20 handler คุณก็ต้องตามไปแก้ไขถึง 20 แห่งเมื่อ logic การทำ auth เปลี่ยนแปลง นี่คือฝันร้ายในการดูแลรักษาโค้ด (maintenance nightmare)

Middleware คือคำตอบ คุณเขียน logic เพียงครั้งเดียว นำไปครอบ (wrap) handler ของคุณ แล้วคุณก็ไม่ต้องกลับมาแตะต้องมันอีกเลย

Middleware คืออะไร?

ในภาษา Go, middleware คือฟังก์ชันที่: • รับ http.Handler • ส่งคืน (return) http.Handler ตัวใหม่ • ทำงานบางอย่างก่อนหรือหลังที่ handler เดิมจะทำงาน

ให้ลองนึกภาพเหมือนหัวหอม แต่ละชั้นจะห่อหุ้มชั้นถัดไป Request จะวิ่งผ่านแต่ละชั้นในขาเข้า และ Response จะวิ่งผ่านแต่ละชั้นในขาออก

สิ่งที่คุณจะได้เรียนรู้:

• พื้นฐานของ http.Handler interface • วิธีการสร้าง custom middleware ตั้งแต่เริ่มต้น • วิธีการเชื่อมต่อ (chain) หลายๆ ชั้นเข้าด้วยกัน • วิธีการส่งผ่านข้อมูลผ่าน chain โดยใช้ context • เคล็ดลับขั้นสูง เช่น การจัดลำดับ (ordering) และการกู้คืนเมื่อเกิด panic (panic recovery)

สรุปประเด็นสำคัญ:

• ลำดับมีความสำคัญ หาก middleware หนึ่งกำหนดค่าไว้ใน context middleware ตัวถัดไปใน chain จะต้องเป็นตัวที่อ่านค่านั้น หากคุณสลับลำดับกัน ข้อมูลจะว่างเปล่า

• ต้อง return เสมอหลังจากออกจากฟังก์ชันก่อนกำหนด (early exit) หากคุณพบข้อผิดพลาดและส่ง http.Error ให้เรียก return ทันที หากคุณเรียก next.ServeHTTP หลังจากส่ง error ไปแล้ว server ของคุณจะเกิด panic

• ใช้ custom types สำหรับ context keys อย่าใช้ string ธรรมดาเป็น key เพราะจะช่วยป้องกันไม่ให้ package ต่างๆ เขียนทับข้อมูลของกันและกัน

• ใช้ wrapper เพื่อดักจับข้อมูล เนื่องจาก http.ResponseWriter มาตรฐานไม่ยอมให้คุณอ่าน status code หลังจากที่เขียนลงไปแล้ว คุณจึงต้องสร้าง custom struct ขึ้นมาเพื่อดักจับ (intercept) และบันทึกค่าไว้สำหรับทำ log

สร้างรากฐานที่แข็งแกร่งให้กับ Go HTTP server ของคุณด้วยการเชี่ยวชาญรูปแบบ (patterns) เหล่านี้

Source: https://dev.to/ferztyle/go-http-middleware-explained-what-it-is-how-it-works-and-how-to-build-your-own-1ma7