rust - 我应该如何在 rust 中获取该对象的副本?
问题描述
我有一个小程序,它应该打印出 html 获取请求的响应状态,并打印出该响应的原始 html。(我为此使用了最新版本的 reqwest crate)
fn main() {
let req = reqwest::blocking::get("https://www.rust-lang.org");
let rawhtml = req.clone().unwrap().text().unwrap();
let status = req.unwrap().status();
println!("status: {}\n\n", status);
println!("{}", rawhtml);
}
运行cargo run
给我错误[E0599]说
Result<reqwest::blocking::Response, reqwest::Error>
由于不满足的特征界限,无法调用方法
因此,如果我无法克隆该对象,那么我如何使用多个消耗“自我”的功能?当我需要的所有信息都应该放在一个时,我不想发出多个获取请求。
解决方案
首先,reqwest::blocking::Response
没有实现Clone
或提供替代方案,因此“获取副本”不是一种选择;你需要构建你的程序,所以它不需要副本。
您当前代码遇到的问题主要不在于Response
; 是你正在调用的Result::unwrap
,它确实消耗了Result
它被调用的东西——为了给你它的内容。正确的做法是只调用unwrap
一次。
let req = reqwest::blocking::get("https://www.rust-lang.org")
.unwrap();
let rawhtml = req.text().unwrap();
let status = req.status();
这仍然无法编译,但那是因为您以错误的顺序调用方法:在使用body之前,您必须从响应的标头中询问您需要的任何内容。这不是一个任意的约束;这是因为 HTTP 以该顺序为您提供该信息,因此让 API 以这种方式工作允许在下载响应时不需要存储整个响应 - 该对象不仅仅是一个不变的数据结构,而且实际上代表了响应。正在发送到您的计算机。reqwest
Response
此版本将工作:
let req = reqwest::blocking::get("https://www.rust-lang.org")
.unwrap();
let status = req.status();
let rawhtml = req.text().unwrap();
status
并且rawhtml
两者都实现Clone
,因此您可以保留它们并根据需要制作副本,这与Response
.
(免责声明:我并没有真正使用过reqwest
自己;这个答案是基于阅读文档和源代码,以及一般的 Rust 原则。)
推荐阅读
- docker - .NET Core API 502 带有 Nginx 代理的 Docker 上的错误网关
- javascript - 知道表单 POST 目标是否生成错误的任何方法
- cmake - CMake:add_subdirectory 两次作为共享项目
- json - Swift 4 解析 1+n 数量的 json 数字键
- java - 使用浮点变量在 Android 应用程序中显示板球比赛
- tomcat - smack xmpp - 托管在 tomcat 上的 Servlet
- arrays - 在 MatLab 单元格中找到一个 str
- ethereum - POA Clique Ethereum - 区块的创建
- c++ - 有没有办法使用标准 C++ 从 GCC 扩展模拟 __typeof__ ?
- ffmpeg - 为什么 FFMpeg 输出错误的 NAL 单元类型?(javascript h264 直播)