首页 > 后端开发 > Golang > 正文

如何在 Go 中正确传递中间件和处理程序中的上下文?

Patricia Arquette
发布: 2024-11-09 06:52:02
原创
701 人浏览过

How to Properly Pass Context in Middleware and Handlers in Go?

在 Go 中的中间件和处理程序中传递上下文

简介

理解 Go 中的上下文可能会令人困惑。让我们探讨如何有效地将上下文传递给中间件和处理程序。

在中间件中传递上下文

要将上下文传递给中间件,请按照以下步骤操作:

  1. 派生一个新的使用 context.WithTimeout() 或 context.WithValue() 从请求上下文获取上下文。
  2. 使用更新后的请求调用 ServeHTTP,该请求现在包含新的上下文。
  3. 在授权检查器中,添加在调用 ServeHTTP 之前将用户的信息传递到上下文。

例如,为请求添加超时:

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)
登录后复制

在处理程序中传递上下文

至将上下文传递给处理程序:

  1. 使用 context.WithValue() 将值添加到请求的上下文。
  2. 在处理程序中,使用 request.Context().Value() 访问

例如,要将用户 ID 添加到上下文中:

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板