我使用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'
答案 0 :(得分:4)
正如其他人所指出的那样,仅使用github.com/julienschmidt/httprouter
是不可能的。
请注意,使用标准库的多路复用器可以实现这一点,详见答案:How do I serve both web pages and API Routes by using same port address and different Handle pattern
如果您必须在根目录中提供所有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
处理程序,其余的将尝试由文件服务器处理。