Rust 如何转换hyper';s体流进入结果<;Vec<;字符串>>;?
我正在将代码更新到最新版本的hyper和futures,但我尝试过的所有东西都没有实现某种类型的特性 这是一个不起作用的例子Rust 如何转换hyper';s体流进入结果<;Vec<;字符串>>;?,rust,future,hyper,Rust,Future,Hyper,我正在将代码更新到最新版本的hyper和futures,但我尝试过的所有东西都没有实现某种类型的特性 这是一个不起作用的例子 extern crate futures; // 0.3.5 extern crate hyper; // 0.13.6 use futures::{future, FutureExt, StreamExt, TryFutureExt, TryStreamExt}; use hyper::body; fn get_body_as_vec<'a>(b: bo
extern crate futures; // 0.3.5
extern crate hyper; // 0.13.6
use futures::{future, FutureExt, StreamExt, TryFutureExt, TryStreamExt};
use hyper::body;
fn get_body_as_vec<'a>(b: body::Body) -> future::BoxFuture<'a, Result<Vec<String>, hyper::Error>> {
let f = b.and_then(|bytes| {
let s = std::str::from_utf8(&bytes).expect("sends no utf-8");
let mut lines: Vec<String> = Vec::new();
for l in s.lines() {
lines.push(l.to_string());
}
future::ok(lines)
});
Box::pin(f)
}
extern板条箱期货;//0.3.5
外部板条箱超链接;//0.13.6
使用未来:{future,FutureExt,StreamExt,TryFutureExt,TryStreamExt};
使用hyper::body;
fn获取身体作为向量{
设f=b,然后|字节|{
设s=std::str::from_utf8(&bytes).expect(“不发送utf-8”);
让mut行:Vec=Vec::new();
对于s.行中的l(){
按(l.到字符串());
}
未来::确定(行)
});
盒子:插脚(f)
}
这将产生以下错误:
error[E0277]:未满足特性绑定'futures::stream::and then:futures::Future'
-->src/lib.rs:17:5
|
17 |盒::销(f)
|^^^^^^^^^^^^^^^^特性“futures::Future”未为“futures::stream::Then”实现`
|
=注意:强制转换到对象类型'dyn futures::Future+std::marker::Send'时需要`
我无法创造一个兼容的未来<代码>正文是一个流,我找不到任何实现了所需特征的“转换器”函数
在hyper 0.12中,我使用了以下命令中的concat2()
请注意,此函数使用接收流并返回
它的包装版本
处理整个流并返回一个表示
成功或错误,请使用为每个
尝试
是的,您的f
仍然是一个流,try\u for\u each
将按照建议的参考工作,但是try\u fold
将字节表示为向量中的行是一个更好的选择,但是如果我们直接将块转换为UTF-8,则可能会从响应中丢失多字节字符的完整性
由于数据的一致性,最简单的解决方案可能是在转换为UTF-8之前收集所有字节
使用未来:{future,FutureExt,TryStreamExt};
使用hyper::body;
fn获取身体作为向量{
设f=b
.try_fold(vec![],| mut vec,bytes |{
vec.extend_from_slice(&字节);
未来::ok(vec)
})
.map(|x|){
好(std::str::from_utf8(&x?)吗?
.行()
.map(ToString::to_字符串)
.collect())
});
盒子:插脚(f)
}
您可以使用hyper Body中的通道测试多块行为。下面是我在chunks场景中创建的行分区,这对上面的代码很好,但是如果直接处理chunks,就会失去一致性
let(mut sender,body)=body::body::channel();
东京:产卵(异步移动){
发件人
.send_data(“Line1\nLine2\nLine3\nLine4\nLine5.into())
.等待;
发件人
.send_data(“第5行的下一个字节\nLine6\nLine7\nLine8\n----”.into())
.等待;
});
普林顿!(“{:?}”,获取body作为vec(body.wait);
- (成功情景)
- (失败场景:“第5行的下一个字节”将被删除
在
Vec
中表示为新行
注意:我使用了std::error:error
作为返回类型,因为hyper::error
和FromUtf8Error
都实现了它,您仍然可以使用expect
策略和hyper::error
来自:
请注意,此函数使用接收流并返回
它的包装版本
处理整个流并返回一个表示
成功或错误,请使用为每个
尝试
是的,您的f
仍然是一个流,try\u for\u each
将按照建议的参考工作,但是try\u fold
将字节表示为向量中的行是一个更好的选择,但是如果我们直接将块转换为UTF-8,则可能会从响应中丢失多字节字符的完整性
由于数据的一致性,最简单的解决方案可能是在转换为UTF-8之前收集所有字节
使用未来:{future,FutureExt,TryStreamExt};
使用hyper::body;
fn获取身体作为向量{
设f=b
.try_fold(vec![],| mut vec,bytes |{
vec.extend_from_slice(&字节);
未来::ok(vec)
})
.map(|x|){
好(std::str::from_utf8(&x?)吗?
.行()
.map(ToString::to_字符串)
.collect())
});
盒子:插脚(f)
}
您可以使用hyper Body中的通道测试多块行为。下面是我在chunks场景中创建的行分区,这对上面的代码很好,但是如果直接处理chunks,就会失去一致性
let(mut sender,body)=body::body::channel();
东京:产卵(异步移动){
发件人
.send_data(“Line1\nLine2\nLine3\nLine4\nLine5.into())
.等待;
发件人
.send_data(“第5行的下一个字节\nLine6\nLine7\nLine8\n----”.into())
.等待;
});
普林顿!(“{:?}”,获取body作为vec(body.wait);
- (成功情景)
- (失败场景:“第5行的下一个字节”将被删除
在
Vec
中表示为新行
注意:我使用了std::error:error
作为返回类型,因为hyper::error
和FromUtf8Error
实现了它,您仍然可以将expect
策略与hyper::error结合使用。我发现了两种解决方案,每种都非常简单:
/*
警告初学者!!!本使用声明
很重要,所以我们以后可以使用.data()方法!!!
*/
使用hyper::body::{to_字节,HttpBody};
//只需要一块数据!
让我的_vector:Vec=request.into_body().data().wait.unwrap().unwrap().to_Vec();
//获取所有数据块,而不是