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