POST之前GoLang中的GZip JSON有效负载

时间:2019-07-11 18:00:41

标签: json go gzip

我有一个[]byte类型的JSON对象,它是使用json.Marshal从一个结构创建的。我想在将JSON发布到端点之前先将其压缩。以下内容不起作用:

gz := gzip.NewWriter(myJSON)

因为[]byte未实现io.Writer

一旦创建了JSON,是否有一些非常简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:4)

压缩到缓冲区并发布该缓冲区。

 var buf bytes.Buffer
 gz := gzip.NewWriter(&buf)
 gz.Write(myJSON)
 gz.Close()

由于*bytes.Bufferio.Reader接口进行了统计,因此您可以在创建请求时直接使用缓冲区。

 req, err := http.NewRequest("POST", url, &buf)
 if err != nil {
     // handle error
 }
 req.Header.Set("Content-Encoding", "gzip")
 req.Header.Set("Content-Type", "application/json; charset=utf-8")

答案 1 :(得分:1)

最好的选择是将JSON封送处理流式传输到gzip编写器:

func compressJSON(w io.Writer, i interface{}) error {
    gz := gzip.NewWriter(w)
    if err := json.NewEncoder(gz).Encode(i); err != nil {
        return err
    }
    return gz.Close()
}

它的优点是不会将json临时存储在内存中,因此会更快并且使用更少的RAM。

如果您需要将其作为io.Reader,例如HTTP请求的正文,则可以使用管道进行转换:

r, w := io.Pipe()
go func() {
    err := compressJSON(w, someObject)
    w.CloseWithError(err)
}()
req, err := http.NewRequest("POST", "http://example.com/", r)