2

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

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

并想将一些文件添加到根 ( /) 以提供服务。只是和。index.html_ 全部在一个名为的本地目录中script.jsstyle.cssstatic

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'

4

1 回答 1

7

正如其他人指出的那样,仅使用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处理程序,其余的将尝试由文件服务器处理。

于 2018-01-15T09:29:08.423 回答