为了账号安全,请及时绑定邮箱和手机立即绑定

Go net/http Transport Accept-Encoding:gzip 不提示编码响应

Go net/http Transport Accept-Encoding:gzip 不提示编码响应

Go
至尊宝的传说 2022-04-20 17:57:44
我知道 net/http 传输将添加Accept-Encoding: gzip到请求中,除非DisableCompression设置为 True,如果我希望它自动解压缩 gzip 响应,则需要这样做。在这种情况下,以下代码不会收到Content-Encoding: gzip标头: https://play.golang.org/p/FWs5uG9pZEL(注意:由于网络限制,不会在操场上运行)如果我运行本地服务器并使用它运行上面的代码,我可以看到正在发送的预期标头:GET / HTTP/1.1Host: localhost:5555User-Agent: Go-http-client/1.1Accept-Encoding: gzipgo 创建的连接是否还有其他原因导致服务器不返回压缩响应?
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

Accept-Encoding: gzip仅表示客户端能够并且愿意处理 gzip 压缩内容。这并不意味着服务器必须实际压缩内容。事实上,例如对于图像,使用 gzip 压缩内容没有任何意义,因为这些已经是压缩数据(但不是使用 gzip),并且在顶部添加 gzip 可能实际上会增加有效负载的大小。


如果您希望您的服务器返回压缩内容,您实际上必须配置您的服务器来执行此操作。有关如何使用 nginx 执行此操作的示例,请参见此处。


请注意,http.Response它将透明地解压缩响应并相应地更新标头,即删除Content-Encoding。这意味着您在使用resp.Header.Get("Content-Encoding"). 如果响应被自动解压,可以在Uncompressed字段中看到:


fmt.Println("was compressed ", resp.Uncompressed)

有关更多信息,请参阅go doc http.Response:


// Uncompressed reports whether the response was sent compressed but

// was decompressed by the http package. When true, reading from

// Body yields the uncompressed content instead of the compressed

// content actually set from the server, ContentLength is set to -1,

// and the "Content-Length" and "Content-Encoding" fields are deleted

// from the responseHeader. To get the original response from

// the server, set Transport.DisableCompression to true.

Uncompressed bool


查看完整回答
反对 回复 2022-04-20
  • 1 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信