繁体   English   中英

Rust + Rocket:如何从请求中读取 POST 正文作为字符串?

[英]Rust + Rocket: How I do read POST body from request as string?

我正在使用 Rust 和 Rocket 构建一个简单的 REST API。 其中一个端点接受 POST 方法请求,并从请求正文中读取一个大字符串。 我不知道如何用 Rocket 做到这一点。

该文档描述了如何从 POST 请求的正文中读取 JSON object,以及如何读取多部分表单数据,而不是原始字符串。 有谁知道如何做到这一点?


更新:

按照下面 Dave 的回答中的建议,我实现了 FromDataSimple 特征来尝试解析请求正文。 这是我已经实现的,但它只导致得到“404 Not Found”响应:

struct Store {
    contents: String,
}

impl FromDataSimple for Store {
    type Error = String;

    fn from_data(req: &Request, data: Data) -> data::Outcome<Self, String> {
        let mut contents = String::new();

        if let Err(e) = data.open().take(256).read_to_string(&mut contents) {
            return Failure((Status::InternalServerError, format!("{:?}", e)));
        }

        Success(Store { contents })
    }
}

#[post("/process", format = "application/json", data = "<input>")]
fn process_store(input: Store) -> &'static str {
    "200 Okey Dokey"
}

不幸的是,当我运行它然后使用以下请求 ping 它时,我只收到 404 Not Found 响应:-(

curl -X POST -H "Content-Type: application/json" --data "{ \"contents\": \"testytest\"}"  http://localhost:8080/process

更新 2:

实际上这确实有效,我只是忘记了将方法安装到路由处理程序中:

fn main() {
    rocket::ignite().mount("/", routes![index, process_store]).launch();
}

身体数据处理,就像 Rocket 的大部分内容一样,是类型导向的。 要指示处理程序需要正文数据,请使用 data = "" 对其进行注释,其中 param 是处理程序中的参数。 参数的类型必须实现 FromData 特征。 看起来像这样,假设 T 实现 FromData:

#[post("/", data = "<input>")]
fn new(input: T) { /* .. */ }

所以你只需要创建一个实现FromDataSimpleFromData的类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM