0Pricing
Go Academy · บทเรียน

พื้นฐานสายโซ่มิดเดิลแวร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
  2. มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
  3. มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
  4. มิดเดิลแวร์ CORS และกู้คืนจาก panic
← กลับไปที่ Go Academy