目录

go http body 类型为 gzip 数据如何正确解析读取

问题

具体场景如下

┌──────────────┐ ┌───────────────┐ │ 第三方API │──Gzip─▶│ 你的Go服务 │ └──────────────┘ └───────────────┘ ▲
└─ 需要解析压缩数据节省带宽

go 服务向第三方 API 发起请求获取数据,但是绝大多数第三方 API 的接口都会设置 gzip 压缩,优化接口性能,

那么 go 服务在使用 http 请求获取到的 body 就是一个 gzip 格式的数据,这个时候实际上是压缩的格式(序列化、打印都是一大串乱码),需要我们先进行解压后才能实际使用

一、方案一:自动解压(推荐)

全局配置 http.Client, 实现自动解压

client := &http.Client{
    Transport: &http.Transport{
        // 自动处理Accept-Encoding
        DisableCompression: false, 
    },
}

resp, _ := client.Get("https://api.example.com/data")
defer resp.Body.Close()

// 自动解压Gzip/Zlib数据
body, _ := io.ReadAll(resp.Body) 
fmt.Println(string(body))

关于 http.Client 的其他参数说明,请移步文章:go 自定义 http client

二、方案二:手动解压

在获取响应 body 后,使用 gzip 标准库对结果进行解压,然后再使用

import "compress/gzip"  

resp, _ := http.Get("https://api.example.com/compressed-data")
defer resp.Body.Close()

var reader io.Reader = resp.Body
if resp.Header.Get("Content-Encoding") == "gzip" {
    gzReader, err := gzip.NewReader(resp.Body)
    if err != nil {
        panic(err)
    }
    defer gzReader.Close()
    reader = gzReader
}

data, _ := io.ReadAll(reader)

常见问题

1. 解压后出现�特殊字符,乱码

  1. 检查 Content-Encoding 响应头,根据编码不同进行转换编码:Golang字符串编码转换

  2. 验证压缩算法一致性:

    if _, err := gzip.NewReader(resp.Body); err != nil {
       // 非Gzip数据
    }

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-http-gzip/

备用原文链接: https://blog.fiveyoboy.com/articles/go-http-gzip/