如何访问 Actix-web 中 Future 中的 HttpRequest 数据?
How do I access HttpRequest data inside a Future in Actix-web?
我想要一个 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
)的数据?
最简单的解决方案是以后根本不访问它:
extern crate actix_web; // 0.6.14
extern crate bytes; // 0.4.8
extern crate futures; // 0.1.21
use actix_web::{AsyncResponder, FutureResponse, HttpMessage, HttpRequest, HttpResponse};
use bytes::Bytes;
use futures::future::Future;
fn handler(req: HttpRequest) -> FutureResponse<HttpResponse> {
let url = format!(
"{scheme}://{host}",
scheme = req.connection_info().scheme(),
host = req.connection_info().host(),
);
req.body()
.from_err()
.and_then(move |bytes: Bytes| {
println!("Body: {:?}", bytes);
Ok(HttpResponse::Ok().body(url).into())
})
.responder()
}
如果这不仅仅是出于演示目的的快速破解,通过连接字符串构建 URL 是一个糟糕的主意,因为它不能正确转义值。您应该使用能为您做到这一点的类型。
我想要一个 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
)的数据?
最简单的解决方案是以后根本不访问它:
extern crate actix_web; // 0.6.14
extern crate bytes; // 0.4.8
extern crate futures; // 0.1.21
use actix_web::{AsyncResponder, FutureResponse, HttpMessage, HttpRequest, HttpResponse};
use bytes::Bytes;
use futures::future::Future;
fn handler(req: HttpRequest) -> FutureResponse<HttpResponse> {
let url = format!(
"{scheme}://{host}",
scheme = req.connection_info().scheme(),
host = req.connection_info().host(),
);
req.body()
.from_err()
.and_then(move |bytes: Bytes| {
println!("Body: {:?}", bytes);
Ok(HttpResponse::Ok().body(url).into())
})
.responder()
}
如果这不仅仅是出于演示目的的快速破解,通过连接字符串构建 URL 是一个糟糕的主意,因为它不能正确转义值。您应该使用能为您做到这一点的类型。