使用Reqwest时如何同时获取响应的Header和Body?
解决Reqwest中同时获取响应Header和Body的编译错误
问题原因
你给出的代码触发编译错误,是因为Rust的借用规则限制:
resp.headers()返回的是对resp内部HeaderMap的引用(&HeaderMap),此时resp处于被借用状态。resp.text().await会**消耗(move)resp**来读取响应体,而Rust不允许在存在未结束的借用时转移对象所有权。
两种可行解决方法
方法一:提前克隆Header
直接克隆HeaderMap,解除对原resp的依赖:
let req: Request = client.get("https://someaddress").build().unwrap(); let mut resp = client.execute(req).await.unwrap(); // 克隆Header,获得独立的所有权 let response_headers = resp.headers().clone(); // 此时可以安全消耗resp读取响应体 let response_text = resp.text().await.unwrap();
方法二:先读取响应体,再获取Header
text()仅消耗响应体部分,resp本身不会被完全销毁,Header仍可访问:
let req: Request = client.get("https://someaddress").build().unwrap(); let mut resp = client.execute(req).await.unwrap(); // 先消耗响应体获取文本 let response_text = resp.text().await.unwrap(); // 此时仍可读取Header并克隆 let response_headers = resp.headers().clone();
补充说明
Reqwest的HeaderMap实现了Clone trait,克隆操作开销极低,无需担心性能问题。两种方法核心都是避免"借用未结束时转移所有权"的冲突,符合Rust的内存安全规则。
内容的提问来源于stack exchange,提问作者sothrowaway34234234
相关产品推荐
相关产品推荐

