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
Susan Sarandonasal
2024-11-16 04:17:03846semak imbas

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

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

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

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!

Kenyataan:
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