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

标签 http go gzip go-chi

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

这是怎么回事?

最佳答案

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

你的错误在这里:

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

祝你好运!

关于http - 如何在 go-chi 中启用 gzip 压缩中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57740979/

相关文章:

.net - 为什么 BCL GZipStream(带有 StreamReader)不能可靠地检测 CRC32 的数据错误?

asp.net - 使用 'System.Web.Optimization' 压缩由 asp.net 捆绑创建的 bundle ?

windows - HTTP 无法注册 URL

java - 在 Java 中发送 HTTP POST 请求

go - 直接从 Revel 模板引擎中拉取模型

Linux 上的 Golang : How to use syscall. 系统调用?

http - 如何获得浏览器身份验证弹出窗口?

json - 当我通过 AJAX 获取 JSON 数据时,数据存储在哪里?

time - 计算两个日期之间的天数?

google-app-engine - GAY 上的缓存和 GZip(社区维基)