Query Parameter
Penjelasan
Selain path, Rocket juga menangkap query string dengan sintaks `<nama>` — bedanya, parameter query ditulis SETELAH tanda tanya di dalam path attribute, misalnya `#[get("/search?<keyword>")]`. Kalau parameter query bersifat opsional (biasa terjadi), tipe parameternya dibungkus `Option<T>`. Untuk beberapa parameter query sekaligus, tulis semuanya dipisah koma di dalam tanda tanya, misalnya `#[get("/notes?<page>&<limit>")]`. Rocket otomatis mem-parsing tiap parameter sesuai tipe yang diminta di signature fungsi. Berbeda dari Axum yang membungkus semua query jadi satu struct lewat `Query<T>`, Rocket memecah tiap parameter query jadi parameter fungsi TERPISAH — pendekatan ini terasa lebih eksplisit tapi bisa membuat signature fungsi panjang kalau parameternya banyak. Untuk kasus itu, Rocket juga mendukung `#[get("/notes?<params..>")]` yang mengumpulkan semua query ke satu struct sekaligus (mirip pendekatan Axum), memakai `#[derive(FromForm)]`.
Contoh Konsep
#[macro_use] extern crate rocket;
#[get("/notes?<page>&<limit>")]
fn list_notes(page: Option<u32>, limit: Option<u32>) -> String {
let page = page.unwrap_or(1);
let limit = limit.unwrap_or(10);
format!("Menampilkan halaman {} dengan limit {}", page, limit)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![list_notes])
}
// Akses: /notes?page=2&limit=5
Praktikum
Buat handler `search` untuk path "/search?<keyword>" yang mengembalikan pesan berbeda tergantung ada tidaknya `keyword`.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kalau parameter query yang kamu deklarasikan WAJIB (tidak dibungkus `Option`) tapi client tidak mengirimnya, Rocket menganggap route ini TIDAK COCOK (bukan error 400) dan mencoba route lain yang mungkin cocok, baru mengembalikan 404 kalau tidak ada satu pun yang cocok — beda filosofi dari Axum yang langsung 400 untuk field wajib yang hilang.