Rust+Rocket:如何从请求中以字符串形式读取POST正文



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

该文档描述了如何从POST请求的主体中读取JSON对象,以及如何读取多部分表单数据,而不是原始字符串。有人知道怎么做吗?


更新:

根据Dave下面的回答中的建议,我实现了FromDataSimple特性,试图解析请求体。这就是我所实现的,但它只导致了一个";404未找到";响应:

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未找到的响应:-(

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();
}

Body数据处理与Rocket的许多数据处理一样,是类型导向的。为了指示处理程序期望正文数据,用data="对其进行注释&";,其中param是处理程序中的参数。参数的类型必须实现FromData特性。看起来是这样的,假设T实现FromData:

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

因此,您只需要创建一个实现FromDataSimple或FromData的类型

最新更新