Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menghantar Permintaan Konteks dalam Golang kepada Middleware dan Pengendali?

Bagaimana untuk Menghantar Permintaan Konteks dalam Golang kepada Middleware dan Pengendali?

Susan Sarandon
Lepaskan: 2024-11-17 01:27:03
asal
758 orang telah melayarinya

How to Pass Context in Golang Requests to Middleware and Handlers?

Cara Menghantar Permintaan Konteks dalam Golang ke Middleware

Memahami Konteks

Konteks Go, yang diperkenalkan dalam versi 1.7, ialah mekanisme untuk mengaitkan metadata dengan permintaan. Ia membolehkan anda menghantar maklumat antara bahagian berlainan kod anda, termasuk perisian tengah dan pengendali.

Melalukan Konteks kepada Perisian Tengah

Soalan anda menimbulkan isu bagaimana untuk lulus konteks kepada perisian tengah dan pengendali. Untuk menyelaraskan dengan contoh kod yang anda berikan, fungsi checkAuth akan mewakili middleware, manakala Handler mewakili pengendali.

Untuk menghantar konteks kepada middleware, anda biasanya akan menggunakan kaedah WithContext pada objek permintaan. Contohnya:

func checkAuth(authToken string) http.HandlerFunc {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context() // Retrieve the current context from the request

    if r.Header.Get("Auth") != authToken {
      util.SendError(w, "...", http.StatusForbidden, false)
      return
    }

    h := r.Context().Value(key) // Retrieve the handler from context
    h.ServeHTTP(w, r) // Pass the request to the handler
  })
}
Salin selepas log masuk

Mengirim Konteks kepada Pengendali

Untuk menghantar konteks kepada pengendali, anda sekali lagi akan menggunakan kaedah WithContext pada objek permintaan. Dalam kaedah ServeHTTP pengendali anda, anda boleh mendapatkan semula konteks menggunakan kaedah Nilai:

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  ctx := r.Context() // Retrieve the context from the request
  
  decoder := json.NewDecoder(r.Body)

  // Decode request / context and get params
  var p params
  err := decoder.Decode(&p)
  if err != nil {
    ...
    return
  }

  // Perform GET request and pass context
  ...

}
Salin selepas log masuk

Contoh Penggunaan

Fungsi utama anda mungkin kelihatan seperti berikut:

func main() {
  router := mux.NewRouter()

  // Initialize middleware handlers
  h := Handler{
    ...
  }

  // Pass context to authCheck
  authToken, ok := getAuthToken()
  if !ok {
    panic("...")
  }
  authCheck := checkAuth(authToken)

  // Chain middleware handlers and pass context
  router.Handle("/hello", util.UseMiddleware(authCheck, h, ...))
}
Salin selepas log masuk

Ingat, konteks hanya boleh digunakan untuk menghantar maklumat sementara. Untuk data yang lebih berterusan, gunakan pangkalan data atau mekanisme storan lain.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Permintaan Konteks dalam Golang kepada Middleware dan Pengendali?. 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