2014-04-15 4 views
10

Meine Anwendung lehnt dies ab, aber wenn ich die Daten locke, funktioniert es. Es scheint also, dass ich irgendwo verwirrt bin, wie ich diese http-Nutzdaten in Go komprimiere.How to GZIP Komprimiere eine HTTP-Anfrage 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) 

Kann jemand sehen, wo ich falsch liege?

Antwort

8

Sieht aus wie das Hauptproblem ist, dass ich die gzip Writer zu schließen benötigt:

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

Sie nicht wickeln müssen buf in einem 'Bytes.Reader' - es erfüllt bereits eine Reader-Schnittstelle. – JimB

+0

@ JimB: Verschiedene Variationen scheinen einen Fehler zurückzugeben, können Sie mir die tatsächliche Codeänderung zeigen, die Sie empfehlen? –

+1

(meine Vermutung) Buffer.Read hat einen Zeiger Empfänger, so dass Sie die Adresse von buf benötigen, z. 'http.NewRequest (" POST ", q.host, & buf)' – JimB

4

Ein anderer Weg, dies zu tun, ist die Verwendung der Kopierfunktion

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