rust 如何在Hyper中通过POST接收数据?

pgccezyw  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(233)

我真正想做的是标题所说的,我想知道如何在hyper中接收每个帖子的数据,例如,假设我执行以下命令(hyper中的服务器运行在端口:8000上):

curl -X POST -F "field=@/path/to/file.txt" -F "tool=curl" -F "other-file=@/path/to/other.jpg" http://localhost:8000

现在,我将以hyper主页上的部分代码为例:

use std::{convert::Infallible, net::SocketAddr};
use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};

async fn handle(_: Request<Body>) -> Result<Response<Body>, Infallible> {
    Ok(Response::new("Hello, World!".into()))
}

#[tokio::main]
async fn main() {
    let addr = SocketAddr::from(([127, 0, 0, 1], 8000));

    let make_svc = make_service_fn(|_conn| async {
        Ok::<_, Infallible>(service_fn(handle))
    });

    let server = Server::bind(&addr).serve(make_svc);

    if let Err(e) = server.await {
        eprintln!("server error: {}", e);
    }
}

那么,现在,有了这些基本代码,我如何接收上面的curl命令发送的每个帖子的数据?我如何调整代码以读取数据?我尝试在互联网上搜索,但我发现hyper实际上并不根据HTTP方法拆分请求正文。它们都是同一个身体的一部分。但是我还没有找到一种方法来处理像上面这样的数据和像我这样的代码。

编辑

我试了他们在答案里给我的密码,就是这个密码:

async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
    let mut files = multipart::server::Multipart::from(req);
     .....
}

但我得到这个错误:
应为结构multipart::server::Multipart,找到结构hyper::Request
我该怎么解决呢?

06odsfpq

06odsfpq1#

它是一个单独的主体,但是数据是以包含多个文件的方式编码的,这称为multipart,为了正确地解析主体,您需要一个multipart库,例如https://crates.io/crates/multipart
对于hyper集成,您需要在Cargo.toml中添加特性标志hyper

multipart = { version = "*", features = ["hyper"] }

然后

async fn handle(mut files: multipart::server::Multipart) -> Result<Response<Body>, Infallible> {
    files.foreach_entry(|field| {
        // contains name, filename, type ..
        println!("Info: {:?}",field.headers);
        // contains data
        let mut bytes:Vec<u8> = Vec::new();
        field.data.read_to_end(&mut bytes);
    });
    Ok(Response::new("Received the files!".into()))
}

您也可以这样使用它

async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
    let mut files = multipart::server::Multipart::from(req);
     .....
}

相关问题