Я пишу веб-сервис на Rust 2018 Stable и Actix-Web. Используя Reqwest, я выполняю HTTP-запрос к другому сайту из одного обработчика маршрута. Simplyfied это выглядит так
extern crate reqwest;
use actix_web;
use reqwest::Url;
pub fn testing(req: actix_web::HttpRequest) -> actix_web::Result<actix_web::HttpResponse> {
println!(">>> testing request begin");
let url = Url::parse("https://example.com/").unwrap();
println!(">>> testing url built");
let req = reqwest::Client::new().post(url);
println!(">>> testing req prepared");
let res_struct = req.send();
println!(">>> testing res_struct received");
let res = res_struct.unwrap();
println!(">>> testing res unwrapped");
Ok(format!("done.").into())
}
Это не работает, и я получаю следующее сообщение об ошибке (ошибка печатается 8 раз, от «worker: 1» до «worker: 8», несмотря на то, что функция вызывается только один раз):
thread 'actix-rt:worker:1' panicked at 'called `Result::unwrap()`
on an `Err` value: Error(BlockingClientInFutureContext,
"https://www.example.com/")', src/libcore/result.rs:999:5
Panic in Arbiter thread, shutting down system.
Google не нашел ничего полезного в "BlockingClientInFutureContext", но я предполагаю, что это как-то связано с async / await или, может быть, с собственным фьючерсом Tokio?
Спасибо за любые указатели о том, что читать. Кроме того, я новичок в Rust.
Функция обработчика вызывается из Actix-Web HTttpServer:
HttpServer::new(|| App::new().service(
web::resource("/testing").route(
web::get().to(views::testing)
)
)).bind("127.0.0.1:8001")?.run()
.post(Url::parse(API_ENDPOINT).unwrap())
вы вызываете unwrap (), что приведет к панике, если unwrap () завершится с ошибкой. Вы пробовали изменить это на вызов, который не использует unwrap ()? - person Gardener   schedule 18.08.2019actix_web::web::block()
. - person C14L   schedule 18.08.2019