Path Extractor
Penjelasan
Extractor adalah cara Axum mengambil data dari request dan menyerahkannya ke handler sebagai parameter fungsi. `Path<T>` adalah extractor untuk mengambil segmen dinamis dari URL, misalnya `id` pada path `/users/{id}`. Cara pakainya: tambahkan parameter `Path(nama_variabel): Path<Tipe>` pada signature handler. Axum otomatis mem-parsing segmen path sesuai tipe yang diminta — kalau kamu minta `Path<u32>` tapi segmen path bukan angka, Axum otomatis mengembalikan response 400 Bad Request sebelum handler-mu sempat dijalankan. Kalau ada lebih dari satu segmen dinamis (misalnya `/users/{user_id}/posts/{post_id}`), kamu bisa memakai tuple: `Path((user_id, post_id)): Path<(u32, u32)>`, atau lebih rapi lagi memakai struct yang meng-implementasi `Deserialize` dari Serde.
Contoh Konsep
use axum::{extract::Path, routing::get, Router};
async fn get_user(Path(user_id): Path<u32>) -> String {
format!("Detail user dengan id {}", user_id)
}
async fn get_user_post(Path((user_id, post_id)): Path<(u32, u32)>) -> String {
format!("Post {} milik user {}", post_id, user_id)
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/users/{user_id}", get(get_user))
.route("/users/{user_id}/posts/{post_id}", get(get_user_post));
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Praktikum
Buat handler `get_product` yang menerima `Path<u32>` bernama `product_id` dan mengembalikan string berisi id tersebut.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Untuk lebih dari dua segmen path, lebih baik pakai struct dengan `#[derive(Deserialize)]` daripada tuple panjang — nama field-nya otomatis dicocokkan dengan nama segmen path, jadi kodenya lebih jelas dibaca daripada `Path((a, b, c))` yang tidak jelas urutannya.