平时自己写了个抓取网页内容分析的小工具, 通过 Chrome 的 copy as curl 功能复制出 curl , 然后再将 curl 通过工具自动转换为 golang 的 http 请求代码, 但是HTTP response 一直返回乱码.

最后发现, 原来是 Golang 这里有特别处理了的.

net/http/transport.go

可以看到, 源码这里有显式的说明:

如果 DisableCompressiontrue, 则表示禁用压缩请求 Accept-Encoding: gzip. 如果是一个 gzip 请求, 并且返回了一个 gzip 的响应, 则它会自动进行解码.

但, 如果用户显式地请求一个 gzip 的话, 则它不会自动解码!

因为通过 curl 的代码生成的 Golang http 请求, 它是显式地设置了 Accept-Encoding: gzip 的, 所以, 在 Golang 中, 默认情况下返回的 http response 是不会自动解码的.

最简单的解决办法就是, 去掉这种显式请求头 Accept-Encoding 即可.

如果确实想手动进行解码, 则可调用 Golang 的标准库中的 gzip 包. gzip.NewReader 来进行读取 gzip 的编码输入源即可.