Go:在我的API端点旁边提供静态页面(它们的端点)

时间:2016-04-12 23:17:08

标签: go gorilla

所以我遇到了一个问题,我只能让我的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。它与我正在经历的情况类似。

2 个答案:

答案 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)
    }
}