使用 Rocket 中的结构解析 HTTP 多部分 POST
Parsing HTTP multipart POST using a struct in Rocket
我想在 Rocket 中使用结构解析 HTTP POST。提交表单后失败。
我阅读了 body data 示例并获得了这段代码。
#[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);
}
我使用 curl 提交:
curl -H "Content-Type: multipart/form-data" -F "name=Claus" -F "filename=claus.jpg" http://localhost:8000/submit
Rocket 控制台响应
multipart/form-data; boundary=------------------------8495649d6ed34d20:
=> Matched: POST /submit multipart/form-data
=> Warning: Form data does not have form content type.
=> Outcome: Forward
=> Error: No matching routes for POST /submit multipart/form-data; boundary=------------------------8495649d6ed34d2.
=> Warning: Responding with 404 Not Found catcher.
=> Response succeeded.
我想提交文件,因此 multipart/form-data
。在尝试查找原因时,我在结构中使用了 String
以使其更简单。所以首先它用 Matched:
响应,然后没有匹配的路由。
这个更简单的 POST 有效:
#[post("/convert", format = "text/plain", data = "<file>")]
fn convert_file(file: String) {
println!("file: {}", file);
}
我正在使用最新的夜间 Rust 和 rustup。
我做错了什么?
Rocket 尚不支持 multipart
表单。
您可以在此处查看跟踪问题:https://github.com/SergioBenitez/Rocket/issues/106
此答案中给出了可能的解决方法:
我想在 Rocket 中使用结构解析 HTTP POST。提交表单后失败。
我阅读了 body data 示例并获得了这段代码。
#[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);
}
我使用 curl 提交:
curl -H "Content-Type: multipart/form-data" -F "name=Claus" -F "filename=claus.jpg" http://localhost:8000/submit
Rocket 控制台响应
multipart/form-data; boundary=------------------------8495649d6ed34d20:
=> Matched: POST /submit multipart/form-data
=> Warning: Form data does not have form content type.
=> Outcome: Forward
=> Error: No matching routes for POST /submit multipart/form-data; boundary=------------------------8495649d6ed34d2.
=> Warning: Responding with 404 Not Found catcher.
=> Response succeeded.
我想提交文件,因此 multipart/form-data
。在尝试查找原因时,我在结构中使用了 String
以使其更简单。所以首先它用 Matched:
响应,然后没有匹配的路由。
这个更简单的 POST 有效:
#[post("/convert", format = "text/plain", data = "<file>")]
fn convert_file(file: String) {
println!("file: {}", file);
}
我正在使用最新的夜间 Rust 和 rustup。
我做错了什么?
Rocket 尚不支持 multipart
表单。
您可以在此处查看跟踪问题:https://github.com/SergioBenitez/Rocket/issues/106
此答案中给出了可能的解决方法: