在我的Go应用程序中,我使用的是 gorilla /mux。
我想拥有http://host:3000/
从“前端”子目录和静态提供文件http://host:3000/api/
及其子路径由指定函数提供。
使用下面的代码,这两个调用都不起作用。/index.html
是唯一没有这样做的代码(但不是正在加载的资源)。我究竟做错了什么?
package main
import (
"log"
"net/http"
"fmt"
"strconv"
"github.com/gorilla/mux"
)
func main() {
routineQuit := make(chan int)
router := mux.NewRouter().StrictSlash(true)
router.PathPrefix("/").Handler(http.FileServer(http.Dir("./frontend/")))
router.HandleFunc("/api", Index)
router.HandleFunc("/api/abc", AbcIndex)
router.HandleFunc("/api/abc/{id}", AbcShow)
http.Handle("/", router)
http.ListenAndServe(":" + strconv.Itoa(3000), router)
<- routineQuit
}
func Abc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Index!")
}
func AbcIndex(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Todo Index!")
}
func AbcShow(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
todoId := vars["todoId"]
fmt.Fprintln(w, "Todo show:", todoId)
}
最佳答案
gorilla 的多路复用路由按添加顺序进行评估。因此,使用匹配请求的第一条路线。
在您的情况下,/
处理程序将匹配每个传入的请求,然后在frontend/
目录中查找文件,然后显示404错误。您只需要交换您的路线订单即可运行它:
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/api/abc/{id}", AbcShow)
router.HandleFunc("/api/abc", AbcIndex)
router.HandleFunc("/api", Abc)
router.PathPrefix("/").Handler(http.FileServer(http.Dir("./frontend/")))
http.Handle("/", router)