Golang:默认 HTTP 客户端不处理压缩

eee*_*eee 0 compression http go

我正在尝试执行 HTTP 请求,并让 golang 添加accept-encoding标头,并在响应被压缩时自动解压缩响应。我的印象是默认的 HTTP 客户端应该透明地处理它?但它似乎并没有:

    req, _ := http.NewRequest("Get", "https://stackoverflow.com", nil)
    // req.Header.Add("Accept-Encoding", "gzip")
    client := &http.Client{}
    resp, _ := client.Do(req)
    println(resp.Header.Get("Content-Encoding"))
Run Code Online (Sandbox Code Playgroud)

如果我手动添加接受编码,它会发送标头,但我必须手动解压缩响应。

Cer*_*món 8

如果 Transport 自行请求 gzip 并获得 gzip 响应,则该响应将被透明解压缩。在这种情况下,传输会从响应中删除 Content-Encoding 标头。检查响应。未压缩字段以确定响应是否未压缩。

req, _ := http.NewRequest("Get", "https://stackoverflow.com", nil)
resp, _ := http.DefaultClient.Do(req)
fmt.Println(resp.Uncompressed) // prints true
fmt.Println(resp.Header.Get("Content-Encoding"))  // prints blank line
Run Code Online (Sandbox Code Playgroud)

如果应用程序显式请求 gzip,则响应将按原样返回。

req, _ := http.NewRequest("Get", "https://stackoverflow.com", nil)
req.Header.Add("Accept-Encoding", "gzip")  
client := &http.Client{}
resp, _ := client.Do(req)
fmt.Println(resp.Uncompressed)  // prints false
fmt.Println(resp.Header.Get("Content-Encoding")) prints gzip
Run Code Online (Sandbox Code Playgroud)

  • 删除标头以使压缩对应用程序透明。 (2认同)