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

如何使用 go-chi 框架的 gzip 中间件启用 gzip 压缩?

尝试使用此处显示的示例:

https://github.com/go-chi/chi/issues/204

但是当我检查curl时,我得到了这个:

$ curl -H "Accept-Encoding: gzip" -I http://127.0.0.1:3333

HTTP/1.1 405 Method Not Allowed

Date: Sat, 31 Aug 2019 19:06:39 GMT

我尝试了代码“hello world”:


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) //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:3333

HTTP/1.1 405 Method Not Allowed

Date: Sat, 31 Aug 2019 19:06:39 GMT

这是怎么回事?


长风秋雁
浏览 80回答 3
3回答

森栏

其他答案现在已经过时了。我必须自己解决这个问题,所以这是我发现的。你的错误在这里: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",}祝你好运!

汪汪一只猫

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.

呼如林

使用注释middleware.DefaultCompress和正常GET请求。package mainimport (&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "github.com/go-chi/chi"&nbsp; &nbsp; "github.com/go-chi/chi/middleware")func main() {&nbsp; &nbsp; r := chi.NewRouter()&nbsp; &nbsp; r.Use(middleware.RequestID)&nbsp; &nbsp; r.Use(middleware.Logger)&nbsp; &nbsp; r.Use(middleware.DefaultCompress)&nbsp; &nbsp; r.Get("/", Hello)&nbsp; &nbsp; http.ListenAndServe(":3333", r)}func Hello(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; w.Header().Set("Content-Type", "text/html")&nbsp; &nbsp; w.Write([]byte("hello world\n"))}尝试使用curl:$ curl -v http://localhost:3333 --compressed* Rebuilt URL to: http://localhost:3333/*&nbsp; &nbsp;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 :3333HTTP/1.1 200 OKContent-Encoding: gzipContent-Length: 36Content-Type: text/htmlDate: Sat, 31 Aug 2019 23:38:31 GMThello world
打开App,查看更多内容
随时随地看视频慕课网APP