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

时间:2018-01-15 08:56:02

标签: http go httprouter

我使用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'

1 个答案:

答案 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处理程序,其余的将尝试由文件服务器处理。