如何保留HTTP主体的gzip表示形式

在go Web应用程序的上下文中,我使用了响应缓存并对其进行压缩,因此节省了带宽(响应较大)。我正在使用gin-gonic框架和软件包gzip进行压缩。这个软件包工作得很好,使我能够接收和回复gzip压缩的主体。这几行就足够了:

router := gin.Default()
router.Use(gzip.Gzip(gzip.DefaultCompression))

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

我已经进行了一些搜索,寻找一种使用gzip软件包或其他任何软件包的自动方式,该方式使我无法干预某些库,HTTP堆栈中的执行路径,甚至更糟的是,无法自行编程由其他gzip库制作。

有人知道gzip软件包如何解决此问题吗?

qq244761539 回答:如何保留HTTP主体的gzip表示形式

首先,我继续使用gzipgin软件包。

现在,我使用类似于以下的功能压缩响应:

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
}

当我需要回复请求时,我将执行以下操作:

    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上进行了测试。

我希望它对我一样有用。

本文链接:https://www.f2er.com/3102173.html

大家都在问