พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
ครอบ http.Handler และเชื่อมสายโซ่ด้วย next
พื้นฐานสายโซ่มิดเดิลแวร์ HTTP เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
มิดเดิลแวร์ใน net/http
ในไลบรารีมาตรฐานของ Go มิดเดิลแวร์คือฟังก์ชันที่รับ http.Handler และส่งคืน http.Handler ตัวใหม่ซึ่งห่อหุ้มตัวเดิมพร้อมพฤติกรรมเพิ่มเติม
type Middleware func(http.Handler) http.Handlerมิดเดิลแวร์พื้นฐาน
HandlerFunc ด้านในจะห่อตัวจัดการเดิมด้วยตรรกะก่อนและหลังการทำงาน:
func Logger(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("→ %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("← %s %s done", r.Method, r.URL.Path)
})
}การใช้มิดเดิลแวร์
ห่อตัวจัดการก่อนลงทะเบียนกับ mux:
mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)ตัวช่วยสายมิดเดิลแวร์
ฟังก์ชันสายจะใช้มิดเดิลแวร์หลายตัวตามลำดับจากซ้ายไปขวาที่อ่านเข้าใจได้ง่าย:
func Chain(h http.Handler, ms ...func(http.Handler) http.Handler) http.Handler {
for i := len(ms)-1; i >= 0; i-- { h = ms[i](h) }
return h
}
// Usage: Chain(handler, Logger, Auth, RateLimit)บริบทในมิดเดิลแวร์
แนบค่าที่มีขอบเขตตามคำขอโดยสร้างบริบทที่สืบทอดมาแล้วนำไปห่อคำขอ:
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := uuid.New().String()
ctx := context.WithValue(r.Context(), reqIDKey, id)
w.Header().Set("X-Request-ID", id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}ตัวห่อ ResponseWriter
ดักจับรหัสสถานะที่ตัวจัดการเขียน โดยห่อ ResponseWriter:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}มิดเดิลแวร์กู้คืนจากแพนิก
กู้คืนจากแพนิกเพื่อป้องกันไม่ให้เซิร์ฟเวอร์หยุดทำงาน:
func Recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if rec := recover(); rec != nil {
http.Error(w, "Internal Server Error", 500)
}
}()
next.ServeHTTP(w, r)
})
}ลำดับมีความสำคัญ
มิดเดิลแวร์จะทำงานตามลำดับที่ใช้ห่อตัวจัดการ Recovery ควรอยู่ชั้นนอกสุด (ห่อหุ้มทุกอย่าง) การยืนยันตัวตนควรทำก่อนตรรกะทางธุรกิจ ส่วนการบันทึกล็อกมักอยู่ชั้นนอกสุดถัดจาก Recovery
ความเข้ากันได้กับเราเตอร์ของบุคคลที่สาม
เนื่องจากมิดเดิลแวร์ใช้ลายเซ็นมาตรฐาน func(http.Handler) http.Handler จึงเข้ากันได้กับ chi, gorilla/mux และเราเตอร์ใด ๆ ที่รับ http.Handler
ทั่วทั้งระบบเทียบกับเฉพาะเส้นทาง
ใช้มิดเดิลแวร์ทั่วทั้งระบบกับ mux ทั้งหมด หรือห่อตัวจัดการแต่ละตัวเพื่อกำหนดพฤติกรรมเฉพาะเส้นทาง เราเตอร์ย่อยของ chi ช่วยให้ใช้มิดเดิลแวร์ระดับกลุ่มได้สะดวกยิ่งขึ้น
การทดสอบมิดเดิลแวร์
ใช้ httptest.NewRecorder และ httptest.NewRequest เพื่อทดสอบมิดเดิลแวร์แยกต่างหากโดยไม่ต้องเริ่มเซิร์ฟเวอร์จริง
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)ตรวจสอบอย่างรวดเร็ว
ลายเซ็นมาตรฐานของมิดเดิลแวร์ net/http คืออะไร
ทบทวน: สายมิดเดิลแวร์
ประเด็นสำคัญ:
- func(http.Handler) http.Handler คือลายเซ็นมาตรฐาน
- ใช้ตัวช่วย Chain เพื่อหลีกเลี่ยงการซ้อนกันลึกเกินไป
- ใช้ r.WithContext(ctx) เพื่อแนบค่า และใช้ตัวห่อ writer เพื่อบันทึกสถานะ
- Recovery อยู่ชั้นนอกสุด การยืนยันตัวตนอยู่ก่อนตรรกะทางธุรกิจ และการบันทึกล็อกอยู่หลัง Recovery
คำถามที่พบบ่อย
บทเรียน “พื้นฐานสายโซ่มิดเดิลแวร์ HTTP” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐานสายโซ่มิดเดิลแวร์ HTTP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานสายโซ่มิดเดิลแวร์ HTTP”
ครอบ http.Handler และเชื่อมสายโซ่ด้วย next คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐานสายโซ่มิดเดิลแวร์ HTTP” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
- มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
- มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
- มิดเดิลแวร์ CORS และกู้คืนจาก panic