Avatar
1
hungw7 Beginner
hungw7 Beginner
Golang return gzip content as API
Em đang dùng redis để cache data product (như code dưới)

productBytes, _ := json.Marshal(product)

bf := bytes.Buffer{}
gw := gzip.NewWriter(&bf)
gw.Write(productBytes)

cacheErr := cache.Set(bgCtx, idParam, bf.Bytes(), 60*time.Second).Err()

Giờ em muốn có 1 api trả về ngay kết quả được cache trong redis dưới dạng gzip và http sẽ tự unpack nó ra có được không ạ. Em có search thì thấy http có hỗ trợ content-encoding gzip nhưng chưa biết cách làm, a/c có code mẫu càng tốt ạ :3

  • Answer
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Anh thấy là không được em ạ Có thể được em ạ, cái content-encoding gzip chỉ là để client và server báo cho nhau biết là cái content type nó là như thế thôi, còn cái việc làm như thế nào thì vẫn sẽ phải do server framework và trình duyệt hỗ trợ (nhưng anh chưa thấy framework nào hỗ trợ tự động), hoặc lập trình viên tự code.

Anh đang hiểu là em sẽ gọi lấy data redis tử http server nhỉ? Và em đang lưu gzip cho nó tiết kiệm? Vậy thì không có cách nào khác ngoài việc em phải lấy dữ liệu từ redis, sử dụng gzip để unzip (Sorry em) Vì anh thấy em đã zip trước khi lưu vào redis rồi, nên em có thấy byte array ra từ redis và sau đó gửi toàn bọ bytes về cho client em ạ.

  • 0
  • Reply
hi anh Dũng, em có thử 1 tí và có 1 đoạn code như này để lấy value từ redis và trả về client

func handleGet(w http.ResponseWriter, req *http.Request) {
   val := redisClient.Get(ctx, req.URL.Query().Get("id")).Val()

   w.Header().Add("Content-Type", "application/json")
   w.Header().Add("Content-Encoding", "gzip")

   fmt.Printf("size when read from redis: %v \n", unsafe.Sizeof(val))

   wc := string(val)

   fmt.Printf("size wc: %v \n", unsafe.Sizeof(wc))

   fmt.Fprintf(w, val)
}

Như code trong post hỏi thì em store trong redis là bf.Bytes() và nó sẽ có định dạng như này khi get bằng redis-cli "x1fx8bbx00x00x00x00x00x00xffdx92Akxdc<x10x86xffxcaxcb\r1xcbx90xc0x87o-" thì này có phải là bytes mà anh đề cập ko nhỉ :3

 –  hungw7 1668847074000
Avatar
tvd12 Beginner
tvd12 Beginner
Ừ, đúng rồi em ạ, đoạn code của em anh thấy cũng có thể hoạt động được, tuy nhiên em có thể check loại trình duyệt có hỗ trợ encoding ở đây nhé.
  • 0
  • Reply
Thanks anh Dũng, mà anh có dùng Gin trong go chưa nhỉ, nếu rồi thì không biết nếu áp đoạn code em vào gin thì nên config và trả về như thế nào :3  –  hungw7 1668856315000
Khả năng em phải sử dụng thêm thằng này em ạ: https://github.com/gin-contrib/gzip vì anh thấy gin không có hỗ trợ gzip  –  tvd12 1668881690000