在 root 上提供静态内容并在 /api 上休息

Serve static content on root and rest on /api

我正在使用 httprouter 从 api 调用中的路径解析一些参数:

router := httprouter.New()
router.GET("/api/:param1/:param2", apiHandler)

并想将一些文件添加到根目录 (/) 以供使用。只是 index.htmlscript.jsstyle.css。全部在名为 static

的本地目录中
router.ServeFiles("/*filepath", http.Dir("static"))

这样我就可以使用浏览器访问 localhost:8080/,它将提供 index.html 并且来自浏览器的 js 将调用 /api/:param1/:param2

但此路径与 /api 路径冲突。

panic: wildcard route '*filepath' conflicts with existing children in path '/*filepath'

正如其他人指出的那样,仅使用 github.com/julienschmidt/httprouter 是不可能的。

请注意,这可以使用标准库的多路复用器,详见此答案:

如果您必须在根目录提供所有 Web 内容,另一个可行的解决方案是混合使用标准路由器和 julienschmidt/httprouter。使用标准路由器在根目录下注册和提供您的文件,并使用 julienschmidt/httprouter 提供您的 API 请求。

它可能是这样的:

router := httprouter.New()
router.GET("/api/:param1/:param2", apiHandler)

mux := http.NewServeMux()
mux.Handle("/", http.FileServer(http.Dir("static")))
mux.Handle("/api/", router)

log.Fatal(http.ListenAndServe(":8080", mux))

在上面的示例中,所有以 /api/ 开头的请求都将转发到 router 处理程序,其余的将尝试由文件服务器处理。