说在前面
- go version:go1.18.4 windows/amd64
- 操作系统:windows
- 浏览器版本:edge 104.0.1293.63 (正式版本) (64 位)
场景
- 使用http进行通讯时,数据量比较大时占用带宽较高,需要对数据进行压缩以节省带宽。
代码
func NewHttp() {
http.HandleFunc("/my", myHandler)
http.HandleFunc("/mycompress", myCompressHandler)
err := http.ListenAndServe(":8183", nil)
if err != nil {
fmt.Println("err: ", err)
}
}
func myCompressHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Encoding", "gzip")
type St struct {
Str string `json:"str"`
}
var str strings.Builder
for i := 0; i < 100000; i++ {
str.WriteByte(byte(rand.Int()))
}
gw := gzip.NewWriter(w)
defer gw.Close()
err := json.NewEncoder(gw).Encode(&St{
Str: str.String()})
if err != nil {
fmt.Println("encode err: ", err)
}
}
func myHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
type St struct {
Str string `json:"str"`
}
var str strings.Builder
for i := 0; i < 100000; i++ {
str.WriteByte(byte(rand.Int()))
}
err := json.NewEncoder(w).Encode(&St{
Str: str.String()})
if err != nil {
fmt.Println("encode err: ", err)
}
}
对比
- 未压缩
- 压缩后(由于
payload
是随机字符串,所以压缩率比较低)
Client代码
func ReqHttp() {
req, err := http.NewRequest("Get", "http://127.0.0.1:8183/mycompress", nil)
defer req.Body.Close()
req.Header.Add("Accept-Encoding", "gzip")
client := &http.Client{
}
resp, _ := client.Do(req)
gr, err := gzip.NewReader(resp.Body)
if err != nil {
fmt.Println("decode err: ", err)
return
}
defer gr.Close()
type St struct {
Str string `json:"str"`
}
tmp := &St{
}
err = json.NewDecoder(gr).Decode(tmp)
if err != nil {
fmt.Println("json decode err: ", err)
return
}
fmt.Println(tmp.Str)
}
参考