首页  >  文章  >  后端开发  >  如何将参数传递给 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