Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Meluluskan Konteks dalam Middleware dan Pengendali dalam Go?

Bagaimana untuk Meluluskan Konteks dalam Middleware dan Pengendali dalam Go?

Patricia Arquette
Lepaskan: 2024-11-09 06:52:02
asal
746 orang telah melayarinya

How to Properly Pass Context in Middleware and Handlers in Go?

Melalui Konteks dalam Middleware dan Pengendali dalam Go

Pengenalan

Memahami konteks dalam Go boleh mengelirukan. Mari kita terokai cara menghantar konteks secara berkesan kepada perisian tengah dan pengendali.

Melalui Konteks dalam Perisian Tengah

Untuk menghantar konteks kepada perisian tengah, ikut langkah berikut:

  1. Terbitkan yang baharu konteks daripada konteks permintaan menggunakan context.WithTimeout() atau context.WithValue().
  2. Panggil ServeHTTP dengan permintaan yang dikemas kini, yang kini mengandungi konteks baharu.
  3. Dalam penyemak kebenaran, tambahkan maklumat pengguna pada konteks sebelum memanggil ServeHTTP.

Sebagai contoh, untuk menambah tamat masa kepada permintaan:

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)
Salin selepas log masuk

Melalui Konteks dalam Pengendali

Untuk lulus konteks kepada pengendali:

  1. Gunakan context.WithValue() untuk menambah nilai pada konteks permintaan.
  2. Dalam pengendali, gunakan request.Context().Value() untuk mengakses nilai .

Sebagai contoh, untuk menambah ID pengguna pada konteks:

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))
Salin selepas log masuk

Kod Contoh

Berikut ialah contoh pelaksanaan perisian tengah dan pengendali menggunakan konteks:

func checkAuth(authToken string) util.Middleware {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            if r.Header.Get("Auth") != authToken {
                util.SendError(w, "...", http.StatusForbidden, false)
                return
            }
            // Add authentication-specific context here
            h.ServeHTTP(w, r)
        })
    }
}

type Handler struct {
    ...
    ...
}

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // Get context values here
    decoder := json.NewDecoder(r.Body)

    // ...
}

func main() {
    router := mux.NewRouter()
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    authCheck := checkAuth(authToken)
    h := Handler{
       ...
   } 
   router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Meluluskan Konteks dalam Middleware dan Pengendali dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan