为了账号安全,请及时绑定邮箱和手机立即绑定

POST 之前的 gzip JSON 负载

POST 之前的 gzip JSON 负载

Go
qq_笑_17 2023-07-04 09:57:07
我有一个 JSON 类型的对象[]byte,是我使用json.Marshal. 我想先对 JSON 进行 GZip,然后再将其发布到我的端点。以下不起作用:gz := gzip.NewWriter(myJSON)因为[]byte不落实io.Writer。一旦我创建了 JSON,是否有一些非常简单的方法可以做到这一点?
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

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


 var buf bytes.Buffer

 gz := gzip.NewWriter(&buf)

 gz.Write(myJSON)

 gz.Close()

因为a*bytes.Buffer是静态io.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")


查看完整回答
反对 回复 2023-07-04
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

最好的选择是将 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)


查看完整回答
反对 回复 2023-07-04
  • 2 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信