我正在尝试使用 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))
}
Run Code Online (Sandbox Code Playgroud)
另一个通用handlers.go文件中的基本处理程序注册方法
func RegisterRoutes(sub *mux.Router) {
user.RegisterRoutes(sub)
}
Run Code Online (Sandbox Code Playgroud)
还有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)
}
Run Code Online (Sandbox Code Playgroud)
我正在测试我在上面设置的路径,并提出了一个奇怪的行为:
测试 - 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。(这是奇怪的行为)
当我使用 url 末尾的斜杠向端点(localhost:3000/api/users/)发送 POST 时,它会触发 GET 而不是 POST。
有人在使用 Gorilla Mux 时遇到过这种行为吗?
具体问题是mux issues 79,该问题仍然悬而未决(即使已关闭),也可以在mux issues 254中看到
这似乎也与mux 问题 145有关:StrictSlash 令人困惑
这
“当为 true 时,如果路由路径是“/path/”,则访问“/path”将重定向到前者,反之亦然。换句话说,您的应用程序将始终看到路由中指定的路径。”
和
“当为 false 时,如果路由路径是“/path”,则访问“/path/”将不匹配该路由,反之亦然。”
应该倒置,因为
strict==true
应该意味着不允许尾随斜杠。
它的名称和文档令人困惑。