multithreading - Rust 多线程 HTTP 请求,从响应中获取所有数据?
问题描述
所以我有以下代码将多线程请求发送到域列表。到目前为止,我能够从响应中获取单个数据,例如字节、url 或状态码等,但不能将它们全部放在一起。我想将所有这些值存储到向量中,以便可以将其写入文件。我知道这可能是一个超级愚蠢的问题,但我已经研究了好几天,无法弄清楚。任何帮助表示赞赏!
#[tokio::main]
async fn get_request(urls: Vec<&str>, paths: Vec<&str>) {
let client = Client::new();
for path in paths {
let urls = urls.clone();
let bodies = stream::iter(urls)
.map(|url| {
let client = &client;
async move {
let mut full_url = String::new();
full_url.push_str(url);
full_url.push_str(path);
let resp = client
.get(&full_url)
.timeout(Duration::from_secs(3))
.send()
.await;
resp
}
})
.buffer_unordered(PARALLEL_REQUESTS);
bodies
.for_each(|b| async {
match b {
Ok(b) => {
let mut body_test = &b.bytes().await;
match body_test {
Ok(body_test) => {
let mut stringed_bytes = str::from_utf8(&body_test);
match stringed_bytes {
Ok(stringed_bytes) => {
println!("stringed bytes: {}", stringed_bytes);
}
Err(e) => println!("Stringified Error: {}", e),
}
}
Err(e) => println!("body Error: {}", e),
}
}
Err(e) => println!("Got an error: {}", e),
}
})
.await;
}
}
解决方案
我会尝试创建一个结构来存储您希望从 body 或hyper::Response获取的所需输出。例如:
struct DesiredContent {
code: Option<u16>,
body: Json
...
}
然后实施impl TryFrom<hyper::Response> for DesiredContent
(假设您可能遇到应该失败的情况 - 404 错误)
推荐阅读
- python - 将具有元组列表的列转换为多列
- amazon-dynamodb - DynamoDB - 逐一扫描(如 JDBC 游标)
- c# - 事件没有得到提升
- javascript - Vue.js 使用方法合并 2 个文件
- c# - 如何从 PHAssetCollection 正确获取自定义专辑
- java - JAX-RS 在实现 ContainerRequestFilter 的类中注入 CDI 事件
- paperjs - paperjs - 用箭头画一条线
- ruby-on-rails - Solidus 当前用户
- git - “git checkout ../../..”:这是什么意思
- python - Python中的正则表达式和格式化