Я хотел бы иметь веб-обработчик Actix, который отвечает на запрос POST, выводя тело POST на консоль и создавая HTTP-ответ, содержащий текущий URL-адрес из объекта запроса.
При чтении тела запроса POST, похоже, необходимо задействовать фьючерсы. Ближайшее, что я получил до сих пор:
fn handler(req: HttpRequest) -> FutureResponse<HttpResponse> {
req.body()
.from_err()
.and_then(|bytes: Bytes| {
println!("Body: {:?}", bytes);
let url = format!("{scheme}://{host}",
scheme = req.connection_info().scheme(),
host = req.connection_info().host());
Ok(HttpResponse::Ok().body(url).into())
}).responder()
}
Это не будет компилироваться, потому что будущее переживет обработчик, поэтому мои попытки прочитать req.connection_info()
незаконны. Ошибка компилятора предполагает, что я использую ключевое слово move
в определении закрытия, то есть .and_then(move |bytes: Bytes| {
. Это также не будет компилироваться, потому что req
перемещается при вызове req.body()
, а затем захватывается после перемещения в ссылках, составляющих url
.
Каков разумный способ создания области, в которой у меня есть доступ к данным, прикрепленным к объекту запроса (например, connection_info
), одновременно с доступом к телу POST?