>백엔드 개발 >Golang >Golang 요청의 컨텍스트를 미들웨어 및 핸들러에 전달하는 방법은 무엇입니까?

Golang 요청의 컨텍스트를 미들웨어 및 핸들러에 전달하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-17 01:27:03760검색

How to Pass Context in Golang Requests to Middleware and Handlers?

Golang 요청의 컨텍스트를 미들웨어에 전달하는 방법

컨텍스트 이해

버전 1.7에 도입된 Go의 컨텍스트는 다음과 같습니다. 메타데이터를 요청과 연결하는 메커니즘입니다. 이를 통해 미들웨어와 핸들러를 포함하여 코드의 여러 부분 간에 정보를 전달할 수 있습니다.

미들웨어에 컨텍스트 전달

귀하의 질문으로 인해 미들웨어와 핸들러 모두에 대한 컨텍스트입니다. 제공한 예제 코드에 맞추기 위해 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
  ...

}

사용 예

주 함수는 다음과 같습니다.

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

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