在root上提供静态内容,在/ api上提供静态内容

mic*_*oo8 1 http go httprouter

我使用httprouter从API调用路径解析的一些参数:

router := httprouter.New()
router.GET("/api/:param1/:param2", apiHandler)
Run Code Online (Sandbox Code Playgroud)

并希望将一些文件添加到根目录(/)进行投放。这只是index.htmlscript.jsstyle.css。全部位于名为static

router.ServeFiles("/*filepath", http.Dir("static"))
Run Code Online (Sandbox Code Playgroud)

这样我就可以与浏览器一起使用localhost:8080/,它将开始提供服务index.html,而js来自浏览器的会调用/api/:param1/:param2

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

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

icz*_*cza 6

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

请注意,这可以使用标准库的多路复用器来实现,如以下答案所述:我如何通过使用相同的端口地址和不同的句柄模式来服务网页和API路由

如果您必须从根本上提供所有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))
Run Code Online (Sandbox Code Playgroud)

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