如何使用相同的端口地址和不同的Handle模式同时提供网页和API路由

时间:2017-11-26 07:05:56

标签: api http go

我有简单的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
}

2 个答案:

答案 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
}