首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何保持HTTP正文的gzip表示

如何保持HTTP正文的gzip表示
EN

Stack Overflow用户
提问于 2019-11-14 21:38:41
回答 1查看 337关注 0票数 2

在go web应用程序的上下文中,我使用响应缓存并压缩它们,因此我节省了带宽(响应更大)。我使用gin-gonic框架和gzip包进行压缩。这个包工作得很好,它提供了我接收和回复gzip压缩正文所需的一切。下面这几行就足够了:

代码语言:javascript
运行
复制
router := gin.Default()
router.Use(gzip.Gzip(gzip.DefaultCompression))

一切都是神奇的。现在,我还使用了存储响应的缓存。为了节省空间和CPU,我希望将已经压缩的响应存储在缓存中,因此我也不重复压缩。作为包装HTTP处理的中间件,gzip透明地解压缩请求并压缩响应。但是,在我的处理程序级别,我希望获得响应的压缩表示,以便可以将其存储到缓存中。另外,我需要告诉gzip我的身体已经被压缩了。

我已经做了一些搜索,以自动化的方式,使用gzip包或任何其他,防止我干预一些库,在HTTP栈中的执行路径,或最坏的,为自己编程的东西已经由另一个库,如gzip

有人知道gzip包是如何解决这个问题的吗?

EN

Stack Overflow用户

回答已采纳

发布于 2020-08-30 05:47:33

首先,我继续使用gzipgin包。

现在,我用一个类似如下的函数来压缩我的响应:

代码语言:javascript
运行
复制
func compress(response interface{}) ([]byte, error) {
    body, err := json.Marshal(response)
    if err != nil {
        return nil, err
    }
    var buffer bytes.Buffer
    zw := gzip.NewWriter(&buffer)
    _, err = zw.Write(body)
    closeErr := zw.Close()
    if err != nil {
        return nil, err
    }
    if closeErr != nil {
        return nil, err
    }
    return buffer.Bytes(), nil
}

当我需要响应一个请求时,我会执行如下代码:

代码语言:javascript
运行
复制
    gzipOutput, err := compressResponse(output)
    if err != nil {
        c.JSON(http.StatusInternalServerError, err.Error())
        return
    }

    c.Writer.Header().Set("Accept-Encoding", "gzip")
    c.Writer.Header().Set("Content-Encoding", "gzip")
    c.Writer.Header().Set("Content-Type", "application/json")
    c.Data(http.StatusOK, "gzip", gzipOutput)

正如我们所看到的,我们的想法是通过设置HTML头来告诉gin响应是压缩的。

自八个月以来,它已经在五个不同的API上进行了测试。

我希望它对另一个人有用,就像对我一样。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58858108

复制
相关文章

相似问题

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