0Pricing
Go Academy · Pelajaran

Dasar-Dasar Rantai Middleware HTTP

Membungkus http.Handler dan merangkainya dengan next

Dasar-Dasar Rantai Middleware HTTP adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Perangkat tengah di net/http

Dalam pustaka standar Go, perangkat tengah adalah fungsi yang menerima http.Handler dan mengembalikan http.Handler baru dengan perilaku tambahan yang membungkus penangan asli.

type Middleware func(http.Handler) http.Handler

Perangkat tengah dasar

HandlerFunc bagian dalam membungkus penangan asli dengan logika sebelum dan sesudah:

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)
    })
}

Menerapkan perangkat tengah

Bungkus penangan sebelum mendaftarkannya ke mux:

mux := http.NewServeMux()
mux.Handle("/api/", Logger(Auth(apiHandler)))
http.ListenAndServe(":8080", mux)

Pembantu rantai perangkat tengah

Fungsi Chain menerapkan beberapa perangkat tengah dalam urutan kiri ke kanan yang mudah dibaca:

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)

Konteks dalam perangkat tengah

Tambahkan nilai yang berlaku untuk lingkup permintaan dengan membuat konteks turunan dan membungkus permintaan:

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))
    })
}

Pembungkus penulis respons

Tangkap kode status yang ditulis penangan dengan membungkus ResponseWriter:

type captureWriter struct {
    http.ResponseWriter
    status int
}
func (cw *captureWriter) WriteHeader(code int) {
    cw.status = code
    cw.ResponseWriter.WriteHeader(code)
}

Perangkat tengah pemulihan kepanikan

Pulihkan dari kepanikan untuk mencegah server mogok:

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)
    })
}

Urutan itu penting

Perangkat tengah berjalan sesuai urutan pembungkusannya terhadap penangan. Recovery harus berada di lapisan terluar (membungkus semuanya). Auth harus mendahului logika bisnis. Pencatatan biasanya berada di lapisan terluar setelah Recovery.

Kompatibilitas dengan perute pihak ketiga

Karena perangkat tengah mengikuti signatur standar func(http.Handler) http.Handler, perangkat tengah kompatibel dengan chi, gorilla/mux, dan perute apa pun yang menerima http.Handler.

Global dibandingkan dengan khusus rute

Terapkan perangkat tengah secara global ke seluruh mux, atau bungkus penangan individual untuk perilaku khusus rute. Subperute chi membuat perangkat tengah tingkat grup lebih rapi.

Menguji perangkat tengah

Gunakan httptest.NewRecorder dan httptest.NewRequest untuk menguji perangkat tengah secara terpisah tanpa memulai server nyata.

w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", nil)
Logger(http.HandlerFunc(noop)).ServeHTTP(w, r)

Pemeriksaan Singkat

Apa signatur perangkat tengah net/http standar?

Ringkasan: Rantai Perangkat Tengah

Poin utama:

  • func(http.Handler) http.Handler adalah signatur standar
  • Gunakan pembantu Chain untuk menghindari penyarangan yang dalam
  • r.WithContext(ctx) untuk menambahkan nilai; gunakan penulis tangkap untuk merekam status
  • Recovery di lapisan terluar; Auth sebelum logika bisnis; pencatatan setelah Recovery

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dasar-Dasar Rantai Middleware HTTP” gratis?

Ya — teks lengkap “Dasar-Dasar Rantai Middleware HTTP” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Dasar-Dasar Rantai Middleware HTTP”?

Membungkus http.Handler dan merangkainya dengan next Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Dasar-Dasar Rantai Middleware HTTP” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Rantai Middleware HTTP
  2. Middleware Logging dan ID Permintaan
  3. Middleware Autentikasi dan Pembatasan Laju
  4. Middleware CORS dan Pemulihan dari Panic
← Kembali ke Go Academy