gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:36:44 24 4
gpt4 key购买 nike

在过去的几天里,我一直在搞乱 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com