亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號