2014-04-15 18 views
10

Ứng dụng của tôi đang từ chối điều này, nhưng khi tôi cuộn dữ liệu đang hoạt động, có vẻ như có một nơi nào đó mà tôi nhầm lẫn với cách nén tải trọng http này trong Go.Cách GZIP Nén yêu cầu http trong Go?

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) 

Có ai đó thấy tôi đang gặp sự cố không?

Trả lời

8

Hình như vấn đề chính là tôi cần thiết để đóng Writer 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

bạn không cần phải quấn buf trong một 'byte.Reader' - nó đã hoàn thành giao diện Reader. – JimB

+0

@JimB: Các biến thể khác nhau dường như trả lại lỗi, bạn có thể cho tôi thấy sự thay đổi mã thực tế mà bạn đề xuất không? –

+1

(phỏng đoán của tôi) Buffer.Read có trình thu thập con trỏ để bạn cần địa chỉ của buf, ví dụ: 'http.NewRequest (" POST ", q.host, & buf)' – JimB

4

Một cách khác để làm điều này là sử dụng các chức năng sao chép

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 
    }  
} 
Các vấn đề liên quan