>  기사  >  백엔드 개발  >  Gorilla Mux의 요청 처리기에 인수를 어떻게 전달할 수 있나요?

Gorilla Mux의 요청 처리기에 인수를 어떻게 전달할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-17 06:22:03575검색

How can I pass arguments to request handlers in Gorilla Mux?

요청 처리기에 인수 전달

Gorilla Mux를 사용할 때 많은 개발자는 인수를 처리기에 직접 전달하는 데 한계가 있습니다. HandleFunc 메서드는 클로저를 두 번째 매개변수로만 허용하므로 핸들러에 전달할 수 있는 매개변수의 수가 제한됩니다.

전역적으로 접근 가능한 데이터베이스 객체

한 가지 공통점 해결책은 전역적으로 액세스 가능한 데이터베이스 개체를 사용하는 것입니다. 이 접근 방식은 종종 허용되지만 일부 개발자는 유지 관리 가능성 및 테스트 가능성 문제와 같은 다양한 이유로 전역 변수를 피하는 것을 선호합니다.

미들웨어

미들웨어는 다음을 허용하는 메커니즘입니다. 개발자는 요청이 핸들러에 도달하기 전에 가로채서 처리합니다. 가능한 해결 방법은 요청 컨텍스트에 데이터베이스 개체를 추가하는 미들웨어 기능을 만드는 것입니다. 그런 다음 이 미들웨어를 사용하여 데이터베이스를 핸들러에 삽입할 수 있습니다.

예:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
    "gorm.io/gorm"
)

func main() {
    db := createDB()

    mux := mux.NewRouter()
    mux.Use(func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // Add the database object to the request context
            r.Context() = context.WithValue(r.Context(), "db", db)
            // Pass the request to the next handler
            next.ServeHTTP(w, r)
        })
    })

    mux.HandleFunc("/users/{id}", showUserHandler).Methods("GET")
}

func showUserHandler(w http.ResponseWriter, r *http.Request) {
    // Retrieve the database object from the request context
    db := r.Context().Value("db").(*gorm.DB)

    fmt.Fprintf(w, "We should fetch the user with id %s", mux.Vars(r)["id"])
}

래퍼 함수

또 다른 해결 방법은 다음과 같습니다. 추가 매개변수를 허용하는 래퍼 함수를 ​​만듭니다. 예를 들면 다음과 같습니다.

db := createDB()

mux := mux.NewRouter()
mux.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
    showUserHandler(w, r, db)
}).Methods("GET")

결론

미들웨어 사용 및 래퍼 기능 생성을 포함하여 Gorilla Mux의 요청 처리기에 인수를 전달하는 방법에는 여러 가지가 있습니다. 최선의 접근 방식은 개발자의 특정 요구 사항과 선호도에 따라 달라집니다.

위 내용은 Gorilla Mux의 요청 처리기에 인수를 어떻게 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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