You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:23:18