Gorilla Mux Subroute方法POST请求触发GET

时间:2017-10-02 04:39:45

标签: go gorilla

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

我有 main.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" subroute:

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)
}

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

Test - GET - localhost:3000/api/v1/users  => Prints GET in console. (as expected)
Test - GET - localhost:3000/api/v1/users/  => Prints GET in console. (as expected)
Test - POST - localhost:3000/api/v1/users  => Prints POST in console. (as expected)
Test - POST - localhost:3000/api/v1/users/  => Prints GET in console. (And here is the strange behavior)

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

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

1 个答案:

答案 0 :(得分:1)

具体问题是mux issue 79,该问题仍然悬而未决(即使已关闭),也见于mux issue 254

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

  

     
    

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

  
     

     
    

“如果为false,如果路径路径为”/ path“,则访问”/ path /“将不匹配此路由,反之亦然。”

  
     

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