Content Negotiation — Web Fundamentals

Content negotiation adalah mekanisme HTTP yang memungkinkan satu URL menyajikan representasi berbeda dari resource yang sama — tergantung kesukaan client…

Satu alamat di server bisa mengirim data yang sama dalam beberapa bentuk: JSON buat aplikasi, HTML buat browser. Content negotiation adalah cara client (browser atau aplikasi yang mengirim request) dan server sepakat bentuk mana yang dikirim: client menyebut kesukaannya lewat header, server memilih yang paling cocok dari yang dia punya.

🧪 Tebakan cepat: client mengirim Accept: text/html;q=0. Artinya dia sedikit suka HTML, atau menolak HTML? Tebak dulu, jawabannya ada di bagian "Nilai q: seberapa suka".

Client minta, server memilih

GET /users/42 HTTP/1.1
Accept: text/html;q=0.5, application/json
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept

{"id": 42, "nama": "Budi"}

Hasilnya: JSON bernilai 1, HTML 0.5, jadi server mengirim JSON.

Nilai q: seberapa suka

q adalah angka dari 0 sampai 1. Makin besar, makin disukai. Tanpa q, nilainya 1.

Tanda bintang: format apa saja

*/* cocok dengan format apa pun. text/* cocok dengan semua format berjenis text, misalnya text/html dan text/plain, tapi gak dengan application/json. Browser biasanya mengirim kayak text/html, */*;q=0.8: "paling suka HTML, yang lain juga boleh".

Bahasa dan kompresi juga ditawar

Client minta lewat Contoh Server jawab lewat
Accept application/json Content-Type
Accept-Language id, en;q=0.5 Content-Language
Accept-Encoding gzip, br Content-Encoding

Accept-Encoding menyebut cara kompres (memampatkan data) yang bisa dibuka browser. Aturan q-nya sama.

Vary: biar cache gak ketuker

Cache adalah salinan response yang disimpan, di browser atau di CDN (server perantara di banyak kota), supaya request berikutnya gak perlu sampai ke server asli. Tanpa Vary, cache cuma melihat URL-nya, jadi response JSON untuk /users/42 bisa ikut dikirim ke browser yang minta HTML. Vary: Accept artinya "simpan salinan terpisah untuk tiap nilai Accept". Untuk bahasa, tulis Vary: Accept-Language.

⚠️ Jebakan yang sering ketemu

TL;DR: Client menyebut format yang dia mau lewat Accept (bahasa lewat Accept-Language, kompresi lewat Accept-Encoding), boleh dengan nilai q dari 0 sampai 1: tanpa q berarti 1, q=0 berarti menolak. Server memilih format bernilai tertinggi yang dia punya dan menyebutnya di Content-Type, atau membalas 406. */* dan text/* cocok dengan banyak format. Vary bikin cache menyimpan salinan terpisah per pilihan.

Yang akan kamu pelajari