Rust многопоточные HTTP-запросы, получить все данные из ответа? - PullRequest
0 голосов
/ 01 августа 2020

Итак, у меня есть следующий код, который отправляет многопоточные запросы в список доменов. Пока я могу получить отдельные данные из ответа, такие как байты, URL-адрес или код состояния и т. Д. c. но не все вместе. Я хотел бы сохранить все эти значения в векторах, чтобы их можно было записать в файл. Я знаю, что это, вероятно, супертупой вопрос, но я работал над ним несколько дней и не могу понять. Любая помощь приветствуется!

#[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;
    }
}

1 Ответ

0 голосов
/ 11 августа 2020

Я бы попытался создать структуру, в которой будут храниться желаемые результаты, которые вы хотели бы получить из тела или hyper :: Response . Например:

struct DesiredContent {
   code: Option<u16>,
   body: Json 
   ... 
}

А затем реализация impl TryFrom<hyper::Response> for DesiredContent (Предполагается, что у вас могут быть случаи, которые должны завершиться неудачно, например - 404 ошибки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...