Content-Type — е HTTP заглавка, която указва в какъв формат се предават данните между клиента и сървъра. Без правилния MIME тип браузърът не може да обработи правилно отговора: текстов файл се показва като суров код, а изображение не се отваря. Според MDN Web Docs, 2025, Content-Type е задължителен за коректното предаване на данни от всякакъв тип в протокола HTTP и определя как получателят интерпретира тялото на съобщението.
Основни
Content-Type — е HTTP заглавка от групата на заглавките за представяне (representation headers), която информира получателя за формата на данните в тялото на съобщението. Тя е задължителна за HTTP заявки и отговори, съдържащи тяло (body), и без нея клиентът не може правилно да интерпретира получените байтове. Браузърът или мобилното приложение на базата на Content-Type избира парсер: за text/html стартира HTML двигателя, за image/png — PNG декодер, за application/json — JSON парсер.
Стойността на Content-Type е MIME тип — стандартизиран идентификатор на формата на данните. Абревиатурата MIME означава Multipurpose Internet Mail Extensions, тъй като този стандарт първоначално е създаден за имейл прикачени файлове. Той обаче стана основа на HTTP и днес се използва навсякъде — от предаване на уеб страници до обмен на данни в REST API. Всеки MIME тип се състои от две части: основна категория и уточняващ подтип, разделени с наклонена черта.
Параметърът charset допълва Content-Type за текстови формати. Например Content-Type: text/html; charset=utf-8 означава, че се предава HTML документ в кодиране UTF-8. Според IETF RFC 7231, раздел 3.1.1.5, заглавката Content-Type е задължителна за HTTP съобщения, съдържащи тяло, и нейното отсъствие се интерпретира като application/octet-stream или води до MIME sniffing.
Протоколът HTTP/0.9, пуснат през 1991 г., предаваше само HTML страници, така че типът на данните беше по подразбиране. С появата на HTTP/1.0 в спецификацията RFC 1945, разработчиците осъзнаха необходимостта от предаване на изображения, стилови таблици и скриптове. Те адаптираха MIME стандарта от имейл протокола и Content-Type стана неразделна част от HTTP. Оттогава регистърът на IANA се разшири до стотици стойности — от познатия text/html до съвременните image/avif и application/manifest+json.
Content-Type играе критична роля в защитата срещу атаки. Ако сървърът изпрати HTML файл с MIME тип text/plain, браузърът няма да изпълни JavaScript и да изгради DOM — това предотвратява XSS атаки. Заглавката X-Content-Type-Options: nosniff, препоръчана от OWASP, напълно забранява на браузъра да познава MIME типа въз основа на съдържанието. Според PortSwigger Research, атаките с използване на MIME sniffing бяха особено разпространени в Internet Explorer 6-9, където браузърът игнорираше Content-Type и определяше типа въз основа на първите байтове на файла.
MIME типът се задава във формат type/subtype, където type е общата категория данни, а subtype е конкретният формат в нея. Например в стойността image/png категорията image указва изображение, а подтипът png — формат Portable Network Graphics. Категориите са само няколко: text, image, audio, video, application, multipart и message. Останалото разнообразие се осигурява от подтипове, които са стотици.
Допълнителни параметри се предават чрез точка и запетая след подтипа. Най-разпространеният параметър е charset за указване на кодиране. Content-Type: application/json; charset=utf-8 информира, че се предава JSON документ в кодиране UTF-8. Формално charset за application/json е излишен, тъй като JSON винаги е в UTF-8 според спецификацията RFC 8259, но изричното посочване подобрява съвместимостта със стари HTTP клиенти.
| Категория | Примери за подтипове | Описание |
|---|---|---|
| text | html, plain, css, javascript, csv | Текстови формати, четими за човека |
| image | jpeg, png, gif, webp, svg+xml, avif | Растерни и векторни изображения |
| audio | mpeg, ogg, wav, mp4, webm | Аудио формати за стрийминг |
| video | mp4, webm, ogg, x-msvideo, 3gpp | Видео формати и мултимедийни контейнери |
| application | json, xml, pdf, zip, octet-stream, protobuf | Двоични и структурирани данни |
| multipart | form-data, mixed, alternative, byteranges | Композитни документи от няколко части |
Стандартните MIME типове се регистрират в регистъра на IANA и имат префикс на основната категория. Нестандартните (vendor-specific) типове използват префикс x- или формат vnd.company.type — например application/vnd.google-earth.kml+xml за KML формата от Google. Браузърите може да не разпознават нестандартни типове, затова за неизвестни прикачени файлове се използва application/octet-stream — универсален двоичен поток, който браузърът не се опитва да покаже, а предлага изтегляне като файл.
Параметърът charset е критичен за правилното показване на текст. Без него браузърът може да интерпретира неправилно знаците, което води до mojibake (изкривени знаци). Стандартът за уеб е UTF-8, но се срещат ISO-8859-1 (Latin-1) за западноевропейски езици и windows-1251 за кирилица на стари сайтове. Препоръка на W3C — винаги посочвайте charset=utf-8 за text/html и text/plain, а за application/json charset не е необходим.
На практика уеб разработчиците и мобилните разработчици работят с ограничен набор от MIME типове. Познаването на тези типове е необходимо за правилната конфигурация на сървъра, писането на HTTP клиенти и обработката на статични файлове. text/html — основният тип за уеб страници, връщан по подразбиране от сървърите Apache и Nginx за HTML файлове. application/xhtml+xml се използва по-рядко и само за XHTML документи.
application/json стана стандарт за REST API. Сървърите връщат JSON данни с този MIME тип, а клиентите го изпращат в POST и PUT заявки. text/javascript (остарял) и application/javascript се използват за JavaScript файлове. Според W3Techs Survey, 2025, JSON е най-бързо растящият формат данни в уеб, изпреварвайки XML през 2018 г. За SOAP услуги все още се използва text/xml или application/soap+xml.
За изображения MIME типът се определя от формата на файла: image/jpeg за JPEG, image/png за PNG, image/gif за GIF, image/webp за модерния формат WebP. image/svg+xml се използва за векторна графика и поддържа вградени стилове и скриптове. video/mp4, audio/mpeg и application/pdf — други често срещани типове. За уеб шрифтове се използват font/woff2, font/woff и font/ttf.
При изпращане на файлове чрез HTML формуляр се използва multipart/form-data — композитен MIME тип, който разделя заявката на няколко части. Всяка част има собствена заглавка Content-Type и Content-Disposition, указваща името на полето и оригиналното име на файла. Сървърът получава файла с действителния му MIME тип, определен от браузъра, и може да го провери от страна на backend. application/octet-stream се прилага за файлове с неизвестен тип — браузърът не се опитва да покаже съдържанието, а предлага запазване на диска.
MIME типът влияе върху политиката за кеширане на CDN и браузъра. Изображенията със стабилни URL адреси обикновено се кешират за дълъг период (една година и повече), докато HTML страниците — за минути или секунди. CDN сървъри Cloudflare и Akamai използват Content-Type за избор на алгоритъм за компресия: text/* се компресира с gzip или brotli, image/* — не, тъй като изображенията вече са компресирани. Правилната конфигурация на Content-Type на сървъра пряко влияе върху производителността при зареждане на страници и мобилни приложения.
Сървърът задава заглавката Content-Type в HTTP отговора въз основа на типа на заявения файл или динамично генерирано съдържание. Популярните уеб сървъри Nginx и Apache имат вградени таблици с MIME типове, които свързват разширението на файла с подходящия Content-Type. Например файлът index.html получава text/html, а style.css — text/css. За динамични отговори разработчикът задава Content-Type в кода на приложението на PHP, Python, Java или Kotlin.
Клиентът използва Content-Type за избор на обработчик. Ако сървърът върне text/html, браузърът стартира HTML парсера и изгражда DOM дърво. Ако image/png — стартира PNG декодер. Ако Content-Type липсва или е неправилен, клиентът прилага MIME sniffing — опитва се да познае типа въз основа на подписа (magic bytes) в началото на файла. JPEG започва с байтове FF D8 FF, PNG — с 89 50 4E 47, а PDF — с 25 50 44 46. Този процес е потенциално опасен и се изключва от заглавката X-Content-Type-Options: nosniff.
В мобилни приложения Content-Type се обработва от HTTP клиенти. OkHttp на Android автоматично анализира заглавката Content-Type от отговора и я предоставя чрез метода Response.header("Content-Type"). iOS клиентът URLSession прави същото чрез свойството URLResponse.mimeType. И на двете платформи Content-Type се използва за избор на парсер: JSON — чрез Moshi или Gson на Android, чрез Codable на iOS; изображения — чрез Glide, Coil или SDWebImage.
Content negotiation (договаряне на съдържание) — HTTP механизъм, при който клиентът указва желания формат на отговора чрез заглавката Accept, а сървърът избира подходящия формат и го връща със съответния Content-Type. Например клиентът изпраща Accept: application/json, сървърът отговаря с Content-Type: application/json. Ако сървърът не може да предостави искания формат, той връща 406 Not Acceptable. В REST API този механизъм позволява на един endpoint да връща данни в JSON, XML или HTML.
Заглавката Content-Type се използва както в HTTP заявки (Request), така и в HTTP отговори (Response). В заявките тя указва формата на тялото на заявката, например при изпращане на JSON чрез POST. В отговорите — формата на връщаните данни. Основната разлика е, че Content-Type на заявката се задава от клиента, а Content-Type на отговора — от сървъра. Неправилното задаване на Content-Type в заявка води до невъзможност на сървъра да анализира тялото, връщайки грешка 400 Bad Request или 415 Unsupported Media Type.
В HTTP заявки Content-Type е задължителен за методите POST, PUT и PATCH, ако заявката съдържа тяло (body). GET, HEAD и DELETE обикновено не използват тяло, така че Content-Type за тях не се посочва или се игнорира. При изпращане на HTML формуляр с атрибут enctype="multipart/form-data", браузърът автоматично задава Content-Type: multipart/form-data с уникален граничен низ (boundary), който разделя частите на композитната заявка. Всяка част се разделя с --boundary, а краят на заявката се отбелязва с --boundary--.
В HTTP отговори Content-Type се задава от сървъра. Ако сървърът не посочи Content-Type, клиентът или включва MIME sniffing, или обработва отговора като application/octet-stream. HTTP методът HEAD позволява получаване на заглавките на отговора, включително Content-Type, без предаване на тялото. Това е полезно за проверка на типа на ресурса преди пълното му зареждане. CDN сървъри могат да презапишат Content-Type при трансформация на съдържание — например при конвертиране на изображения в 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("Тип: ${mediaType?.type}, Подтип: ${mediaType?.subtype}")
}
}
В мобилното разработване заглавката Content-Type се обработва автоматично от HTTP клиенти. В OkHttp на Android Content-Type се задава чрез RequestBody: val body = "{}".toRequestBody("application/json".toMediaType()). Retrofit управлява Content-Type чрез анотации: @Body за JSON, @Part за multipart. На iOS URLSession задава Content-Type за HTTPBody, а Alamofire прави това чрез параметъра encoding: JSONEncoding.default или URLEncoding.default. Ръчно задаване на Content-Type се изисква при работа с raw сокети или потребителски протоколи.
Неправилен Content-Type — един от най-честите проблеми при разработка и интеграция на уеб услуги. Най-честата грешка е когато сървърът връща text/html вместо application/json. Клиентът получава JSON като HTML низ, не може да го анализира и хвърля изключение. Това се случва, когато уеб framework е конфигуриран по подразбиране на HTML и разработчикът забрави да презапише Content-Type за API endpoint. В PHP това се проявява чрез липса на header('Content-Type: application/json'), в Spring Boot — чрез липса на анотацията produces.
Втората най-честа грешка е неправилен или липсващ charset. Ако сървърът изпрати text/html; charset=iso-8859-1, а браузърът очаква UTF-8, кирилските знаци се показват изкривени. Този проблем е характерен за стари сайтове, които не са преминали на UTF-8. За JSON такава грешка се среща по-рядко, тъй като RFC 8259 предписва UTF-8 без допълнително съгласуване. Решение — винаги изрично посочвайте charset=utf-8 за текстови MIME типове в конфигурацията на сървъра.
Третият проблем — несъответствие между Content-Type и действителното съдържание. Ако сървърът изпрати Content-Type: image/png, но тялото на отговора съдържа WebP изображение, браузърът може да не го декодира. CDN сървърите понякога компресират изображения с промяна на формата, но не актуализират заглавката Content-Type. Проверката на съответствието на Content-Type с действителното съдържание е задължителен етап от тестването на API и интеграционното тестване на мобилни приложения.
За отстраняване на грешки използвайте инструментите за разработчици на браузъра (раздел Network), curl с флаг -I за проверка на заглавките на отговора или снифери на трафик като Charles Proxy и Wireshark. Nginx се конфигурира чрез директивата include mime.types, Apache — чрез AddType и AddDefaultCharset. За статични файлове винаги проверявайте дали разширението на файла съответства на неговия MIME тип. За динамични отговори във всички езици за програмиране изрично задавайте Content-Type преди извеждане на данни — това предотвратява огромното мнозинство от проблеми.
Често задавани въпроси
Без Content-Type браузърът включва MIME sniffing — анализ на първите байтове на отговора за автоматично определяне на типа данни. Това може да доведе до неправилна обработка на съдържанието и да създаде уязвимости в сигурността. Съвременните браузъри със заглавка X-Content-Type-Options: nosniff напълно блокират познаването.
Content-Type указва формата на данните, предавани в текущото съобщение (тялото на заявката или отговора). Accept — е заглавка на заявка, която информира сървъра какъв формат на отговора предпочита клиентът. Content-Type се задава от изпращача на данните, а Accept — от получателя, и те участват в механизма за договаряне на съдържанието.
Официалният MIME тип за JSON е application/json според спецификацията RFC 8259. Преди се използваше text/x-json, но този тип е остарял. Параметърът charset за application/json не е необходим, тъй като JSON според спецификацията винаги се предава в UTF-8, UTF-16 или UTF-32 кодиране с автоматично откриване на реда на байтовете (BOM).
Това се случва, когато уеб framework не презапише Content-Type по подразбиране за API endpoints. В PHP се поправя с извикване на header('Content-Type: application/json'), в Spring Boot — с анотация @GetMapping(produces = "application/json"), в Express.js — с метод res.set('Content-Type', 'application/json').
application/octet-stream — универсален MIME тип за двоични данни, чийто формат е неизвестен. Браузърът не се опитва да покаже такъв файл в прозореца, а предлага запазването му на диска. Използва се за изтегляне на файлове, имейл прикачени файлове и поточни данни, когато сървърът не може да определи точния тип на предаваното съдържание.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също