Content-Type — este un antet HTTP care indică în ce format sunt transmise datele între client și server. Fără un tip MIME corect, browserul nu poate procesa corect răspunsul: un fișier text se afișează ca cod brut, iar o imagine nu se deschide. Conform MDN Web Docs, 2025, Content-Type este obligatoriu pentru transmiterea corectă a datelor de orice tip în protocolul HTTP și determină modul în care destinatarul interpretează corpul mesajului.
Principalele
Content-Type — este un antet HTTP din grupul antetelor de reprezentare (representation headers) care informează destinatarul despre formatul datelor din corpul mesajului. Este obligatoriu pentru cererile și răspunsurile HTTP care conțin un corp (body), iar fără el clientul nu poate interpreta corect octeții primiți. Browserul sau aplicația mobilă pe baza Content-Type alege parserul: pentru text/html pornește motorul HTML, pentru image/png — decodorul PNG, pentru application/json — parserul JSON.
Valoarea Content-Type este un tip MIME — un identificator standardizat al formatului de date. Abrevierea MIME înseamnă Multipurpose Internet Mail Extensions, deoarece acest standard a fost creat inițial pentru atașamentele de e-mail. Cu toate acestea, a devenit baza HTTP și este folosit astăzi peste tot — de la transmiterea paginilor web până la schimbul de date în REST API. Fiecare tip MIME constă din două părți: o categorie principală și un subtip de detaliere, separate prin slash.
Parametrul charset completează Content-Type pentru formatele text. De exemplu, Content-Type: text/html; charset=utf-8 înseamnă că se transmite un document HTML în codificarea UTF-8. Conform IETF RFC 7231, secțiunea 3.1.1.5, antetul Content-Type este obligatoriu pentru mesajele HTTP care conțin corp, iar absența sa este interpretată ca application/octet-stream sau duce la MIME sniffing.
Protocolul HTTP/0.9, lansat în 1991, transmitea doar pagini HTML, astfel încât tipul de date era implicit. Odată cu apariția HTTP/1.0 în specificația RFC 1945, dezvoltatorii au realizat necesitatea de a transmite imagini, foi de stil și scripturi. Au adaptat standardul MIME din protocolul de e-mail, iar Content-Type a devenit o parte inseparabilă a HTTP. De atunci, registrul IANA s-a extins la sute de valori — de la familiarul text/html până la modernul image/avif și application/manifest+json.
Content-Type joacă un rol critic în protecția împotriva atacurilor. Dacă serverul trimite un fișier HTML cu tipul MIME text/plain, browserul nu va executa JavaScript și nu va construi DOM — acest lucru previne atacurile XSS. Antetul X-Content-Type-Options: nosniff, recomandat de OWASP, interzice complet browserului să ghicească tipul MIME pe baza conținutului. Conform PortSwigger Research, atacurile care folosesc MIME sniffing au fost deosebit de răspândite în Internet Explorer 6-9, unde browserul ignora Content-Type și determina tipul după primii octeți ai fișierului.
Tipul MIME se specifică în formatul type/subtype, unde type este categoria generală a datelor, iar subtype este formatul concret din cadrul acesteia. De exemplu, în valoarea image/png, categoria image indică o imagine, iar subtipul png — formatul Portable Network Graphics. Categoriile sunt doar câteva: text, image, audio, video, application, multipart și message. Restul diversității este asigurat de subtipuri, care sunt sute la număr.
Parametrii suplimentari se transmit prin punct și virgulă după subtip. Cel mai frecvent parametru este charset pentru indicarea codificării. Content-Type: application/json; charset=utf-8 informează că se transmite un document JSON în codificarea UTF-8. Formal, charset pentru application/json este redundant, deoarece JSON este întotdeauna în UTF-8 conform specificației RFC 8259, dar specificarea explicită îmbunătățește compatibilitatea cu clienții HTTP mai vechi.
| Categorie | Exemple de subtipuri | Descriere |
|---|---|---|
| text | html, plain, css, javascript, csv | Formate text lizibile pentru om |
| image | jpeg, png, gif, webp, svg+xml, avif | Imagini raster și vectoriale |
| audio | mpeg, ogg, wav, mp4, webm | Formate audio pentru redare în flux |
| video | mp4, webm, ogg, x-msvideo, 3gpp | Formate video și containere multimedia |
| application | json, xml, pdf, zip, octet-stream, protobuf | Date binare și structurate |
| multipart | form-data, mixed, alternative, byteranges | Documente compozite din mai multe părți |
Tipurile MIME standard sunt înregistrate în registrul IANA și au prefixul categoriei principale. Cele non-standard (vendor-specific) folosesc prefixul x- sau formatul vnd.company.type — de exemplu, application/vnd.google-earth.kml+xml pentru formatul KML de la Google. Browser-ele pot să nu recunoască tipurile non-standard, de aceea pentru atașamentele necunoscute se folosește application/octet-stream — un flux binar universal pe care browserul nu încearcă să-l afișeze, ci oferă descărcarea ca fișier.
Parametrul charset este critic pentru afișarea corectă a textului. Fără el, browserul poate interpreta incorect caracterele, ceea ce duce la mojibake (caractere distorsionate). Pentru web, standardul este UTF-8, dar se întâlnesc ISO-8859-1 (Latin-1) pentru limbile vest-europene și windows-1251 pentru chirilică pe site-urile vechi. Recomandarea W3C — specificați întotdeauna charset=utf-8 pentru text/html și text/plain, iar pentru application/json charset nu este necesar.
În practică, dezvoltatorii web și dezvoltatorii mobili lucrează cu un set limitat de tipuri MIME. Cunoașterea acestor tipuri este necesară pentru configurarea corectă a serverului, scrierea clienților HTTP și procesarea fișierelor statice. text/html — tipul principal pentru paginile web, returnat implicit de serverele Apache și Nginx pentru fișierele HTML. application/xhtml+xml este folosit mai rar și numai pentru documente XHTML.
application/json a devenit standard pentru REST API. Serverele returnează date JSON cu acest tip MIME, iar clienții îl trimit în cererile POST și PUT. text/javascript (învechit) și application/javascript sunt folosite pentru fișierele JavaScript. Conform W3Techs Survey, 2025, JSON este cel mai rapid format de date în creștere pe web, depășind XML în 2018. Pentru serviciile SOAP se mai folosește text/xml sau application/soap+xml.
Pentru imagini, tipul MIME este determinat de formatul fișierului: image/jpeg pentru JPEG, image/png pentru PNG, image/gif pentru GIF, image/webp pentru formatul modern WebP. image/svg+xml este folosit pentru grafica vectorială și suportă stiluri și scripturi încorporate. video/mp4, audio/mpeg și application/pdf — alte tipuri frecvent întâlnite. Pentru fonturile web se folosesc font/woff2, font/woff și font/ttf.
La trimiterea fișierelor printr-un formular HTML se folosește multipart/form-data — un tip MIME compozit care împarte cererea în mai multe părți. Fiecare parte are propriul antet Content-Type și Content-Disposition, care indică numele câmpului și numele original al fișierului. Serverul primește fișierul cu tipul său MIME real, determinat de browser, și îl poate verifica pe partea de backend. application/octet-stream este aplicat pentru fișierele de tip necunoscut — browserul nu încearcă să afișeze conținutul, ci oferă salvarea pe disc.
Tipul MIME influențează politica de stocare în cache a CDN-ului și browserului. Imaginile cu URL-uri stabile sunt de obicei stocate în cache pentru o perioadă lungă (un an și mai mult), în timp ce paginile HTML — pentru minute sau secunde. Servere CDN Cloudflare și Akamai folosesc Content-Type pentru alegerea algoritmului de compresie: text/* este comprimat cu gzip sau brotli, image/* — nu, deoarece imaginile sunt deja comprimate. Configurarea corectă a Content-Type pe server influențează direct performanța de încărcare a paginilor și aplicațiilor mobile.
Serverul setează antetul Content-Type în răspunsul HTTP pe baza tipului fișierului solicitat sau a conținutului generat dinamic. Popularele servere web Nginx și Apache au tabele interne de tipuri MIME care asociază extensia fișierului cu Content-Type-ul corespunzător. De exemplu, fișierul index.html primește text/html, iar style.css — text/css. Pentru răspunsurile dinamice, dezvoltatorul setează Content-Type în codul aplicației în PHP, Python, Java sau Kotlin.
Clientul folosește Content-Type pentru alegerea handlerului. Dacă serverul returnează text/html, browserul pornește parserul HTML și construiește arborele DOM. Dacă image/png — pornește decodorul PNG. Dacă Content-Type lipsește sau este incorect, clientul aplică MIME sniffing — încearcă să ghicească tipul după semnătura (magic bytes) de la începutul fișierului. JPEG începe cu octeții FF D8 FF, PNG — cu 89 50 4E 47, iar PDF — cu 25 50 44 46. Acest proces este potențial periculos și este dezactivat prin antetul X-Content-Type-Options: nosniff.
În aplicațiile mobile, Content-Type este procesat de clienții HTTP. OkHttp pe Android analizează automat antetul Content-Type din răspuns și îl furnizează prin metoda Response.header("Content-Type"). Clientul iOS URLSession face același lucru prin proprietatea URLResponse.mimeType. Pe ambele platforme, Content-Type este folosit pentru alegerea parserului: JSON — prin Moshi sau Gson pe Android, prin Codable pe iOS; imagini — prin Glide, Coil sau SDWebImage.
Content negotiation (negocierea conținutului) — mecanism HTTP în care clientul indică formatul dorit al răspunsului prin antetul Accept, iar serverul alege formatul potrivit și îl returnează cu Content-Type-ul corespunzător. De exemplu, clientul trimite Accept: application/json, serverul răspunde cu Content-Type: application/json. Dacă serverul nu poate furniza formatul solicitat, returnează 406 Not Acceptable. În REST API, acest mecanism permite unui singur endpoint să returneze date în JSON, XML sau HTML.
Antetul Content-Type este folosit atât în cererile HTTP (Request), cât și în răspunsurile HTTP (Response). În cereri, indică formatul corpului cererii, de exemplu la trimiterea JSON prin POST. În răspunsuri — formatul datelor returnate. Diferența principală este că Content-Type-ul cererii este setat de client, iar Content-Type-ul răspunsului — de server. Setarea incorectă a Content-Type în cerere duce la imposibilitatea serverului de a parsa corpul, returnând eroarea 400 Bad Request sau 415 Unsupported Media Type.
În cererile HTTP, Content-Type este obligatoriu pentru metodele POST, PUT și PATCH dacă cererea conține un corp (body). GET, HEAD și DELETE de obicei nu folosesc corp, de aceea Content-Type pentru ele nu este specificat sau este ignorat. La trimiterea unui formular HTML cu atributul enctype="multipart/form-data", browserul setează automat Content-Type: multipart/form-data cu un șir graniță (boundary) unic care separă părțile cererii compozite. Fiecare parte este separată prin --boundary, iar sfârșitul cererii este marcat prin --boundary--.
În răspunsurile HTTP, Content-Type este setat de server. Dacă serverul nu specifică Content-Type, clientul fie activează MIME sniffing, fie procesează răspunsul ca application/octet-stream. Metoda HTTP HEAD permite obținerea antetelor răspunsului, inclusiv Content-Type, fără a transmite corpul. Acest lucru este util pentru verificarea tipului resursei înainte de încărcarea completă. Servere CDN pot suprascrie Content-Type la transformarea conținutului — de exemplu, la conversia imaginilor în 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("Tip: ${mediaType?.type}, Subtip: ${mediaType?.subtype}")
}
}
În dezvoltarea mobilă, antetul Content-Type este procesat automat de clienții HTTP. În OkHttp pe Android, Content-Type este setat prin RequestBody: val body = "{}".toRequestBody("application/json".toMediaType()). Retrofit gestionează Content-Type prin adnotări: @Body pentru JSON, @Part pentru multipart. Pe iOS, URLSession setează Content-Type pentru HTTPBody, iar Alamofire face acest lucru prin parametrul encoding: JSONEncoding.default sau URLEncoding.default. Setarea manuală a Content-Type este necesară la lucrul cu socket-uri brute sau protocoale personalizate.
Content-Type incorect — una dintre cele mai frecvente probleme la dezvoltarea și integrarea serviciilor web. Cea mai comună eroare este când serverul returnează text/html în loc de application/json. Clientul primește JSON ca șir HTML, nu-l poate parsa și aruncă o excepție. Acest lucru se întâmplă când framework-ul web este configurat implicit pe HTML, iar dezvoltatorul uită să suprascrie Content-Type pentru endpoint-ul API. În PHP, aceasta se manifestă prin absența header('Content-Type: application/json'), în Spring Boot — prin absența adnotării produces.
A doua eroare ca frecvență — charset incorect sau lipsă. Dacă serverul trimite text/html; charset=iso-8859-1, iar browserul așteaptă UTF-8, caracterele chirilice se afișează distorsionat. Această problemă este caracteristică site-urilor vechi care nu au trecut la UTF-8. Pentru JSON, o astfel de eroare apare mai rar, deoarece RFC 8259 prescrie UTF-8 fără acord suplimentar. Soluția — specificați întotdeauna explicit charset=utf-8 pentru tipurile MIME text în configurația serverului.
A treia problemă — neconcordanța Content-Type cu conținutul real. Dacă serverul trimite Content-Type: image/png, iar corpul răspunsului conține o imagine WebP, browserul poate să nu o decodeze. Servere CDN comprimă uneori imaginile cu schimbarea formatului, dar nu actualizează antetul Content-Type. Verificarea conformității Content-Type cu conținutul real este o etapă obligatorie a testării API și a testării de integrare a aplicațiilor mobile.
Pentru depanare, folosiți instrumentele de dezvoltator ale browserului (filiala Network), curl cu flag-ul -I pentru verificarea antetelor răspunsului sau sniffer-e de trafic precum Charles Proxy și Wireshark. Nginx se configurează prin directiva include mime.types, Apache — prin AddType și AddDefaultCharset. Pentru fișierele statice, verificați întotdeauna că extensia fișierului corespunde tipului său MIME. Pentru răspunsurile dinamice, în toate limbajele de programare, setați explicit Content-Type înainte de a scoate date — aceasta previne marea majoritate a problemelor.
Întrebări frecvente
Fără Content-Type, browserul activează MIME sniffing — analiza primilor octeți ai răspunsului pentru determinarea automată a tipului de date. Acest lucru poate duce la procesarea incorectă a conținutului și la crearea de vulnerabilități de securitate. Browserele moderne cu antetul X-Content-Type-Options: nosniff blochează complet ghicirea.
Content-Type indică formatul datelor transmise în mesajul curent (corpul cererii sau răspunsului). Accept — este un antet de cerere care informează serverul despre formatul de răspuns preferat de client. Content-Type este setat de expeditorul datelor, iar Accept — de destinatar, și ele participă la mecanismul de negociere a conținutului.
Tipul MIME oficial pentru JSON este application/json conform specificației RFC 8259. Anterior se folosea text/x-json, dar acest tip este învechit. Parametrul charset pentru application/json nu este necesar, deoarece JSON conform specificației este întotdeauna transmis în codificarea UTF-8, UTF-16 sau UTF-32 cu detectarea automată a ordinii octeților (BOM).
Acest lucru se întâmplă când framework-ul web nu suprascrie Content-Type-ul implicit pentru endpoint-urile API. În PHP se corectează prin apelul header('Content-Type: application/json'), în Spring Boot — prin adnotarea @GetMapping(produces = "application/json"), în Express.js — prin metoda res.set('Content-Type', 'application/json').
application/octet-stream — un tip MIME universal pentru date binare al căror format este necunoscut. Browserul nu încearcă să afișeze un astfel de fișier în fereastră, ci oferă salvarea pe disc. Este folosit pentru descărcări de fișiere, atașamente de e-mail și date în flux atunci când serverul nu poate determina tipul exact al conținutului transmis.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și