为了账号安全,请及时绑定邮箱和手机立即绑定

如何在go-chi中启用gzip压缩中间件

如何在go-chi中启用gzip压缩中间件

Go
长风秋雁 2023-07-17 16:27:18
如何使用 go-chi 框架的 gzip 中间件启用 gzip 压缩?尝试使用此处显示的示例:https://github.com/go-chi/chi/issues/204但是当我检查curl时,我得到了这个:$ curl -H "Accept-Encoding: gzip" -I http://127.0.0.1:3333HTTP/1.1 405 Method Not AllowedDate: Sat, 31 Aug 2019 19:06:39 GMT我尝试了代码“hello world”:package mainimport (    "net/http"    "github.com/go-chi/chi"    "github.com/go-chi/chi/middleware")func main() {    r := chi.NewRouter()    r.Use(middleware.RequestID)    r.Use(middleware.Logger)    //r.Use(middleware.DefaultCompress) //using this produces the same result    r.Use(middleware.Compress(5, "gzip"))    r.Get("/", Hello)    http.ListenAndServe(":3333", r)}func Hello(w http.ResponseWriter, r *http.Request){    w.Header().Set("Content-Type", "text/html") //according to the documentation this must be here to enable gzip    w.Write([]byte("hello world\n"))}但是当我尝试用curl验证时,结果是一样的$ curl -H "Accept-Encoding: gzip" -I http://127.0.0.1:3333HTTP/1.1 405 Method Not AllowedDate: Sat, 31 Aug 2019 19:06:39 GMT这是怎么回事?
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

其他答案现在已经过时了。我必须自己解决这个问题,所以这是我发现的。


你的错误在这里:


r.Use(middleware.Compress(5, "gzip"))

第二个参数(“类型”)是指将应用压缩的内容类型。例如:"text/html"、"application/json"等


只需添加要压缩的内容类型列表,或完全删除参数:


func main() {

    r := chi.NewRouter()

    r.Use(middleware.RequestID)

    r.Use(middleware.Logger)

    r.Use(middleware.Compress(5))

    r.Get("/", Hello)

    http.ListenAndServe(":3333", r)

}

这将压缩middleware.compress中默认列表中定义的所有内容类型:


var defaultCompressibleContentTypes = []string{

    "text/html",

    "text/css",

    "text/plain",

    "text/javascript",

    "application/javascript",

    "application/x-javascript",

    "application/json",

    "application/atom+xml",

    "application/rss+xml",

    "image/svg+xml",

}

祝你好运!


查看完整回答
反对 回复 2023-07-17
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

r.Use(middleware.DefaultCompress)现在已被标记为DEPRECATED.


要启用压缩,您需要创建一个压缩器并使用其处理程序。


r := chi.NewRouter()

r.Use(middleware.RequestID)

r.Use(middleware.Logger)


compressor := middleware.NewCompressor(flate.DefaultCompression)

r.Use(compressor.Handler())


r.Get("/", Hello)

http.ListenAndServe(":3333", r)

该flate包必须导入为compress/flate.


查看完整回答
反对 回复 2023-07-17
?
呼如林

TA贡献1798条经验 获得超3个赞

使用注释middleware.DefaultCompress和正常GET请求。


package main


import (

    "net/http"


    "github.com/go-chi/chi"

    "github.com/go-chi/chi/middleware"

)


func main() {

    r := chi.NewRouter()

    r.Use(middleware.RequestID)

    r.Use(middleware.Logger)

    r.Use(middleware.DefaultCompress)

    r.Get("/", Hello)

    http.ListenAndServe(":3333", r)

}


func Hello(w http.ResponseWriter, r *http.Request) {

    w.Header().Set("Content-Type", "text/html")

    w.Write([]byte("hello world\n"))

}

尝试使用curl:


$ curl -v http://localhost:3333 --compressed

* Rebuilt URL to: http://localhost:3333/

*   Trying 127.0.0.1...

* TCP_NODELAY set

* Connected to localhost (127.0.0.1) port 3333 (#0)

> GET / HTTP/1.1

> Host: localhost:3333

> User-Agent: curl/7.58.0

> Accept: */*

> Accept-Encoding: deflate, gzip

>

< HTTP/1.1 200 OK

< Content-Encoding: gzip

< Content-Type: text/html

< Date: Sat, 31 Aug 2019 23:37:52 GMT

< Content-Length: 36

<

hello world

* Connection #0 to host localhost left intact

或者HTTPie:


$ http :3333

HTTP/1.1 200 OK

Content-Encoding: gzip

Content-Length: 36

Content-Type: text/html

Date: Sat, 31 Aug 2019 23:38:31 GMT


hello world


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信