将参数传递给请求处理程序
使用 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中文网其他相关文章!