go 的 `net/http` 默认不自动解压 `deflate` 编码响应,直接读取压缩字节会导致 `json.unmarshal` 报错“invalid character ‘x’ looking for beginning of value”;需手动检测 `content-encoding` 并使用 `compress/flate` 解压后再解析。
在 Go 中调用返回 Content-Encoding: deflate 的 HTTP 接口时,若未显式解压响应体,ioutil.ReadAll(res.Body)(或 io.ReadAll)将返回原始压缩字节流(如以字节 120 156 开头的 DEFLATE 数据),而非可读 JSON 字符串。此时 json.Unmarshal 尝试解析二进制数据,自然报错:invalid character ‘x’ looking for beginning of value(x 即 ASCII 120,是 DEFLATE 流的典型魔数)。
Go 标准库对 gzip 有自动支持(只要启用了 http.Transport 的 RegisterProtocol 或使用默认客户端且服务端发 gzip),但对 deflate 不提供自动解压——这是本问题的根本原因。
✅ 正确做法:手动识别并解压 deflate
需检查响应头 Content-Encoding,若为 deflate,则用 compress/flate 包解压。注意:HTTP 中的 deflate 指 RFC 1950 zlib 格式(含 zlib header),而 compress/flate 默认读取的是 RFC 1951 raw deflate 流。因此必须使用 zlib.NewReader(compress/zlib)而非 flate.NewReader。