【问题标题】:golang return static html file at specified routegolang在指定路径返回静态html文件
【发布时间】:2014-08-20 06:02:45
【问题描述】:

我正在开发一个简单的 todo 应用程序。

我已经确定除了用户的待办事项列表之外的所有页面都可以安全地成为静态 html 页面。 * 登录表格 * 新账户表格 * 讨论待办事项应用程序的索引页面

我认为目前没有理由让这些成为 Go 模板。

我的问题是如何(在 go 中,不使用 nginx 之类的东西)我可以设置一个静态 html 以最有效地在特定路线返回?

例如要在“/”处返回的 index.html

我知道我可以这样做:

func GetNewAccount(res http.ResponseWriter, req *http.Request) {
        body, _ := ioutil.ReadFile("templates/register.html")
        fmt.Fprint(res, string(body))
}

var register, _ = string(ioutil.ReadFile("templates/register.html"))
func GetNewAccount(res http.ResponseWriter, req *http.Request) {
        fmt.Fprint(res, register)
}

对我来说,这些似乎是更迂回的方式来做一些看似简单的事情。

【问题讨论】:

    标签: go gorilla


    【解决方案1】:

    如果你所有的静态文件都在同一棵树下,你可以使用http.FileServer:

    http.Handle("/s/", http.StripPrefix("/s/", http.FileServer(http.Dir("/path/to/static/files/"))))
    

    否则,将您想要的 html 文件预加载到 func init() 中的地图中,然后根据请求的路径为 fmt.Fprint 制作一个处理程序应该可以工作。

    简单的静态文件处理程序示例:

    func StaticFilesHandler(path, prefix, suffix string) func(w http.ResponseWriter, req *http.Request) {
        files, err := filepath.Glob(filepath.Join(path, "*", suffix))
        if err != nil {
            panic(err)
        }
        m := make(map[string][]byte, len(files))
        for _, fn := range files {
            if data, err := ioutil.ReadFile(fn); err == nil {
                fn = strings.TrimPrefix(fn, path)
                fn = strings.TrimSuffix(fn, suffix)
                m[fn] = data
            } else {
                panic(err)
            }
        }
        return func(w http.ResponseWriter, req *http.Request) {
            path := strings.TrimPrefix(req.URL.Path, prefix)
            if data := m[path]; data != nil {
                fmt.Fprint(w, data)
            } else {
                http.NotFound(w, req)
            }
        }
    }
    

    然后你可以像这样使用它:

    http.Handle("/s/", StaticFilesHandler("/path/to/static/files", "/s/", ".html"))
    

    【讨论】:

    • 这让我很吃惊。这可能看起来很傻,但我要做的就是能够在没有文件扩展名的情况下使用服务器模板。显然,在生产中,像 apache 或 ngnix 这样的东西可以做到这一点,但我想在应用程序中保留所有这些逻辑。
    • 自己实现比较容易,我加了一个例子。
    【解决方案2】:

    或者只是使用第三方库并执行以下操作:

    iris.StaticServe("/path/to/static/files","/theroute") //gzip compression enabled
    

    上面的代码sn-p是Iris的一部分

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多