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

Http 如何在go-chi中启用gzip压缩中间件,http,go,gzip,go-chi,Http,Go,Gzip,Go Chi,如何使用go-chi框架的gzip中间件启用gzip压缩 尝试使用以下示例: 但当我用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”: 但当我尝试用curl验证时,结果是一样的 $ curl -H "Accept-Encod

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

尝试使用以下示例:

但当我用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”:

但当我尝试用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

发生了什么事?

使用已注释的
中间件.DefaultCompress
和正常的
GET
请求

主程序包
进口(
“net/http”
“github.com/go chi/chi”
“github.com/go-chi/chi/middleware”
)
func main(){
r:=chi.NewRouter()
r、 使用(中间件.RequestID)
r、 使用(middleware.Logger)
r、 使用(middleware.DefaultCompress)
r、 获取(“/”,您好)
http.listendServe(“:3333”,r)
}
func Hello(w http.ResponseWriter,r*http.Request){
w、 Header().Set(“内容类型”、“文本/html”)
w、 写入([]字节(“hello world\n”))
}
尝试使用
curl

$curl-vhttp://localhost:3333 --压缩的
*重新生成的URL到:http://localhost:3333/
*正在尝试127.0.0.1。。。
*TCP_节点集
*已连接到本地主机(127.0.0.1)端口3333(#0)
>GET/HTTP/1.1
>主机:localhost:3333
>用户代理:curl/7.58.0
>接受:*/*
>接受编码:deflate,gzip
>
HTTPie

$http:3333
HTTP/1.1200ok
内容编码:gzip
内容长度:36
内容类型:text/html
日期:2019年8月31日星期六23:38:31 GMT
你好,世界
r.Use(middleware.DefaultCompress)
现在已被标记为
已弃用

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

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

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

您的错误如下:

r.Use(middleware.Compress(5,“gzip”))
第二个参数(“类型”)指的是将应用压缩的内容类型。例如:
“text/html”
“application/json”
,等等

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

func main(){
r:=chi.NewRouter()
r、 使用(中间件.RequestID)
r、 使用(middleware.Logger)
r、 使用(中间件压缩(5))
r、 获取(“/”,您好)
http.listendServe(“:3333”,r)
}
这将从以下位置压缩默认列表中定义的所有内容类型:

var defaultcompressileContentTypes=[]字符串{
“文本/html”,
“文本/css”,
“文本/纯文本”,
“文本/javascript”,
“应用程序/javascript”,
“应用程序/x-javascript”,
“应用程序/json”,
“应用程序/atom+xml”,
“应用程序/rss+xml”,
“图像/svg+xml”,
}

祝你好运

这个问题与gzip完全无关。您正在发出HEAD请求,但您的服务器不接受HEAD,它需要GET。此外,当您需要压缩响应正文时,发出HEAD而不是GET是没有意义的,因为HEAD根本没有响应正文。感谢您的回答,现在我更好地理解了此答案已过时,请使用@Mikel Pascual AnswerThank。对我来说,“Handler”没有“()”:``compressor:=中间件.NewCompressor(flate.DefaultCompression)r.Use(compressor.Handler)```
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)