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
Susan Sarandonasal
2024-11-17 01:27:03781semak imbas

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

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
  ...

}

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

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!

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