Open2

axumでcheckboxのPOST値を受け取る

systemkdsystemkd

問題点

axumでPOST値を受け取って処理をを作成していたら、checkboxの値が取得できない問題に遭遇する。
どうやら、axum::Formでは下記のような配列で受け取るようなことはできないらしい。

<input type="checkbox" name="options" value="option1"> Option 1<br>
<input type="checkbox" name="options" value="option2"> Option 2<br>
<input type="checkbox" name="options" value="option3"> Option 3<br>

Form受取部分コード抜粋

#[derive(Deserialize, Debug)]
struct FormParam {
  #[serde(default)]
  options: Vec<String>
}

async fn index(Form(form): Form<FormParam>) {
    // 受け取れない optionsは空状態
}
systemkdsystemkd

解決策

色々調べてserde_html_formでRequest値を処理するとかあったけど、ロジックをどうこうする必要ななく、axum-extraクレートを使えば良いみたい。

Cargo.toml

axum-extra = {version = "任意のバージョン", features = ["form"]}
use axum_extra::extract::Form;

async fn index(Form(form): Form<FormParam>) {
    // 受け取れた
}

axum-extraは直ぐ側にいたのに存在に気づけていないだけだった。。ありがとうaxum-extra