Mengambil Header Request
Penjelasan
Selain path, query, dan body, kadang kamu perlu membaca header request secara langsung — kasus paling umum adalah header `Authorization` untuk token autentikasi. Axum menyediakan extractor `HeaderMap` untuk mengakses seluruh header request sebagai koleksi key-value. `HeaderMap` mengikuti aturan urutan extractor yang sama seperti extractor lain yang tidak menyentuh body — bisa ditempatkan di posisi mana saja sebelum extractor body seperti `Json<T>`. Untuk kasus yang lebih spesifik seperti mengekstrak dan memvalidasi token Bearer, Axum menyediakan extractor `TypedHeader` (dari crate `axum-extra`) yang bisa langsung mem-parsing header tertentu (misalnya `Authorization: Bearer <token>`) menjadi tipe terstruktur, tapi memahami `HeaderMap` mentah dulu penting sebagai dasar sebelum memakai abstraksi yang lebih tinggi.
Contoh Konsep
use axum::{http::HeaderMap, routing::get, Router};
async fn whoami(headers: HeaderMap) -> String {
match headers.get("authorization") {
Some(value) => format!("Header Authorization: {:?}", value),
None => "Tidak ada header Authorization".to_string(),
}
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/whoami", get(whoami));
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
// curl -H "Authorization: Bearer abc123" http://127.0.0.1:3000/whoami
Praktikum
Buat handler `check_lang` yang membaca header `Accept-Language` dan mengembalikan nilainya, atau "tidak ditentukan" jika tidak ada.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Nama header bersifat case-insensitive, tapi `HeaderMap::get()` mengharapkan penulisan huruf kecil semua (`"authorization"`, bukan `"Authorization"`) — kalau kamu memakai huruf kapital dan hasilnya selalu `None` padahal header sudah dikirim, ini penyebab paling umum.