Study
Axum

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.

Editor Latihan

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.