无法读取通过hyper :: client :: Client发出HTTP请求的简单有效负载:不满足特征绑定`Body:Future` [英] Can't read a simple payload making HTTP request via hyper::client::Client: the trait bound `Body: Future` is not satisfied
问题描述
我正在尝试将结果
转换为 Buffer
:
let ufc_root: String =
String::from("https://www.ufc.com/athletes/all?filters%5B0%5D=status%3A23");
// let ufc_root: String = String::from("https://www.google.com");
let https = HttpsConnector::new(4).unwrap();
let client = Client::builder().build::<_, hyper::Body>(https);
client
.get(ufc_root.parse::<hyper::Uri>().unwrap())
.and_then(|res| {
println!("http status code: {}", res.status());
println!("http response headers:\n{:?}: ", res.headers());
res.into_body()
})
.from_err::<WebScrapeError>()
.and_then(|body| {
body.for_each(|chunk| {
println!("{}", chunk.into_bytes());
});
let jon_jones = Subject {
name: "Jon Jones".to_string(),
link: "http://www.jonjones.com".to_string(),
};
let subjects = vec![jon_jones];
Ok(subjects)
})
.from_err()
error[E0277]: the trait bound `hyper::Body: hyper::rt::Future` is not satisfied
--> src/scrapper.rs:24:14
|
24 | .and_then(|res| {
| ^^^^^^^^ the trait `hyper::rt::Future` is not implemented for `hyper::Body`
|
= note: required because of the requirements on the impl of `futures::future::IntoFuture` for `hyper::Body`
error[E0599]: no method named `from_err` found for type `futures::future::and_then::AndThen<hyper::client::ResponseFuture, hyper::Body, [closure@src/scrapper.rs:24:23: 28:14]>` in the current scope
--> src/scrapper.rs:29:14
|
29 | .from_err::<WebScrapeError>()
| ^^^^^^^^
|
= note: the method `from_err` exists but the following trait bounds were not satisfied:
`&mut futures::future::and_then::AndThen<hyper::client::ResponseFuture, hyper::Body, [closure@src/scrapper.rs:24:23: 28:14]> : hyper::rt::Future`
`&mut futures::future::and_then::AndThen<hyper::client::ResponseFuture, hyper::Body, [closure@src/scrapper.rs:24:23: 28:14]> : hyper::rt::Stream`
`futures::future::and_then::AndThen<hyper::client::ResponseFuture, hyper::Body, [closure@src/scrapper.rs:24:23: 28:14]> : hyper::rt::Future`
为什么不编译?
推荐答案
and_then
必须返回将来,或者可以通过它实际上是一个流.
and_then
must return a future, or something that can be converted into a future via the IntoFuture
trait. You're returning res.into_body()
, which is not a future - it's actually a stream.
要使其正常工作,您需要将该流转换为将来的内容,以表示该主体已被完全读取.这里有几个可用的选项:
To get this to work, you'll need to convert that stream into a future which represents the body having been fully read. There's several options available to you here:
-
res.into_body().concat2()
,它将所有读取的字节连接到单个缓冲区中 -
res.into_body().collect()
,它将所有字节块收集到Vec
-
res.into_body().into_future()
,它将解析为一个元组,其中包含流中的第一项以及流本身的其余部分(即(T,Stream< Item = T>)
)
res.into_body().concat2()
, which concatenates all of the read bytes into a single bufferres.into_body().collect()
, which collects all of the chunks of bytes into aVec
res.into_body().into_future()
, which will resolve to a tuple containing the first item from the stream, and the remainder of the stream itself (i.e.(T, Stream<Item = T>)
)
存在多种不同(同等有效)方式将 Stream
表示为 Future
的事实,这可能是为什么前者没有全面实现 IntoFuture
.
The fact that there's multiple different (and equally valid) ways to represent a Stream
as a Future
is likely why the former doesn't have a blanket implementation of IntoFuture
.
显示 查看全文