2017-07-25 1 views
3

構造体を使用してRocketでHTTP POSTを解析する必要があります。フォームを送信すると失敗します。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 -H "Content-Type: multipart/form-data" -F "name=Claus" -F "filename=claus.jpg" http://localhost:8000/submit 

をし、ロケットコンソールは、私が故にmultipart/form-dataファイルを送信したい

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. 

で応答します。理由を見つけようとしたとき、構造体にStringを使用して簡単にしました。最初にそれはMatched:で応答し、一致するルートはありません。

このシンプルなPOSTが機能:

#[post("/convert", format = "text/plain", data = "<file>")] 
fn convert_file(file: String) { 
    println!("file: {}", file); 
} 

私はrustupと最新毎晩ラストを使用しています。

私は間違っていますか?

+0

私はわからないんだけど、あなたは 'curl'コマンドで一致したフォームフィールドで試してみました?あなたは 'name'と' filename'ではなく、 'ConvertFile'に' file'と 'filename'を持っています。 –

+0

構造体のフィールドは、SOで自動保存された以前の草案からのものでした。だから私は質問を提出したときに現在のcurlコマンドで修正するのを忘れていた。これに気づいてくれてありがとう、私はそれが正しいように修正しました。 – kometen

答えて

3

ロケットはまだmultipartフォームをサポートしていません。

あなたがここに追跡問題を見ることができます:https://github.com/SergioBenitez/Rocket/issues/106

を可能な回避策は、この答えに与えられる:How to parse multipart forms using abonander/multipart with Rocket?

+0

ありがとうございます。しかし、https://rocket.rs/guide/requests/#formsの例は不正確でなければなりませんか? – kometen

+0

いいえ、フォームは機能しますが、マルチパートのコンテンツタイプではありません。 – belst

+0

うーん、httpフォームのポストは、私が問題を送っているものを使用しています。 'curl -X POST -f name = claus filename = claus.jpg'となります。 – kometen

関連する問題