首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在go-chi中启用gzip压缩中间件

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

Stack Overflow用户
提问于 2019-08-31 19:14:22
回答 3查看 3.4K关注 0票数 0

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

尝试使用下面所示的示例:

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

但是当我检查卷发的时候,我得到了这个:

代码语言:javascript
复制
$ 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

我试过代码“你好世界”:

代码语言:javascript
复制
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"))
}

但是当我试图用卷曲验证时,结果是一样的。

代码语言:javascript
复制
$ 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

到底怎么回事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-31 23:39:21

使用注释的middleware.DefaultCompress和普通的GET请求。

代码语言:javascript
复制
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

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ 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
票数 0
EN

Stack Overflow用户

发布于 2020-03-31 04:12:11

其他答案现在已经过时了。我必须自己解决这件事,所以我在这里发现了。

您的错误在于:

代码语言:javascript
复制
r.Use(middleware.Compress(5, "gzip"))

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

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

代码语言:javascript
复制
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默认列表中定义的所有内容类型。

代码语言:javascript
复制
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",
}

祝好运!

票数 11
EN

Stack Overflow用户

发布于 2020-01-30 07:43:12

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

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

代码语言:javascript
复制
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导入。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57740979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档