Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpHtDl 247 of 288 menu
◀ ▶

Предел времени в Rust

Долгое ожидание ответа лучше ограничивать настройкой клиента. Если сервер или сеть не уложились в срок, отправка возвращает ошибку, а не объект ответа с кодом.

Срок задают при сборке клиента через строитель и длительность из стандартной библиотеки. Готовый клиент хранит предел для каждого запроса, пока его не заменят новым значением.

Соберем клиент с пределом в две секунды:

use std::time::Duration; #[tokio::main] async fn main() { let client = match reqwest::Client::builder() .timeout(Duration::from_secs(2)) .build() { Ok(c) => c, Err(e) => { println!("{}", e); return; } }; let url = "https://example.com"; match client.get(url).send().await { Ok(resp) => { let code = resp.status().as_u16(); match resp.text().await { Ok(body) => println!("{} {}", code, body.len()), Err(e) => println!("{}", e), } } Err(e) => println!("{}", e), } }

При доступном хосте ответ часто успевает прийти за две секунды. Если срок короче задержки, сработает ветка с текстом ошибки отправки, а не число из ответа сервера.

Очень короткий предел на том же адресе:

use std::time::Duration; #[tokio::main] async fn main() { let client = match reqwest::Client::builder() .timeout(Duration::from_millis(1)) .build() { Ok(c) => c, Err(e) => { println!("{}", e); return; } }; let url = "https://example.com"; match client.get(url).send().await { Ok(resp) => println!("{}", resp.status().as_u16()), Err(e) => println!("stopped {}", e), } }

Дан адрес:

https://example.com

Соберите клиент с пределом три секунды, выполните запрос, выведите числовой код ответа или текст ошибки ожидания.

Скажите, где появится ошибка по времени: при сборке клиента или при отправке запроса, если сервер отвечает дольше заданного предела.

Дан адрес:

https://example.com

Запишите функцию с исходом сбоя библиотеки, которая создает клиент с пределом пять секунд и возвращает длину тела ответа. Разберите исход в главной функции.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить