【问题标题】:Go: Serve static pages (their endpoints) along side my API endpointsGo:在我的 API 端点旁边提供静态页面(它们的端点)
【发布时间】:2016-04-12 23:17:08
【问题描述】:

所以我遇到了一个问题,我只能让我的 API 端点工作或我的静态文件工作。我正在使用 gorilla/mux 作为我的路由器,我可能与配置它有关。

我有四个文件我认为在这种情况下很重要:

ma​​in.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。这与我正在经历的相似。

【问题讨论】:

  • 如果您不使用模板,只需读取文件并将其写入处理程序中的 responsewriter,如果您使用模板,只需将静态 html 文件放在那里,它将被用作是因为它没有要替换的占位符/代码。

标签: go gorilla


【解决方案1】:

更新 修复错误的代码。仅将文件服务器绑定到根路径,其他路由可供其他处理程序使用。

删除 routes.go 中的 Index 路由并像这样更新 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 文件。

【讨论】:

  • 是的,我认为这可以解决问题。当我这样做时,我没有得到404 not found,但我也没有得到预期的文件说"Hello World"
  • 我的错。我已经更新了答案,这次我克隆了你的 repo 并测试了它是否有效:)
  • 这使得可以完全按照您所说的去做,但是当/api/posts 被击中时,它消除了返回 JSON 的可能性。
  • 该死。我再次更新了解决方案。尚未测试需要数据库连接的处理程序,但希望这会更好。 :)
  • 您实际上是在正确的道路上。重要路径的顺序。它必须在我的 api 路由之下。
【解决方案2】:

我最终做的是制作一个模板函数并从那里渲染我的 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)
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2022-10-04
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2019-12-23
    相关资源
    最近更新 更多