Study
Axum

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.

Editor Latihan

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.