我有简单的Web应用程序和CRUD操作,我想使用相同的端口地址和不同的Handle模式提供网页和API路由。如下,
fs := http.FileServer(http.Dir("server/webapps/play_maths"))
http.Handle("/", fs)
http.Handle("/api", call API routes)
以下是我的API路线
func UserRoutes() *mux.Router {
var router = mux.NewRouter()
router = mux.NewRouter().StrictSlash(true)
router.HandleFunc("/user/create", api.CreateUser)
router.HandleFunc("/user/get/all", api.GetAllUsers)
return router
}
答案 0 :(得分:1)
开箱即用的net/http
包支持此功能。引自http.ServeMux
:
模式名称是固定的,有根的路径,如“/favicon.ico”,或有根的子树,如“/ images /”(请注意尾部斜杠)。 较长的模式优先于较短的模式,因此如果有“/ images /”和“/ images / thumbnails /”注册的处理程序,则后面的处理程序将被调用以开始的路径为“/ images / thumbnails /“并且前者将接收”/ images /“子树中任何其他路径的请求。
因此,您可以将文件处理程序注册到路径/
,并将API处理程序注册到例如/api/
。 /api/
路径。在这种情况下,任何以/api/
开头的请求都将定向到API处理程序,任何其他请求都将定向到文件处理程序。
请注意,这当然意味着如果/api/
文件夹中有文件(或更具体地说,其请求路径以{{1}}开头),则由于上述原因,它们将无法访问
答案 1 :(得分:0)
我对我的代码进行了更换操作,现在它正按照我的预期运行。
func main() {
//Starting the API server
router := routes.UserRoutes()
http.Handle("/api/", router)
//Starting the FileServer
fs := http.FileServer(http.Dir("server/webapps/play_maths"))
http.Handle("/", fs)
log.Println("Listening...")
log.Fatal(http.ListenAndServe(":3000", nil))
}
然后我改变我的路线如下。
func UserRoutes() *mux.Router {
var router = mux.NewRouter()
router = mux.NewRouter().StrictSlash(true)
router.HandleFunc("/api/user/create", api.CreateUser)
router.HandleFunc("/api/user/get/all", api.GetAllUsers)
return router
}