【发布时间】:2018-07-08 10:08:57
【问题描述】:
我想要一个 Actix Web 处理程序,它通过将 POST 正文打印到控制台并构造一个包含来自请求对象的当前 URL 的 HTTP 响应来响应 POST 请求。
在读取请求的 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()
}
这不会编译,因为 future 比处理程序更长寿,所以我尝试读取 req.connection_info() 是非法的。编译器错误建议我在闭包定义中使用move 关键字,即.and_then(move |bytes: Bytes| {。这也不会编译,因为req 在req.body() 调用上被移动,然后在移动后在构造url 的引用中被捕获。
在访问 POST 正文的同时,我可以访问附加到请求对象的数据(例如 connection_info),构建一个范围的合理方法是什么?
【问题讨论】:
-
请查看如何创建minimal reproducible example,然后查看edit 您的问题以包含它。我们无法分辨代码中存在哪些 crate、类型、特征、字段等。理想情况下,在Rust Playground 上生成可以重现您的错误的内容。还有Rust-specific MCVE tips。
-
HttpReqauest 实现克隆特征
标签: rust future lifetime rust-actix