如何将hyper 0.14分块数据流发送代码升级至hyper 1.0?
Hyper 0.14 升级至1.0:通道写入请求体的等价实现
我有一段基于Hyper 0.14的可运行代码,核心需求是通过通道发送端向请求体写入数据,简化后的代码如下:
let (sender, body) = Body::channel(); let request = Request::builder() .method(Method::POST) .uri("http://localhost:3000/") .header("content-type", "text") .body(body) .unwrap(); let client = Client::new(); let response = client.request(request); tokio::spawn(async move { let mut sender = sender; println!( "Body: {:?}", sender.send_data(hyper::body::Bytes::from("test\n")).await ); println!( "Body: {:?}", sender.send_data(hyper::body::Bytes::from("test2\n")).await ); }); println!("{:?}", response.await);
现在尝试将这段代码升级至Hyper 1.0,但不确定如何实现等价功能。我尝试用mpsc通道配合StreamBody和ReceiverStream,但代码无法编译,甚至不确定这个思路是否正确,尝试的代码如下:
let (tx, rx) = mpsc::channel::<Frame<Bytes>>(100); let stream: ReceiverStream<hyper::body::Frame<bytes::Bytes>> = ReceiverStream::new(rx); let body: StreamBody<ReceiverStream<hyper::body::Frame<bytes::Bytes>>> = StreamBody::new(stream); let boxed_body = body.boxed(); // 此处编译错误 let request = Request::builder() .method(Method::POST) .uri("http://localhost/test") .body(boxed_body) .unwrap(); let response = client.request(request); tokio::spawn(async move { let mut sender = sender; println!( "Body: {:?}", sender.send(Frame::data(Bytes::from("test\n"))).await ); println!( "Body: {:?}", sender.send(Frame::data(Bytes::from("test2\n"))).await ); }); println!("{:?}", response.await);
内容的提问来源于stack exchange,提问作者Yana K.
相关产品推荐
相关产品推荐

