>백엔드 개발 >Golang >Go HTTP 핸들러 및 미들웨어에서 컨텍스트 정보를 어떻게 전달하고 액세스할 수 있나요?

Go HTTP 핸들러 및 미들웨어에서 컨텍스트 정보를 어떻게 전달하고 액세스할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-16 04:17:03846검색

How can I pass and access context information in Go HTTP Handlers and Middleware?

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

Go에서 컨텍스트 패키지는 요청 핸들러 간에 정보를 전달하는 기능을 제공합니다. 이는 핸들러 함수 실행 전후에 작업을 수행할 수 있는 미들웨어에 특히 유용합니다.

컨텍스트 생성 및 전달

미들웨어의 맥락에서 우리는 요청 컨텍스트에서 context.WithValue를 호출하고 키와 값 쌍을 제공하여 새 컨텍스트를 생성할 수 있습니다. 그런 다음 핸들러의 ServeHTTP 메소드를 호출할 때 이 새로운 컨텍스트를 사용해야 합니다.

예를 들어 제공된 코드 조각에서 checkAuth 미들웨어 함수는 요청 컨텍스트와 인증 토큰을 입력으로 받습니다. 인증 토큰을 확인하는 래핑된 핸들러 함수를 반환합니다.

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
            }
            h.ServeHTTP(w, r)
        })
    }
}

인증 토큰으로 컨텍스트를 초기화하려면 아래와 같이 요청 컨텍스트에서 context.WithValue를 호출할 수 있습니다.

func main() {
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    ctx := context.WithValue(r.Context(), "auth_token", authToken)
    router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}

이 새로운 컨텍스트는 미들웨어 핸들러가 원래 핸들러의 ServeHTTP를 호출할 때 사용됩니다. method.

핸들러에서 컨텍스트 액세스

핸들러는 현재 컨텍스트를 반환하는 r.Context()를 호출하여 컨텍스트 정보에 액세스할 수 있습니다. 아래 코드 조각에 표시된 대로 Value 메서드를 사용하여 값을 검색할 수 있습니다.

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    authToken := r.Context().Value("auth_token").(string)
    // ...
}

위 내용은 Go HTTP 핸들러 및 미들웨어에서 컨텍스트 정보를 어떻게 전달하고 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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