Rust 如何转换hyper';s体流进入结果<;Vec<;字符串>>;?

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

我正在将代码更新到最新版本的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: 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();
//获取所有数据块,而不是