当前位置: Http > golang r *http.Request 和 r *http.Response

golang r *http.Request 和 r *http.Response

2025-03-20 分类:Http 作者:admin 阅读(29)

1,body只能读一次,解决办法是存一个变量中,读完再写回去。
2,body close就不能再打开。永久关闭不能访问

网络请求和手动创建的 Body 的区别

特性 网络请求的 Body 手动创建的 Body
底层实现 网络连接(net.Conn 的封装) 内存数据(如 bytes.Buffer
数据来源 客户端通过网络传输 本地内存中的数据
是否只能读取一次 是(流式数据,读取后消耗) 否(静态数据,可以多次读取)
是否需要关闭 是(需要释放网络连接) 取决于实现(如 io.NopCloser 不需要)

当客户端发送 HTTP 请求时,服务器端的 http.Request.Body 是一个 io.ReadCloser,它通常封装了客户端的请求体数据。这种 Body 有以下特点:

  • 占用网络资源
    它背后是一个活跃的网络连接,需要显式关闭以释放资源(如文件描述符、TCP 连接等)。
  • 必须关闭
    如果不关闭 Body,会导致资源泄漏(如连接未释放),可能会耗尽系统的文件描述符或网络连接数。
  • 只能读取一次
    网络流是单向的,读取后数据会被消耗,无法再次读取。

当你手动构造一个 http.Request 时,Body 通常是一个本地的 io.Reader(如 bytes.Bufferstrings.Reader 或通过 io.NopCloser 包装的 io.Reader)。这种 Body 有以下特点:

  • 不占用网络资源
    它只是一个内存中的数据结构,不涉及网络连接或文件描述符。
  • 不需要显式关闭(取决于实现)
    如果 Body 是通过 io.NopCloser 包装的,Close() 是空操作,不需要显式关闭。
    如果 Body 是一个需要释放资源的类型(如 os.File),则需要显式关闭。
  • 可以多次读取
    如果 Body 是基于 bytes.Buffer 或 strings.Reader 的,可以多次读取(前提是未调用 Close())。

当客户端发送 HTTP 请求时,服务器端的 http.Request.Body 是通过网络传输的数据流。它的底层实现通常是一个网络连接(如 net.Conn 的封装)。这种 Body 有以下特点:

底层实现

  • 数据是通过网络流式传输的,底层是一个 net.Conn(TCP 连接)。
  • 数据是实时读取的,读取后会被消耗,无法再次读取。

为什么只能读取一次?

  • 流式传输
    网络数据是流式的,数据从客户端传输到服务器端是一次性的。读取后,数据会被从缓冲区中移除,无法再次读取。
  • 资源管理
    网络连接是有限的资源,读取完成后需要关闭以释放连接。

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

支付宝
微信
0

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 - golang r *http.Request 和 r *http.Response

博客简介

精彩评论

  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    新增一个框架图! http://biji.jinli.vip/wp-content/upl...

    评:新文章!
  • 一位WordPress评论者(6年前 (2020-02-13))

    嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

    评:世界,您好!