http - HTTP 响应的正文存储在哪里? (使用 Rust + reqwest)

标签 http rust reqwest

在过去的几天里,我一直在搞乱 HTTP,在 Rust 中构建了一个简单的 CL 下载管理器,使用 reqwest crate 来处理 HTTP 内容。我对协议(protocol)的工作原理有了基本的了解 - 下载文件时要查找哪些 header ,如何验证请求是否有效等 - 但我无法找到关于实际字节在哪里的答案存储 HTTP 响应的正文。

例如,使用 reqwest 发送请求并获得响应所需的时间非常短,因此我认为在此阶段无法进行下载。实际上需要时间的是从正文中读取字节。但是这个 body 肯定不能存储在 RAM 中,因为下载一个大文件会使内存使用量猛增。我意识到这些数据的存储位置可能在不同的 HTTP 框架中有所不同,但我想我所追求的是一个更一般的解释,即当不使用浏览器下载文件时,大型 HTTP 响应主体的存储位置。

最佳答案

reqwest 的情况下,响应正文完全存储在内存中,除非您要求它(通过调用 .bytes().json() 等)——此时网络连接仍处于事件状态( header 已被完全接收,但正文尚未收到),因此服务器负责存储或准备好提供其余的响应。可能是 HTTP 服务器在 内存中有响应,也可能是直接从自己的磁盘读取;并且部分响应将暂时存储在各种网络缓冲区中,或者沿着电缆从他们的网络传输到您的网络。

这就是为什么 Response 没有实现 Clone,以及为什么检索 body 的方法采用 self; Response 是(除了读取响应 header 的一种方式)未完成的网络连接的句柄。您使用它来指示 reqwest 如何将文件的其余部分传递给您 - 将其读入内存,将其解析为某种 JSON 或其他数据类型,甚至处理使用您自己的代码传入的字节数。

每个好的 HTTP 客户端都会有这样的功能,只是因为在执行下一步操作之前将大型响应完全存储到内存中效率不高。

关于http - HTTP 响应的正文存储在哪里? (使用 Rust + reqwest),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68956743/

相关文章:

python - 如何在列表中附加 JSON 响应的值 (python)?

分配给静态变量时出现 Rust 'borrowed value does not live long enough'

select - 结合使用 Rust 库 reqwest 和 select

node.js - 我的 npm 不工作

java - 在java中传递XML请求时出现问题

php - 如何处理通过 POST 发送的 XML?

rust - 仅构建 `lib` 目标

rust - 如何在闭包中传递捕获字符串而不引起编译器错误?

rust - 特征 `std::future::Future` 未针对 `std::result::Result<reqwest::Response, reqwest::Error>` 实现

rust - 不能在返回 `?` 的函数中使用 `()` 运算符