Study
Rocket

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>`.

Editor Latihan

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`.