在 root 上提供静态内容并在 /api 上休息
Serve static content on root and rest on /api
我正在使用 httprouter 从 api 调用中的路径解析一些参数:
router := httprouter.New()
router.GET("/api/:param1/:param2", apiHandler)
并想将一些文件添加到根目录 (/
) 以供使用。只是 index.html
、script.js
和 style.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
处理程序,其余的将尝试由文件服务器处理。
我正在使用 httprouter 从 api 调用中的路径解析一些参数:
router := httprouter.New()
router.GET("/api/:param1/:param2", apiHandler)
并想将一些文件添加到根目录 (/
) 以供使用。只是 index.html
、script.js
和 style.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
处理程序,其余的将尝试由文件服务器处理。