HTTP 响应的 body 存储在哪里? (使用 Rust + reqwest)
Where is the body of a HTTP response stored? (with Rust + reqwest)
过去几天我一直在搞乱 HTTP,使用 reqwest crate 在 Rust 中构建一个简单的 CL 下载管理器来处理 HTTP 内容。我对协议的工作原理有了基本的了解——下载文件时 headers 要寻找什么,如何验证请求是否有效等——但我无法找到关于在哪里的答案HTTP 响应 body 中的实际字节被存储。
例如,用reqwest 发送请求和得到响应只需要很少的时间,所以我认为下载不能在这个阶段发生。真正需要时间的是从 body 中读取字节。但是这个 body 肯定不能存储在 RAM 中,因为下载一个大文件会使内存使用率飙升。我意识到这些数据的存储位置可能在不同的 HTTP 框架中有所不同,但我想我所追求的是一个更一般的解释,即当不使用浏览器下载时,大型 HTTP 响应 body 的存储位置一个文件。
在 reqwest
的情况下,响应 body 是 而不是 完全存储在内存中,除非您要求它(通过调用 .bytes()
或 .json()
)——网络连接 仍然处于活动状态 (headers 已被完全接收,但 body),因此 server 负责存储或以其他方式准备提供响应的其余部分。可能是HTTP服务器在其内存中有响应,也可能是直接从自己的磁盘读取;并且部分响应将暂时存储在各种网络缓冲区中或通过电缆从他们的网络传输到您的网络。
这就是为什么 Response
没有实现 Clone
,以及为什么检索 body 的方法需要 self
; Response
是(除了一种读取响应 headers 的方式)未完成的网络连接的句柄。您使用它来指示 reqwest
如何将文件的其余部分交付给您 — 将其读入内存,将其解析为某种 JSON 或其他数据类型,甚至使用您自己的代码处理传入的字节。
每个好的 HTTP 客户端都会有这样的功能,只是因为在执行下一步之前将大量响应完全存储到内存中效率不高。
过去几天我一直在搞乱 HTTP,使用 reqwest crate 在 Rust 中构建一个简单的 CL 下载管理器来处理 HTTP 内容。我对协议的工作原理有了基本的了解——下载文件时 headers 要寻找什么,如何验证请求是否有效等——但我无法找到关于在哪里的答案HTTP 响应 body 中的实际字节被存储。
例如,用reqwest 发送请求和得到响应只需要很少的时间,所以我认为下载不能在这个阶段发生。真正需要时间的是从 body 中读取字节。但是这个 body 肯定不能存储在 RAM 中,因为下载一个大文件会使内存使用率飙升。我意识到这些数据的存储位置可能在不同的 HTTP 框架中有所不同,但我想我所追求的是一个更一般的解释,即当不使用浏览器下载时,大型 HTTP 响应 body 的存储位置一个文件。
在 reqwest
的情况下,响应 body 是 而不是 完全存储在内存中,除非您要求它(通过调用 .bytes()
或 .json()
)——网络连接 仍然处于活动状态 (headers 已被完全接收,但 body),因此 server 负责存储或以其他方式准备提供响应的其余部分。可能是HTTP服务器在其内存中有响应,也可能是直接从自己的磁盘读取;并且部分响应将暂时存储在各种网络缓冲区中或通过电缆从他们的网络传输到您的网络。
这就是为什么 Response
没有实现 Clone
,以及为什么检索 body 的方法需要 self
; Response
是(除了一种读取响应 headers 的方式)未完成的网络连接的句柄。您使用它来指示 reqwest
如何将文件的其余部分交付给您 — 将其读入内存,将其解析为某种 JSON 或其他数据类型,甚至使用您自己的代码处理传入的字节。
每个好的 HTTP 客户端都会有这样的功能,只是因为在执行下一步之前将大量响应完全存储到内存中效率不高。