如何在golang web中gzip模板

如何在golang web中gzip模板,web,go,gzip,Web,Go,Gzip,我已经设置了contest encoding的值,但是我如何才能gzip模板,因为文件仍然太大了 func indexPageHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Encoding", "gzip") r.Header.Set("Accept-Encoding", "gzip") tmpl, err := template.New("index.html").Pa

我已经设置了contest encoding的值,但是我如何才能gzip模板,因为文件仍然太大了

func indexPageHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Encoding", "gzip")
    r.Header.Set("Accept-Encoding", "gzip")
    tmpl, err := template.New("index.html").ParseGlob("./templates/*")
    if err != nil {
        log.Println(err)
        return
    }   
    err = tmpl.Execute(w, nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }   
}
是否有任何函数可以gzip响应?]

根据建议,我将代码更改为:

func indexPageHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Encoding", "gzip")
    r.Header.Set("Accept-Encoding", "gzip")
    gz := gzip.NewWriter(w)
    defer gz.Close()
    tmpl, err := template.New("index.html").ParseGlob("./templates/*")
    if err != nil {
        log.Println(err)
        return
    }   
    err = tmpl.Execute(gz, nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }   
}
但是当我查询url时,我只下载gzip文件。有什么问题吗?

您可以使用软件包:

func NewWriter(w io.Writer)*Writer

NewWriter返回一个新的Writer。
对返回的写入程序的写入将被压缩并写入w

调用方有责任在WriteCloser上调用Close
完成后。写入操作可能会被缓冲,直到关闭后才会刷新

在代码中,它可能如下所示:

gz := gzip.NewWriter(w)
defer gz.Close()

err = tmpl.Execute(gz, nil)
if err != nil {
    http.Error(gz, err.Error(), http.StatusInternalServerError)
    return
}
Ps.


您可能需要检查请求中的
接受编码
标题,查看浏览器是否接受gzip编码的内容。

无论如何,我还没有解决这个问题。正如我提到的,当我添加此代码、重新启动服务器并查询此url时,我实际上下载了zip文件

最后,我使用Nginx制作了一个反向代理来压缩模板。它起作用了

还是要感谢@Anisus

在请求上设置标题无效。您需要阅读此标题以确定是否使用gzip

浏览器下载文件而不是呈现文件的原因是缺少内容类型。当您在未设置内容类型的情况下写入http.ResponseWriter时,会有一个算法确定内容类型并设置正确的头。但是由于你的身体被压缩,它无法确定正确的内容类型。在将任何数据写回客户端之前添加以下内容:

w.Header().Set("Content-Type", "text/html")

这有点晚了,但我希望其他人会觉得这很有用

代码可以正常工作,但您需要将标题设置为由浏览器正确解释:

w.Header().Add("Content-Type","text/html")
w.Header().Add("Content-Encoding","gzip")

也不要在处理程序中解析模板,特别是如果它很大的话。有关详细信息,请参见@icza,它与全局变量无关。由于.js和.css文件太大,浏览器下载web内容需要花费太多的时间。我尝试过这段代码,但当我查询此url时。我只加载这个zip文件。上面给出了我的代码
w.Header().Add("Content-Type","text/html")
w.Header().Add("Content-Encoding","gzip")