Kombinasi Banyak Extractor
Penjelasan
Handler di aplikasi nyata jarang hanya memakai satu extractor — biasanya kamu butuh `Path<T>` untuk id resource, `State<T>` untuk akses database, dan `Json<T>` untuk data yang dikirim client, semuanya sekaligus dalam satu handler. Topik ini merangkum semua extractor yang sudah kamu pelajari, dipraktikkan bersamaan sesuai aturan urutan dari topik sebelumnya. Contoh kasus nyata: endpoint update catatan (`PUT /notes/{id}`) butuh id dari path, koneksi database dari state, dan data baru dari body JSON. Ketiganya digabung dalam satu signature handler dengan urutan yang benar (Path dan State duluan, Json paling akhir). Memahami cara mengombinasikan extractor ini adalah kunci menulis handler Axum yang idiomatis — daripada mengambil `Request` mentah lalu mem-parsing manual, biarkan Axum melakukan semua ekstraksi dan validasi tipe secara otomatis lewat signature fungsi.
Contoh Konsep
use axum::{extract::{Path, Query, State}, routing::put, Json, Router};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
struct AppState;
#[derive(Deserialize)]
struct UpdateNote {
title: String,
}
#[derive(Deserialize)]
struct Opts {
notify: Option<bool>,
}
#[derive(Serialize)]
struct NoteResponse {
id: u32,
title: String,
notified: bool,
}
async fn update_note(
Path(id): Path<u32>,
Query(opts): Query<Opts>,
State(_state): State<Arc<AppState>>,
Json(payload): Json<UpdateNote>,
) -> Json<NoteResponse> {
Json(NoteResponse {
id,
title: payload.title,
notified: opts.notify.unwrap_or(false),
})
}
#[tokio::main]
async fn main() {
let state = Arc::new(AppState);
let app = Router::new()
.route("/notes/{id}", put(update_note))
.with_state(state);
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Praktikum
Susun handler `add_comment` yang menerima `Path<u32>` (note_id), `State<Arc<AppState>>`, dan `Json<NewComment>` dalam urutan yang benar.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kalau signature handler mulai terasa terlalu panjang (banyak extractor), itu sering jadi tanda handler-mu mengerjakan terlalu banyak hal sekaligus — pertimbangkan memecah logic ke fungsi helper terpisah yang menerima nilai biasa (bukan extractor), supaya handler tetap ramping dan gampang diuji.