Forms 在Rocket中使用结构解析HTTP多部分POST

Forms 在Rocket中使用结构解析HTTP多部分POST,forms,rust,http-post,rust-rocket,Forms,Rust,Http Post,Rust Rocket,我想使用结构解析Rocket中的HTTP POST。提交表单时失败 我阅读了这个示例并得到了这个代码 #[derive(FromForm)] struct ConvertFile { name: String, filename: String } #[post("/submit", format = "multipart/form-data", data = "<form>")] fn submit(form: Form<ConvertFile>) {

我想使用结构解析Rocket中的HTTP POST。提交表单时失败

我阅读了这个示例并得到了这个代码

#[derive(FromForm)]
struct ConvertFile {
    name: String,
    filename: String
}

#[post("/submit", format = "multipart/form-data", data = "<form>")]
fn submit(form: Form<ConvertFile>) {
    println!("form field: {}", form.get().name);
}
火箭控制台会以

多部分/表单数据;边界=---------------------------8495649d6ed34d20:
=>匹配:发布/提交多部分/表单数据
=>警告:表单数据没有表单内容类型。
=>结果:前进
=>错误:POST/submit多部分/表单数据没有匹配的路由;边界=---------------------------8495649d6ed34d2。
=>警告:使用404未找到捕捉器进行响应。
=>响应成功。
我想提交一个文件,即
multipart/formdata
。在试图找到原因时,我在结构中使用了
字符串
,使其更简单。因此,首先它会响应一个
匹配:
,然后没有匹配的路由

这篇简单的文章:

#[post("/convert", format = "text/plain", data = "<file>")]
fn convert_file(file: String) {
    println!("file: {}", file);
}
#[post(“/convert”,format=“text/plain”,data=”“)]
fn convert_文件(文件:字符串){
println!(“文件:{}”,文件);
}
我用的是最新的夜间防锈漆


我做错了什么?

Rocket还不支持
多部分
表单

您可以在此处看到跟踪问题:


这个答案中给出了一个可能的解决方法:

我不确定,但是您是否在
curl
命令中尝试过匹配表单字段?在
转换文件
中有
文件
文件名
,而不是
名称
文件名
。结构中的字段来自自动保存在SO中的早期草稿。所以当我提交问题时,我忘了用当前的curl命令修改它。谢谢你注意到这一点,我已经修改了它,所以它是正确的。谢谢。但是,上的示例一定不准确?不,表单可以工作,只是不能使用多部分内容类型。嗯,http表单post使用curl是我发送时遇到的问题
curl-X POST-f name=claus filename=claus.jpg
。这对我来说很好:
curl-X POST--data“name=claus&filename=claus.jpg”http://localhost:8000
:火箭似乎试图将
多部分/表单数据
多部分/表单数据进行匹配;boundary=..
显然失败了。正如答案中所说,您需要使用FromData而不是FromForm,并自己解析主体。