POST 之前的 gzip JSON 负载

我有一个 JSON 类型的对象[]byte,是我使用json.Marshal. 我想先对 JSON 进行 GZip,然后再将其发布到我的端点。以下不起作用:

gz := gzip.NewWriter(myJSON)

因为[]byte不落实io.Writer

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


qq_笑_17
浏览 91回答 2
2回答

UYOU

压缩到缓冲区并发布该缓冲区。 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")

慕盖茨4494581

最好的选择是将 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go