【问题标题】:Gorilla Mux Subroute Methods POST request trigger GETGorilla Mux 子路由方法 POST 请求触发 GET
【发布时间】:2024-04-14 19:15:01
【问题描述】:

我正在尝试使用 Gorilla Mux 在 Go 中开发一个简单的 REST API。

我有 ma​​in.go,它注册了上面的简单路径并启动服务器以侦听端口 3000。

func main() {
    router := mux.NewRouter().StrictSlash(true)
    sub := router.PathPrefix("/api/v1").Subrouter()
    handlers.RegisterRoutes(sub)

    log.Fatal(http.ListenAndServe(":3000", router))
}

另一个通用 handlers.go 文件中的基本处理程序注册方法

func RegisterRoutes(sub *mux.Router) {
    user.RegisterRoutes(sub)
}

还有 user.handler.go 文件,它注册了“/user”子路由:

func RegisterRoutes(sub *mux.Router) {
    userRoutes := sub.StrictSlash(true).Path("/users").Subrouter()

    userRoutes.Methods("POST").HandlerFunc(getUsers)
    userRoutes.Methods("GET").HandlerFunc(getUsers)
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    user := User{Name: "test", Password: "test"}

    fmt.Printf("%+v\n", r.Method)

    json.NewEncoder(w).Encode(user)
}

我正在测试我在上面设置的路径,并想出了一个奇怪的行为:

测试 - GET - localhost:3000/api/v1/users => 在控制台中打印 GET。 (如预期) 测试 - GET - localhost:3000/api/v1/users/ => 在控制台中打印 GET。 (如预期) 测试 - POST - localhost:3000/api/v1/users => 在控制台中打印 POST。 (如预期) 测试 - POST - localhost:3000/api/v1/users/ => 在控制台中打印 GET。 (这是奇怪的行为)

当我向端点(localhost:3000/api/users/)发送 POST 并在 url 末尾带有斜杠时,它会触发 GET 而不是 POST。

有人在使用 Gorilla Mux 时遇到过这种行为吗?

【问题讨论】:

    标签: go gorilla


    【解决方案1】:

    具体问题是mux issue 79,它仍然处于待处理状态(即使已关闭),也可以在mux issue 254 中看到

    这似乎也与mux issue 145有关:StrictSlash 令人困惑

    这个

    “当为真时,如果路由路径是“/path/”,访问“/path”将重定向到前者,反之亦然。换句话说,您的应用程序将始终看到路由中指定的路径。”

    "当为false时,如果路由路径为"/path",访问"/path/"将不匹配该路由,反之亦然。"

    应该倒置,因为strict==true 应该意味着不允许使用斜杠。
    它的名称和文档令人困惑。

    【讨论】: