所以我遇到了一个问题,我只能让我的API端点工作或我的静态文件工作。我使用gorilla / mux作为我的路由器,我可能与配置它有关。
我认为有四个文件在这种情况下很重要:
main.go
func main() {
envVars()
router := NewRouter()
log.Fatal(http.ListenAndServe(":8080", router))
}
router.go
func NewRouter() *mux.Router {
// create new router
router := mux.NewRouter()
for _, route := range routes {
var handler http.Handler
handler = route.HandlerFunc
handler = Logger(handler, route.Name)
router.
Methods(route.Method).
Path(route.Pattern).
Name(route.Name).
Handler(route.HandlerFunc)
}
return router
}
routes.go
var routes = Routes{
Route{
// TODO: Find way to render static file
"Index",
"GET",
"/",
Index,
},
Route{
"PostIndex",
"GET",
"/api/posts",
PostIndex,
},
Route{
"PostCreate",
"POST",
"/api/posts",
PostCreate,
},
}
handlers.go
func Index(w http.ResponseWriter, r *http.Request) {
// TODO: Something to render html file
}
从研究开始,我认为我可以使用子路由器,但似乎应该有更好的方法来做这件事。对于我的所有其他路由,我已经实现了方法但是为了渲染一个html文件,我不确定该方法中会放什么。
要查看整个项目,请访问:https://github.com/nicholasrucci/blog
我找到了this source。它与我正在经历的情况类似。
答案 0 :(得分:1)
<强>更新强> 修复错误的代码。仅将文件服务器绑定到根路径,其他处理程序可以自由使用其他路由。
删除 routes.go 中的索引路线并更新 router.go ,如下所示:
func NewRouter() *mux.Router {
// create new router
router := mux.NewRouter()
for _, route := range routes {
var handler http.Handler
handler = route.HandlerFunc
handler = Logger(handler, route.Name)
router.
Methods(route.Method).
Path(route.Pattern).
Name(route.Name).
Handler(route.HandlerFunc)
}
router.Path("/").Handler(http.FileServer(http.Dir("public/")))
return router
}
这会在您域的根目录下的公共目录中公开index.html文件。
答案 1 :(得分:0)
我最终做的是制作模板功能并从那里渲染我的HTML。
func Index(w http.ResponseWriter, r *http.Request) {
t := template.New("Test")
t, err = t.Parse("<html><body>Hello World</body></html>)
if err != nil {
log.Fatal(err)
}
err = t.Execute(w, t)
if err != nil {
log.Fatal(err)
}
}