为Go提供gzip压缩内容

Ric*_*777 40 webserver http go

我开始在Go中编写服务器端应用程序.我想使用Accept-Encoding请求标头来确定是否GZIP响应实体.我曾希望使用http.Serve或http.ServeFile方法直接找到一种方法.

这是一个非常普遍的要求; 我错过了什么或者我需要推出自己的解决方案吗?

Mos*_*vah 23

纽约时报发布了针对Gogzip中间件包.

你只需要http.HandlerFunc通过他们GzipHandler,你就完成了.它看起来像这样:

package main

import (
    "io"
    "net/http"
    "github.com/nytimes/gziphandler"
)

func main() {
    withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain")
        io.WriteString(w, "Hello, World")
    })

    withGz := gziphandler.GzipHandler(withoutGz)

    http.Handle("/", withGz)
    http.ListenAndServe("0.0.0.0:8000", nil)
}
Run Code Online (Sandbox Code Playgroud)

  • @commonSenseCode我看不到http在哪里? (4认同)

rpu*_*kar 22

更新

现在有开箱即用的gzip支持,请参阅链接获取更多信息:https://golang.org/pkg/compress/gzip/


老答案

目前还没有对gzip压缩的HTTP响应提供"开箱即用"的支持.但添加它是非常微不足道的.看一下

https://gist.github.com/the42/1956518

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/cgUp8_ATNtc

  • 如果http.ServeFile方法检查是否存在xxx.gz并且如果存在则提供它并且accept头包括gzip,那么"很高兴".这是nginx的一个技巧,它极大地加速了静态css,js等文件的服务,因为它们在构建过程中只能被压缩一次.还有一个额外的好处是它们是要读取的较小文件,以及需要更少的字节数. (4认同)