我决定使用超级创建来构建一个服务器,该服务器读取POST方法的主体数据。以下link解释了我正在寻找的一部分内容,但我不想使用tokio::run
或future::lazy
,因为根据我的理解,超级用户使用东京期货和期货,并且超级机构返回流。因此,我试图完成的工作是找到其他处理流的方法,并再次获得有关超级请求方法的更多知识。
[在第一种方法中,我concat2
然后调用wait
。 wait
阻止当前线程,因此我的代码挂起。
if Method::POST == req.method() {
let body = req.into_body().concat2().wait();
// convert to json and do something with the data.
Ok(Response::new(Body::from("OK: data submitted")))
}
[在第二种方法中,我尝试使用poll
和and_then
,但我总是得到NotReady
。结果类型为futures::poll::Async<hyper::Chunk>
。
if Method::POST == req.method() {
let body = req.into_body().concat2().poll().and_then(|e| {
// do something
Ok(e)
});
match body {
Ok(e) => println!("{:#?}", e),
Err(r) => println!("{:#?}", r),
};
Ok(Response::new(Body::from("")))
}
[如果可能,请说明如何处理futures::poll::Async
和wait()
的良好做法。目前,async
/ await
在Rust中不稳定,因此无法使用。
[我确定您已经发现,在期货上调用wait()
是一种反模式并破坏了整体异步IO的目的(因为您正在阻塞线程,从而使执行者处于阻塞状态)这样)。
hyper
路由接受实现IntoFuture
的返回值,该返回值以覆盖方式为IntoFuture
和Option<T>
实现。因此,您实际编写的内容根本不需要阻止-您只需要像这样组合期货:
代码中的Result<T, E>
您甚至没有使用
if Method::POST == req.method() {
req.into_body().concat2().map(|_body| {
Response::new(Body::from("OK: data submitted"))
})
}
内容,但我假设这是出于MCVE的目的。在body
组合器内部,该值当前显示为map()
,并允许您使用它进行任何操作。[我猜您由于文档而发现自己处在这个角落–所有组合器都在_body
特征对象上;它们不是在FutureExt
和FutureExt
特征本身上定义的。结果,当查看0.2 / 0.3 doc时,它们不会立即浮出水面,因此,您看来唯一可用的呼叫是Future
和Stream
。