>  기사  >  백엔드 개발  >  Go의 미들웨어 및 핸들러에서 컨텍스트를 올바르게 전달하는 방법은 무엇입니까?

Go의 미들웨어 및 핸들러에서 컨텍스트를 올바르게 전달하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 06:52:02702검색

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

Go의 미들웨어 및 핸들러에서 컨텍스트 전달

소개

Go의 컨텍스트를 이해하는 것은 혼란스러울 수 있습니다. 미들웨어와 핸들러에 컨텍스트를 효과적으로 전달하는 방법을 살펴보겠습니다.

미들웨어에서 컨텍스트 전달

미들웨어에 컨텍스트를 전달하려면 다음 단계를 따르세요.

  1. 새 컨텍스트를 파생합니다. context.WithTimeout() 또는 context.WithValue()를 사용하여 요청 컨텍스트에서 컨텍스트를 가져옵니다.
  2. Call 이제 새 컨텍스트가 포함된 업데이트된 요청으로 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를 context:

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))

예제 코드

다음은 context를 사용하는 미들웨어 및 핸들러 구현 예입니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.