理解上下文
Go 的上下文,在1.7 版本中引入,是將元資料與請求相關聯的機制。它允許您在程式碼的不同部分之間傳遞訊息,包括中間件和處理程序。
將上下文傳遞給中間件
您的問題提出瞭如何傳遞中間件和處理程序的上下文。為了與您提供的範例程式碼保持一致,checkAuth 函數將代表中間件,而 Handler 代表處理程序。
要將上下文傳遞給中間件,您通常會在請求物件上使用 WithContext 方法。例如:
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 }) }
將上下文傳遞給處理程序
要將上下文傳遞給處理程序,您將再次在請求對像上使用 WithContext 方法。在處理程序的ServeHTTP 方法中,您可以使用Value 方法檢索上下文:
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 ... }
範例用法
您的main 函數可能如下所示:
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, ...)) }
請記住,上下文只能用來傳遞瞬態訊息。對於更持久的數據,請使用資料庫或其他儲存機制。
以上是如何將 Golang 請求中的上下文傳遞給中間件和處理程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!