Запрос по адресу в Rust
Запрос по известному адресу начинается с объекта клиента. Цепочка от адреса до отправки возвращает ответ или ошибку сети: сбой может случиться до того, как сервер что-то пришлет.
Тело ответа читают отдельным шагом после успешной отправки. Оба шага асинхронные, поэтому главная функция помечена атрибутом исполнителя и ждет результат через точку ожидания.
Создайте проект Cargo и из его корня выполните команду добавления крейта для HTTP с поддержкой JSON:
cargo add reqwest --features json
Исполнитель tokio к проекту уже
подключали командой cargo add tokio
--features macros,rt-multi-thread,time
в разделе про асинхронность. Без него
точки ожидания в главной функции не соберутся.
Запросим учебный хост и выведем длину текста ответа:
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let url = "https://example.com";
match client.get(url).send().await {
Ok(resp) => match resp.text().await {
Ok(body) => println!("{}", body.len()),
Err(e) => println!("{}", e),
},
Err(e) => println!("{}", e),
}
}
На экране число байт в теле, если хост доступен. Сеть или DNS могут дать сбой, и тогда сработает ветка с текстом ошибки.
Тот же прием удобнее вынести в функцию с исходом сбоя крейта:
async fn load_len(client: &reqwest::Client, url: &str) -> Result<usize, reqwest::Error> {
let resp = client.get(url).send().await?;
let body = resp.text().await?;
Ok(body.len())
}
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let url = "https://example.com";
match load_len(&client, url).await {
Ok(n) => println!("{}", n),
Err(e) => println!("{}", e),
}
}
Дан адрес:
https://example.com
Создайте клиент, выполните запрос по этой строке, прочитайте тело ответа и выведите его длину. Сбой сети разберите через сопоставление и напечатайте текст ошибки.
Скажите, на каком шаге появляется ошибка крейта, если имя хоста в адресе не находится: при отправке или при чтении тела.
Дан адрес:
https://example.com
Запишите асинхронную функцию с исходом сбоя библиотеки, которая возвращает первые тридцать символов текста ответа или сообщение об ошибке. Вызовите ее из главной функции с атрибутом исполнителя.