Forms dengan FromForm
Penjelasan
Selain JSON, Rocket juga punya dukungan kelas satu untuk data form HTML tradisional (`application/x-www-form-urlencoded` atau `multipart/form-data`) lewat derive `#[derive(FromForm)]` pada struct. Ini berguna kalau backend Rocket-mu juga melayani halaman HTML dengan form submit biasa, bukan cuma API JSON. Untuk menerimanya di handler, gunakan tipe `Form<T>` (untuk urlencoded) sebagai parameter dengan `data = "<...>"` di attribute macro, mirip pola `Json<T>` yang sudah kamu pelajari. Field struct bisa langsung memakai tipe Rust biasa (`String`, `u32`, `bool`), dan Rocket otomatis mem-parsingnya dari data form. Untuk upload file (`multipart/form-data`), Rocket menyediakan tipe khusus seperti `TempFile` sebagai tipe field, memungkinkan kamu menangani unggahan file langsung sebagai bagian dari struct form yang sama.
Contoh Konsep
#[macro_use] extern crate rocket;
use rocket::form::Form;
#[derive(FromForm)]
struct ContactForm {
name: String,
message: String,
}
#[post("/contact", data = "<form>")]
fn submit_contact(form: Form<ContactForm>) -> String {
format!("Terima kasih, {}. Pesanmu sudah kami terima.", form.name)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![submit_contact])
}
Praktikum
Buat struct `SubscribeForm` dengan field `email: String`, lalu handler `subscribe` yang menerima `Form<SubscribeForm>`.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
`FromForm` juga mendukung validasi field secara deklaratif lewat atribut `#[field(validate = ...)]`, mirip semangat crate `validator` yang dipakai di Axum, tapi ini bawaan Rocket sendiri tanpa perlu dependency tambahan — cocok dipakai kalau kamu ingin validasi ringan tanpa menambah crate baru ke `Cargo.toml`.