【golang/http】对http返回内容进行压缩

说在前面

  • 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()))
	}

	// 使用gzip进行压缩 其他可选zlib等
	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)
}

参考

猜你喜欢

转载自blog.csdn.net/qq_33446100/article/details/126624366
今日推荐