2014-04-15 11 views
10

La mia applicazione sta rifiutando questo, ma quando arriccia i dati sta funzionando, quindi sembra che ci sia da qualche parte che sono confuso con come comprimere questo payload http in Go.Come GZIP Comprimere una richiesta http in 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) 

Qualcuno vede dove sto andando male?

risposta

8

Sembra che il problema principale è che avevo bisogno di chiudere il 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

non c'è bisogno di avvolgere buf in un 'bytes.Reader' - soddisfa già un'interfaccia Reader. – JimB

+0

@JimB: varie variazioni sembrano restituire un errore, puoi mostrarmi il cambio di codice che consigli? –

+1

(suppongo) Buffer.Read ha un ricevitore puntatore quindi è necessario l'indirizzo di buf, ad es. 'http.NewRequest (" POST ", q.host, & buf)' – JimB

4

Un altro modo per farlo è quello di utilizzare la funzione di copia

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 
    }  
} 
Problemi correlati