rust 当使用Reqwest时,如何同时保留响应的主体和头部?

col17t5w  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(125)
let req: Request = client.get("https://someaddress").build().unwrap();
let resp = client.execute(req).await.unwrap();
let response_headers = resp.headers();
let response_text = resp.text().await.unwrap(); // cannot move out of `resp` because it is borrowed move out of `resp` occurs here

如果text()headers()都使用响应,那么我们如何同时获得响应头和响应体呢?

svmlkihl

svmlkihl1#

获取头部 * 不会 * 消耗响应,而是返回一个对存储在响应中的HeaderMap的引用,但是获取主体 * 会 * 消耗响应,这意味着对它的任何引用都是无效的,因此尝试同时保留这两个响应会出错。
要同时保留这两个头文件,只需克隆头文件即可:

let response_headers = resp.headers().clone();

或者为了避免重复数据,您可以从响应中“取出”标头:

let mut resp = client.execute(req).await.unwrap();
let response_headers = std::mem::take(resp.headers_mut());
let response_text = resp.text().await.unwrap();

使用std::mem::take将从.headers_mut()中取出&mut中的值,并在其位置保留默认的空HeaderMap
这两种方法都意味着response_headers不再引用响应,您可以很高兴地获得响应体,而不必担心丢失响应体。

相关问题