【问题标题】:Why do you have to close the body of a request once you have inspected it?为什么你必须在检查完请求的主体后关闭它?
【发布时间】:2018-10-21 08:14:21
【问题描述】:

我见过几个例子,你从r.Body 读取,然后在之后执行延迟r.Body.Close()。如果我们不关闭它会发生什么?

假设我有一个http.Handler,我在其中解码 r.Body 的内容,如下所示:

func createFeedback(w http.ResponseWriter, r *http.Request) {
    // ... Some code ...
    f := feedback.New()
    if err := json.NewDecoder(r.Body).Decode(f); err != nil {
        return err
    }
    defer r.Body.Close()
    // ... Some more code ...
}

为什么我们必须关闭r.Body

【问题讨论】:

  • 这看起来不像是重复的。另一个 SO 帖子是关于关闭响应正文的。这个问题是关于请求正文的。
  • 由于官方文档 (pkg.go.dev/net/http?tab=doc#Request) 适用,您不必这样做。服务器会自己做。我强烈同意@discoverAnkit。这不是重复的
  • 这是因为是io.Writer,需要关闭。

标签: go


【解决方案1】:

这样做是为了防止连接的资源泄漏。 go 官方文档中有一句话:

https://pkg.go.dev/net/http#Client

如果 Body 没有被读取到 EOF 并关闭,则客户端的 底层的 RoundTripper(通常是 Transport)可能无法 重新使用到服务器的持久 TCP 连接以进行后续 “保持活动”请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2013-08-09
    • 2014-09-22
    • 2018-01-19
    • 2010-09-12
    相关资源
    最近更新 更多