我在使用gorilla/mux时遇到了一个问题。
我已经声明了一个端点和特定的子路径,但是当我试图调用子路径之前调用它的主路径,它返回给我一个404错误。
这就是我的schema:
main.go:services.StartRestService()
on services package:
func StartRestService() {
log.Println("Loading Rest Service")
router := mux.NewRouter()
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { mainHandleRequests(w, r, router) }).Methods("GET")
http.Handle("/", router)
log.Fatal(http.ListenAndServe(":8083", router))
}
在同一个服务包中的另一个go文件上:
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the HomePage!")
fmt.Println("Endpoint Hit: homePage")
}
func pong(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Pong!")
fmt.Println("Endpoint Hit: pong")
}
func mainHandleRequests(w http.ResponseWriter, r *http.Request, router *mux.Router) {
homePage(w, r)
router.HandleFunc("/ping", pong)
}
运行我的应用程序,如果我尝试调用http://localhost:8083/ping,它返回我404未找到。只有当我调用http://localhost:8083,然后调用ping端点时,它才能工作。
怎么了?
是的,直到mainhandlerrequests被调用一次,路由器才会意识到/ping端点。
因此,路由器应该被设置好,然后不能被来电以任何方式触摸或改变。
我已经重构了你的代码:
func homePageHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the HomePage!")
fmt.Println("Endpoint Hit: homePage")
}
func pongHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Pong!")
fmt.Println("Endpoint Hit: pong")
}
func main() {
log.Println("Loading Rest Service")
router := mux.NewRouter()
router.Path("/").Methods(http.MethodGet).HandlerFunc(homePageHandler)
router.Path("/ping").Methods(http.MethodGet).HandlerFunc(pongHandler)
log.Fatal(http.ListenAndServe(":8083", router))
}