2014-04-15 176 views
10

我的應用程序拒絕了這個,但是當我蜷縮它正在工作的數據時,所以似乎有一個地方讓我對Go中壓縮這個http有效載荷感到困惑。如何在GZIP中壓縮http請求?

var buf bytes.Buffer 
    g := gzip.NewWriter(&buf) 
    g.Write([]byte("apples") 
    req, err := http.NewRequest("POST", q.host, bytes.NewReader(buf.Bytes())) 
    ... 
    req.Header.Set("Content-Type", "text/plain") 
    req.Header.Set("Content-Encoding", "gzip") 
    resp, err := client.Do(req) 

是否有人看到我錯了?

回答

8

貌似主要問題是,我需要關閉gzip的作家:

b, err := batch.Json() 
.... 
var buf bytes.Buffer 
g := gzip.NewWriter(&buf) 
if _, err = g.Write(b); err != nil { 
    slog.Error(err) 
    return 
} 
if err = g.Close(); err != nil { 
    slog.Error(err) 
    return 
} 
req, err := http.NewRequest("POST", q.host, &buf) 
+1

你不需要包buf in'bytes.Reader' - 它已經實現了Reader接口。 – JimB

+0

@JimB:各種變體似乎都會返回錯誤,您能否告訴我您推薦的實際代碼更改? –

+1

(我的猜測)Buffer.Read有一個指針接收器,所以你需要buf的地址,例如'http.NewRequest(「POST」,q.host,&buf)' – JimB

4

另一種方式來做到這一點是使用複印功能

func HttpHandler2(req *http.Request) { 
    var b bytes.Buffer 
    var buf bytes.Buffer 
    g := gzip.NewWriter(&buf) 

    _, err := io.Copy(g, &b) 
    if err != nil { 
     slog.Error(err) 
     return 
    }  
}