如何为golang gin框架返回gzip响应

时间:2016-07-19 14:17:58

标签: go gzip go-gin

我尝试使用golang框架gin返回gzip响应。

他们在这里提供一个例子: https://github.com/gin-gonic/contrib/blob/master/gzip/example/example.go

package main

import (
    "fmt"
    "github.com/gin-gonic/contrib/gzip"
    "github.com/gin-gonic/gin"
    "time"
)

func main() {
    r := gin.Default()
    r.Use(gzip.Gzip(gzip.DefaultCompression))
    r.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))
    })

    // Listen and Server in 0.0.0.0:8080
    r.Run(":8080")
}

当我使用这个例子时,它没有返回gzip压缩内容。

使用上面的代码,我从curl

获得以下输出
curl -v -H "Accept-Encoding: gzip" 'http://localhost:8080/ping'

Trying ::1...
Connected to localhost (::1) port 8080 (#0) GET /ping HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.43.0 Accept: / Accept-Encoding: gzip
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Content-Type: text/plain; charset=utf-8
< Vary: Accept-Encoding
< Date: Mon, 18 Jul 2016 17:20:56 GMT
< Content-Length: 38
<

Connection #0 to host localhost left intact pong 1468862456?n????

请注意,内容未经过gzip压缩,并且添加了额外的垃圾字符。

&#34; 2 N ????&#34;

到目前为止,我无法弄清楚如何让它返回gzip。我认为示例代码中存在错误,但我无法搞清楚。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

其他人对gzip有疑问。他们的拉动请求为我解决了这个问题。这是gin框架的gzip包中的一个错误。

contrib / gzip / gzip.go

中缺少此方法
func (g *gzipWriter) WriteString(s string) (n int, err error) {
    return g.writer.Write([]byte(s))
}

链接到包含拉取请求的原始问题。 https://github.com/gin-gonic/contrib/pull/59

一旦项目所有者接受了拉取请求,就会解决此问题。