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 Enlightened
tvd12 Enlightened
Anh thấy là không được em ạcontent-encoding gzip(nhưng anh chưa thấy framework nào hỗ trợ tự động)
, hoặc lập trình viên tự code.
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\r1xcb~x90xc0x87o-" thì này có phải là bytes mà anh đề cập ko nhỉ :3
 –  hungw7 1668847074000
Avatar
tvd12 Enlightened
tvd12 Enlightened
ở đâ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/gzipvì anh thấy gin không có hỗ trợ gzip
 –  tvd12 1668881690000