Content-Type — adalah header HTTP yang menunjukkan dalam format apa data dikirim antara klien dan server. Tanpa tipe MIME yang benar, browser tidak dapat memproses respons dengan benar: file teks ditampilkan sebagai kode mentah, dan gambar tidak terbuka. Menurut MDN Web Docs, 2025, Content-Type wajib untuk pengiriman data jenis apa pun yang benar dalam protokol HTTP dan menentukan bagaimana penerima menginterpretasikan body pesan.
Penting
Content-Type — adalah header HTTP dari grup representation headers yang memberi tahu penerima tentang format data dalam body pesan. Ini wajib untuk permintaan dan respons HTTP yang berisi body, dan tanpanya klien tidak dapat menafsirkan byte yang diterima dengan benar. Browser atau aplikasi seluler memilih parser berdasarkan Content-Type: untuk text/html menjalankan mesin HTML, untuk image/png — decoder PNG, untuk application/json — parser JSON.
Nilai Content-Type adalah tipe MIME — pengidentifikasi format data yang terstandarisasi. Singkatan MIME adalah kepanjangan dari Multipurpose Internet Mail Extensions, karena standar ini awalnya dibuat untuk lampiran email. Namun standar ini menjadi dasar HTTP dan saat ini digunakan di mana-mana — dari pengiriman halaman web hingga pertukaran data di REST API. Setiap tipe MIME terdiri dari dua bagian: kategori utama dan subtipe yang lebih spesifik, dipisahkan oleh garis miring.
Parameter charset melengkapi Content-Type untuk format teks. Misalnya, Content-Type: text/html; charset=utf-8 berarti dokumen HTML dalam pengkodean UTF-8 sedang dikirim. Menurut IETF RFC 7231, bagian 3.1.1.5, header Content-Type wajib untuk pesan HTTP yang berisi body, dan ketiadaannya ditafsirkan sebagai application/octet-stream atau menyebabkan MIME sniffing.
Protokol HTTP/0.9, yang dirilis pada tahun 1991, hanya mengirimkan halaman HTML, sehingga tipe data ditentukan secara default. Dengan munculnya HTTP/1.0 dalam spesifikasi RFC 1945, pengembang menyadari perlunya mengirimkan gambar, stylesheet, dan skrip. Mereka mengadaptasi standar MIME dari protokol email, dan Content-Type menjadi bagian tak terpisahkan dari HTTP. Sejak saat itu, registri IANA telah berkembang hingga ratusan nilai — dari text/html yang familiar hingga image/avif modern dan application/manifest+json.
Content-Type memainkan peran penting dalam perlindungan terhadap serangan. Jika server mengirim file HTML dengan tipe MIME text/plain, browser tidak akan mengeksekusi JavaScript dan membangun DOM — ini mencegah serangan XSS. Header X-Content-Type-Options: nosniff, yang direkomendasikan oleh OWASP, sepenuhnya melarang browser menebak tipe MIME berdasarkan konten. Menurut PortSwigger Research, serangan menggunakan MIME sniffing sangat umum di Internet Explorer 6-9, di mana browser mengabaikan Content-Type dan menentukan tipe berdasarkan byte pertama file.
Tipe MIME ditentukan dalam format type/subtype, di mana type adalah kategori umum data, dan subtype adalah format spesifik di dalamnya. Misalnya, dalam nilai image/png, kategori image menunjukkan gambar, dan subtipe png — format Portable Network Graphics. Hanya ada beberapa kategori: text, image, audio, video, application, multipart dan message. Keragaman lainnya disediakan oleh subtipe, yang jumlahnya ratusan.
Parameter tambahan dikirim melalui titik koma setelah subtipe. Parameter yang paling umum adalah charset untuk menunjukkan pengkodean. Content-Type: application/json; charset=utf-8 memberi tahu bahwa dokumen JSON dalam pengkodean UTF-8 sedang dikirim. Secara formal, charset untuk application/json berlebihan, karena JSON selalu dalam UTF-8 menurut spesifikasi RFC 8259, tetapi penentuan secara eksplisit meningkatkan kompatibilitas dengan klien HTTP lama.
| Kategori | Contoh subtipe | Deskripsi |
|---|---|---|
| text | html, plain, css, javascript, csv | Format teks yang dapat dibaca manusia |
| image | jpeg, png, gif, webp, svg+xml, avif | Gambar raster dan vektor |
| audio | mpeg, ogg, wav, mp4, webm | Format audio untuk pemutaran streaming |
| video | mp4, webm, ogg, x-msvideo, 3gpp | Format video dan wadah multimedia |
| application | json, xml, pdf, zip, octet-stream, protobuf | Data biner dan terstruktur |
| multipart | form-data, mixed, alternative, byteranges | Dokumen gabungan dari beberapa bagian |
Tipe MIME standar didaftarkan di registri IANA dan memiliki prefiks kategori utama. Tipe non-standar (vendor-specific) menggunakan prefiks x- atau format vnd.company.type — misalnya, application/vnd.google-earth.kml+xml untuk format KML dari Google. Browser mungkin tidak mengenali tipe non-standar, oleh karena itu untuk lampiran yang tidak dikenal digunakan application/octet-stream — aliran biner universal yang tidak coba ditampilkan oleh browser tetapi menawarkan unduhan sebagai file.
Parameter charset sangat penting untuk tampilan teks yang benar. Tanpanya, browser dapat menafsirkan karakter secara salah, yang menyebabkan mojibake (karakter rusak). Standar untuk web adalah UTF-8, tetapi ISO-8859-1 (Latin-1) untuk bahasa Eropa Barat dan windows-1251 untuk aksara Sirilik di situs lama juga ditemukan. Rekomendasi W3C — selalu tentukan charset=utf-8 untuk text/html dan text/plain, dan untuk application/json charset tidak diperlukan.
Dalam praktiknya, pengembang web dan pengembang seluler bekerja dengan seperangkat tipe MIME yang terbatas. Pengetahuan tentang tipe-tipe ini diperlukan untuk konfigurasi server yang benar, penulisan klien HTTP, dan pemrosesan file statis. text/html — tipe utama untuk halaman web, yang secara default dikembalikan oleh server Apache dan Nginx untuk file HTML. application/xhtml+xml lebih jarang digunakan dan hanya untuk dokumen XHTML.
application/json telah menjadi standar untuk REST API. Server mengembalikan data JSON dengan tipe MIME ini, dan klien mengirimkannya dalam permintaan POST dan PUT. text/javascript (usang) dan application/javascript digunakan untuk file JavaScript. Menurut W3Techs Survey, 2025, JSON adalah format data dengan pertumbuhan tercepat di web, melampaui XML pada tahun 2018. Untuk layanan SOAP masih digunakan text/xml atau application/soap+xml.
Untuk gambar, tipe MIME ditentukan oleh format file: image/jpeg untuk JPEG, image/png untuk PNG, image/gif untuk GIF, image/webp untuk format modern WebP. image/svg+xml digunakan untuk grafik vektor dan mendukung gaya dan skrip yang disematkan. video/mp4, audio/mpeg dan application/pdf — tipe lain yang sering ditemui. Untuk font web digunakan font/woff2, font/woff dan font/ttf.
Saat mengirim file melalui formulir HTML, digunakan multipart/form-data — tipe MIME gabungan yang membagi permintaan menjadi beberapa bagian. Setiap bagian memiliki header Content-Type dan Content-Disposition sendiri, yang menunjukkan nama bidang dan nama asli file. Server menerima file dengan tipe MIME sebenarnya, yang ditentukan oleh browser, dan dapat memeriksanya di sisi backend. application/octet-stream diterapkan untuk file dengan tipe tidak dikenal — browser tidak mencoba menampilkan konten tetapi menawarkan untuk menyimpannya ke disk.
Tipe MIME mempengaruhi kebijakan caching CDN dan browser. Gambar dengan URL stabil biasanya di-cache untuk waktu yang lama (satu tahun atau lebih), sementara halaman HTML — untuk menit atau detik. Server CDN Cloudflare dan Akamai menggunakan Content-Type untuk memilih algoritma kompresi: text/* dikompresi dengan gzip atau brotli, image/* — tidak, karena gambar sudah dikompresi. Konfigurasi Content-Type yang benar di server secara langsung mempengaruhi kinerja pemuatan halaman dan aplikasi seluler.
Server mengatur header Content-Type dalam respons HTTP berdasarkan jenis file yang diminta atau konten yang dihasilkan secara dinamis. Server web populer Nginx dan Apache memiliki tabel tipe MIME bawaan yang menghubungkan ekstensi file dengan Content-Type yang sesuai. Misalnya, file index.html mendapat text/html, dan style.css — text/css. Untuk respons dinamis, pengembang mengatur Content-Type dalam kode aplikasi di PHP, Python, Java atau Kotlin.
Klien menggunakan Content-Type untuk memilih penangan. Jika server mengembalikan text/html, browser menjalankan parser HTML dan membangun pohon DOM. Jika image/png — menjalankan decoder PNG. Jika Content-Type tidak ada atau salah, klien menerapkan MIME sniffing — mencoba menebak tipe berdasarkan tanda tangan (magic bytes) di awal file. JPEG dimulai dengan byte FF D8 FF, PNG — dengan 89 50 4E 47, dan PDF — dengan 25 50 44 46. Proses ini berpotensi berbahaya dan dinonaktifkan oleh header X-Content-Type-Options: nosniff.
Dalam aplikasi seluler, Content-Type diproses oleh klien HTTP. OkHttp di Android secara otomatis mem-parsing header Content-Type dari respons dan menyediakannya melalui metode Response.header("Content-Type"). Klien iOS URLSession melakukan hal yang sama melalui properti URLResponse.mimeType. Di kedua platform, Content-Type digunakan untuk memilih parser: JSON — melalui Moshi atau Gson di Android, melalui Codable di iOS; gambar — melalui Glide, Coil atau SDWebImage.
Content negotiation (negosiasi konten) — mekanisme HTTP di mana klien menunjukkan format respons yang diinginkan melalui header Accept, dan server memilih format yang sesuai dan mengembalikannya dengan Content-Type yang sesuai. Misalnya, klien mengirim Accept: application/json, server merespon dengan Content-Type: application/json. Jika server tidak dapat menyediakan format yang diminta, ia mengembalikan 406 Not Acceptable. Di REST API, mekanisme ini memungkinkan satu endpoint mengembalikan data dalam JSON, XML atau HTML.
Header Content-Type digunakan baik dalam permintaan HTTP (Request) maupun dalam respons HTTP (Response). Dalam permintaan, ini menunjukkan format body permintaan, misalnya saat mengirim JSON melalui POST. Dalam respons — format data yang dikembalikan. Perbedaan mendasar adalah bahwa Content-Type permintaan diatur oleh klien, sedangkan Content-Type respons — oleh server. Pengaturan yang salah Content-Type dalam permintaan menyebabkan server tidak dapat mem-parsing body, mengembalikan kesalahan 400 Bad Request atau 415 Unsupported Media Type.
Dalam permintaan HTTP, Content-Type wajib untuk metode POST, PUT dan PATCH jika permintaan berisi body. GET, HEAD dan DELETE biasanya tidak menggunakan body, sehingga Content-Type untuk mereka tidak ditentukan atau diabaikan. Saat mengirim formulir HTML dengan atribut enctype="multipart/form-data", browser secara otomatis mengatur Content-Type: multipart/form-data dengan string batas (boundary) unik yang memisahkan bagian-bagian dari permintaan gabungan. Setiap bagian dipisahkan oleh --boundary, dan akhir permintaan ditandai oleh --boundary--.
Dalam respons HTTP, Content-Type diatur oleh server. Jika server tidak menentukan Content-Type, klien baik mengaktifkan MIME sniffing, atau memproses respons sebagai application/octet-stream. Metode HTTP HEAD memungkinkan mendapatkan header respons, termasuk Content-Type, tanpa mengirim body. Ini berguna untuk memeriksa jenis sumber daya sebelum memuatnya sepenuhnya. Server CDN dapat menimpa Content-Type saat transformasi konten — misalnya, saat mengonversi gambar ke WebP.
import okhttp3.*
fun checkContentType() {
val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.example.com/resource")
.head()
.build()
client.newCall(request).execute().use { response ->
val contentType = response.header("Content-Type")
val mediaType = MediaType.parse(contentType)
println("Tipe: ${mediaType?.type}, Subtipe: ${mediaType?.subtype}")
}
}
Dalam pengembangan seluler, header Content-Type diproses secara otomatis oleh klien HTTP. Di OkHttp di Android, Content-Type diatur melalui RequestBody: val body = "{}".toRequestBody("application/json".toMediaType()). Retrofit mengelola Content-Type melalui anotasi: @Body untuk JSON, @Part untuk multipart. Di iOS, URLSession mengatur Content-Type untuk HTTPBody, dan Alamofire melakukannya melalui parameter encoding: JSONEncoding.default atau URLEncoding.default. Pengaturan manual Content-Type diperlukan saat bekerja dengan soket mentah atau protokol kustom.
Content-Type yang salah — salah satu masalah paling umum dalam pengembangan dan integrasi layanan web. Kesalahan yang paling umum adalah ketika server mengembalikan text/html sebagai ganti application/json. Klien menerima JSON sebagai string HTML, tidak dapat mem-parsingnya dan melempar pengecualian. Ini terjadi ketika kerangka kerja web dikonfigurasi secara default ke HTML, dan pengembang lupa menimpa Content-Type untuk endpoint API. Di PHP, ini bermanifestasi dengan tidak adanya header('Content-Type: application/json'), di Spring Boot — dengan tidak adanya anotasi produces.
Kesalahan kedua yang paling umum adalah charset yang salah atau hilang. Jika server mengirim text/html; charset=iso-8859-1 dan browser mengharapkan UTF-8, karakter Sirilik ditampilkan dengan kacau. Masalah ini khas untuk situs lama yang belum beralih ke UTF-8. Untuk JSON, kesalahan semacam itu lebih jarang terjadi, karena RFC 8259 menetapkan UTF-8 tanpa persetujuan tambahan. Solusi — selalu tentukan secara eksplisit charset=utf-8 untuk tipe MIME teks dalam konfigurasi server.
Masalah ketiga — ketidaksesuaian Content-Type dengan konten sebenarnya. Jika server mengirim Content-Type: image/png tetapi body respons berisi gambar WebP, browser mungkin tidak dapat mendekodenya. Server CDN terkadang mengompresi gambar dengan mengubah format, tetapi tidak memperbarui header Content-Type. Pemeriksaan kesesuaian Content-Type dengan konten sebenarnya adalah tahap wajib pengujian API dan pengujian integrasi aplikasi seluler.
Untuk debugging, gunakan alat pengembang browser (tab Network), curl dengan bendera -I untuk memeriksa header respons, atau sniffer lalu lintas seperti Charles Proxy dan Wireshark. Nginx dikonfigurasi melalui direktif include mime.types, Apache — melalui AddType dan AddDefaultCharset. Untuk file statis, selalu periksa bahwa ekstensi file sesuai dengan tipe MIME-nya. Untuk respons dinamis, di semua bahasa pemrograman, atur Content-Type secara eksplisit sebelum mengeluarkan data — ini mencegah sebagian besar masalah.
Pertanyaan yang Sering Diajukan
Tanpa Content-Type, browser mengaktifkan MIME sniffing — analisis byte pertama respons untuk menentukan tipe data secara otomatis. Ini dapat menyebabkan pemrosesan konten yang salah dan menciptakan kerentanan keamanan. Browser modern dengan header X-Content-Type-Options: nosniff sepenuhnya memblokir penebakan.
Content-Type menunjukkan format data yang dikirim dalam pesan saat ini (body permintaan atau respons). Accept — adalah header permintaan yang memberi tahu server format respons apa yang disukai klien. Content-Type diatur oleh pengirim data, dan Accept — oleh penerima, dan mereka berpartisipasi dalam mekanisme negosiasi konten.
Tipe MIME resmi untuk JSON adalah application/json menurut spesifikasi RFC 8259. Sebelumnya digunakan text/x-json, tetapi tipe ini sudah usang. Parameter charset untuk application/json tidak diperlukan, karena JSON menurut spesifikasi selalu dikirim dalam pengkodean UTF-8, UTF-16 atau UTF-32 dengan deteksi otomatis urutan byte (BOM).
Ini terjadi ketika kerangka kerja web tidak menimpa Content-Type default untuk endpoint API. Di PHP diperbaiki dengan panggilan header('Content-Type: application/json'), di Spring Boot — dengan anotasi @GetMapping(produces = "application/json"), di Express.js — dengan metode res.set('Content-Type', 'application/json').
application/octet-stream — tipe MIME universal untuk data biner yang formatnya tidak diketahui. Browser tidak mencoba menampilkan file seperti itu di jendela, tetapi menawarkan untuk menyimpannya ke disk. Ini digunakan untuk unduhan file, lampiran email, dan data streaming ketika server tidak dapat menentukan jenis konten yang dikirim.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga