Study
Rocket

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

Editor Latihan

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.