Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah saya boleh menghantar dan mengakses maklumat konteks dalam Go HTTP Handlers and Middleware?

Bagaimanakah saya boleh menghantar dan mengakses maklumat konteks dalam Go HTTP Handlers and Middleware?

Susan Sarandon
Lepaskan: 2024-11-16 04:17:03
asal
842 orang telah melayarinya

How can I pass and access context information in Go HTTP Handlers and Middleware?

Melalui Konteks dalam Middleware dan HandlerFunc

Dalam Go, pakej konteks menyediakan kefungsian untuk menghantar maklumat antara pengendali permintaan. Ini amat berguna untuk perisian tengah, yang boleh melakukan tindakan sebelum dan selepas pelaksanaan fungsi pengendali.

Mencipta dan Menghantar Konteks

Dalam konteks perisian tengah, kami boleh mencipta konteks baharu dengan memanggil context.WithValue pada konteks permintaan, menyediakan pasangan kunci dan nilai. Konteks baharu ini kemudiannya harus digunakan apabila memanggil kaedah ServeHTTP pengendali.

Sebagai contoh, dalam coretan kod yang disediakan, fungsi perisian tengah checkAuth menerima konteks permintaan dan token pengesahan sebagai input. Ia mengembalikan fungsi pengendali berbalut yang menyemak token pengesahan.

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
            }
            h.ServeHTTP(w, r)
        })
    }
}
Salin selepas log masuk

Untuk memulakan konteks dengan token pengesahan, kita boleh memanggil context.WithValue pada konteks permintaan, seperti yang ditunjukkan di bawah:

func main() {
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    ctx := context.WithValue(r.Context(), "auth_token", authToken)
    router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}
Salin selepas log masuk

Konteks baharu ini kemudiannya akan digunakan apabila pengendali middleware memanggil kaedah ServeHTTP pengendali asal.

Mengakses Konteks dalam Pengendali

Pengendali boleh mengakses konteks maklumat dengan memanggil r.Context(), yang mengembalikan konteks semasa. Nilai boleh diambil menggunakan kaedah Nilai, seperti yang ditunjukkan dalam coretan kod di bawah:

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    authToken := r.Context().Value("auth_token").(string)
    // ...
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar dan mengakses maklumat konteks dalam Go HTTP Handlers and Middleware?. 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