如何在golang web中gzip模板
我已经设置了contest encoding的值,但是我如何才能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
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")