Go でコンテキストを理解することは、混乱を招く可能性があります。コンテキストをミドルウェアとハンドラーに効果的に渡す方法を見てみましょう。
ミドルウェアにコンテキストを渡すには、次の手順に従います。
たとえば、リクエストのタイムアウト:
ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second)) defer cancel() r = r.WithContext(ctx)
へコンテキストをハンドラーに渡します:
たとえば、ユーザー ID をcontext:
ctx := context.WithValue(r.Context(), ContextUserKey, "theuser") h.ServeHTTP(w, r.WithContext(ctx))
コンテキストを使用したミドルウェアとハンドラーの実装例を次に示します:
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 } // Add authentication-specific context here h.ServeHTTP(w, r) }) } } type Handler struct { ... ... } func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Get context values here decoder := json.NewDecoder(r.Body) // ... } func main() { router := mux.NewRouter() authToken, ok := getAuthToken() if !ok { panic("...") } authCheck := checkAuth(authToken) h := Handler{ ... } router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...)) }
以上がGo のミドルウェアとハンドラーでコンテキストを適切に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。