【问题标题】:How enable gzip compression middleware in go-chi如何在 go-chi 中启用 gzip 压缩中间件
【发布时间】:2019-08-31 19:14:22
【问题描述】:

如何使用 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

发生了什么事?

【问题讨论】:

  • 这个问题和gzip完全没有关系。您正在发出 HEAD 请求,但您的服务器不接受 HEAD,它需要 GET。
  • 另外,当你想要一个压缩的响应体时发出 HEAD 而不是 GET 是没有意义的,因为 HEAD 根本没有响应体。
  • 谢谢你的回答,现在我明白了

标签: http go gzip go-chi


【解决方案1】:

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

你的错误在这里:

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",
}

祝你好运!

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 谢谢。对我来说,“处理程序”没有“()”:```compressor := middleware.NewCompressor(flate.DefaultCompression) r.Use(compressor.Handler) ```
    【解决方案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
    

    【讨论】:

    • 此答案已过时,请使用@Mikel Pascual 答案
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多