发布 1.0.0 版本:用于 Gin 和 net/http 的 gzip 中间件,再也不担心返回的 JSON 太大了

2020-04-26 10:54:34 +08:00
 nanmu42

一个适用于Ginnet/http的 gzip 中间件,可直接用也可定制参数和过滤器,gzip 压缩你的返回。

项目地址: https://github.com/nanmu42/gzip

p.s.

gzip 一般可以将文本返回(例如 JSON )压缩到 30%~70%.

有的人喜欢在反向代理上做压缩,有的人喜欢在程序里就压缩,萝卜青菜各有所爱。:)

3698 次点击
所在节点    Go 编程语言
23 条回复
airplayxcom
2020-04-26 11:41:15 +08:00
已 star
qwerthhusn
2020-04-26 11:49:13 +08:00
最怕的就是没配好,程序压缩了一个,代理又解压了,完事再压缩一次
nanmu42
2020-04-26 12:02:33 +08:00
@qwerthhusn 对,这个问题得规避。一般是看[Content-Encoding 和 Transfer Encoding]( https://github.com/nanmu42/gzip/blob/895747f7d735b2d9ee32e8f8847377c1bc59e253/responsefilters.go#-L32-L37).
lianyue
2020-04-26 15:44:27 +08:00
我 以前也写了个

https://github.com/otamoe/gin-compress

gzip + br 支持 br 的
also24
2020-04-26 15:52:40 +08:00
唔… 提问一下,自己做这件事和靠 nginx 来做这件事,会有哪些差异呢?
SingeeKing
2020-04-26 16:38:57 +08:00
@also24 #5 Go 哲学之不用 nginx 转发?
imherer
2020-04-26 16:53:20 +08:00
@SingeeKing 用 Caddy 吗 🐶🐶🐶
nanmu42
2020-04-26 16:57:57 +08:00
@also24 @SingeeKing 纯粹是萝卜青菜的喜好问题,并不分孰优孰劣,就结果来说没有什么差异。有选项总比没有选项好一些。
imherer
2020-04-26 17:00:45 +08:00
@nanmu42 试用了下,还可以,已 star

不过有个小疑问,用 postman 请求的结果是压缩了也没用吗?
因为我发现只有浏览器访问有效果,postman 请求的话 header 里显示已压缩了,但是大小实际没变化
zhs227
2020-04-26 17:03:19 +08:00
@imherer postman 好像会自己解压 gz 的东西,方便你查看
imherer
2020-04-26 17:11:38 +08:00
@zhs227 哦……这样啊
nanmu42
2020-04-26 17:11:48 +08:00
@imherer 如果返回的 header 里有`content-encoding: gzip`,说明本条返回通过判定,成功被压缩了,`Content-Length`(如果有)这个时候是指压缩后的大小。
imherer
2020-04-26 17:18:27 +08:00
@nanmu42 嗯。content-encoding: gzip 是有的。 应该就是楼上他们说的 postman 会解压 gz 吧
yiplee
2020-04-26 17:46:23 +08:00
一直在用 chi/middleware 里面的 compress,楼主这个也不错
solos
2020-04-26 18:04:00 +08:00
nanmu42
2020-04-26 18:18:00 +08:00
@solos 对,可惜它实在不好用,甚至不可用: https://github.com/gin-contrib/gzip/issues
Allianzcortex
2020-04-26 20:26:49 +08:00
理论上是不是核心代码两行就可以搞定...

```
unc CompressGZResult(w http.ResponseWriter, r *http.Request, res interface{}) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Encoding", "gzip")

gz := gzip.NewWriter(w)
err := json.NewEncoder(gz).Encode(res)
```
solos
2020-04-26 20:35:13 +08:00
@nanmu42 那我得换一下 哈哈
heiheidewo
2020-04-26 20:36:51 +08:00
@nanmu42 我几年前就用了这个 gin-contrib/gzip,一直很稳定,这个有啥问题么
solos
2020-04-26 20:42:30 +08:00
@nanmu42 我试了下 html 没有压缩 只有 json 压缩了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX