HTTP中的Content-type詳解

Content-Type
Content-Type(MediaType),即是Internet Media Type,互聯(lián)網(wǎng)媒體類型,也叫做MIME類型。在互聯(lián)網(wǎng)中有成百上千中不同的數(shù)據(jù)類型,HTTP在傳輸數(shù)據(jù)對象時會為他們打上稱為MIME的數(shù)據(jù)格式標(biāo)簽,用于區(qū)分?jǐn)?shù)據(jù)類型。最初MIME是用于電子郵件系統(tǒng)的,后來HTTP也采用了這一方案。
在HTTP協(xié)議消息頭中,使用Content-Type來表示請求和響應(yīng)中的媒體類型信息。它用來告訴服務(wù)端如何處理請求的數(shù)據(jù),以及告訴客戶端(一般是瀏覽器)如何解析響應(yīng)的數(shù)據(jù),比如顯示圖片,解析并展示html等等。
Content-Type的格式:
Content-Type:type/subtype ;parameter
- type:主類型,任意的字符串,如text,如果是*號代表所有;
- subtype:子類型,任意的字符串,如html,如果是*號代表所有,用“/”與主類型隔開;
- parameter:可選參數(shù),如charset,boundary等。
例如:
- Content-Type: text/html;
- Content-Type: application/json;charset:utf-8;
常見Content-Type
常見的Content-Type有數(shù)百個,下面例舉了一些
- HTML文檔標(biāo)記:text/html;
- 普通ASCII文檔標(biāo)記:text/html;
- JPEG圖片標(biāo)記:image/jpeg;
- GIF圖片標(biāo)記:image/gif;
- js文檔標(biāo)記:application/javascript;
- xml文件標(biāo)記:application/xml;
更多具體內(nèi)容可參考《圖解HTTP》- 附錄D
上面的Content-Type,我們只認(rèn)得就好,但是下面有4種是需要我們清楚他們的區(qū)別及牢記在心的。
application/x-www-form-urlencoded
HTTP會將請求參數(shù)用key1=val1&key2=val2的方式進(jìn)行組織,并放到請求實(shí)體里面,注意如果是中文或特殊字符如"/"、","、“:" 等會自動進(jìn)行URL轉(zhuǎn)碼。不支持文件,一般用于表單提交。
下面是一個例子:
- 請求參數(shù)
- http 請求報(bào)文
multipart/form-data
與application/x-www-form-urlencoded不同,這是一個多部分多媒體類型。首先生成了一個 boundary 用于分割不同的字段,在請求實(shí)體里每個參數(shù)以------boundary開始,然后是附加信息和參數(shù)名,然后是空行,最后是參數(shù)內(nèi)容。多個參數(shù)將會有多個boundary塊。如果參數(shù)是文件會有特別的文件域。最后以------boundary–為結(jié)束標(biāo)識。multipart/form-data支持文件上傳的格式,一般需要上傳文件的表單則用該類型。
下面是一個例子:
- 請求參數(shù)
- http 請求報(bào)文
application/json
JSON 是一種輕量級的數(shù)據(jù)格式,以“鍵-值”對的方式組織的數(shù)據(jù)。這個使用這個類型,需要參數(shù)本身就是json格式的數(shù)據(jù),參數(shù)會被直接放到請求實(shí)體里,不進(jìn)行任何處理。服務(wù)端/客戶端會按json格式解析數(shù)據(jù)(約定好的情況下)。
- 請求參數(shù)
- http 請求報(bào)文
application/xml 和 text/xml
與application/json類似,這里用的是xml格式的數(shù)據(jù),text/xml的話,將忽略xml數(shù)據(jù)里的編碼格式,參考。
Content-Type的使用
request 的Content-Type
一般我們在開發(fā)的過程中需要注意客戶端發(fā)送請求(Request)時的Content-Type設(shè)置,特別是使用ajax的時候,如果設(shè)置得不準(zhǔn)確,很有可能導(dǎo)致請求失敗。比如在spring中,如果接口使用了@RequestBody,spring強(qiáng)大的自動解析功能,會將請求實(shí)體的內(nèi)容自動轉(zhuǎn)換為Bean,但前提是請求的Content-Type必須設(shè)置為application/json,否正就會返回415錯誤。
注:415 錯誤是 Unsupported media type,即不支持的媒體類型。
建議:
- 如果是一個restful接口(json格式),一般將Content-Type設(shè)置為application/json; charset=UTF-8;
- 如果是文件上傳,一般Content-Type設(shè)置為multipart/form-data
- 如果普通表單提交,一般Content-Type設(shè)置為application/x-www-form-urlencoded
response的Content-Type
服務(wù)端響應(yīng)(Response)的Content-Type最好也保持準(zhǔn)確,雖然一般web開發(fā)中,前端解析響應(yīng)的數(shù)據(jù)不會根據(jù)Content-Type,并且服務(wù)端一般能自動設(shè)置準(zhǔn)確的Content-Type,但是如果亂設(shè)置某些情況下可能會有問題,比如導(dǎo)出文件,打開圖片等。如果在spring項(xiàng)目里使用@ResponseBody,spring會將響應(yīng)的Content-Type設(shè)置為application/json;charset=UTF-8;,可能會導(dǎo)致文件無法導(dǎo)出,需要注意下。
response的Content-Type設(shè)置建議:
- 一般情況下不需要顯示設(shè)置;
- 如果是文件導(dǎo)出,Content-Type 設(shè)置為 multipart/form-data,并且添加一個Content-Disposition設(shè)置為attachment;fileName=文件.后綴。
注:Content-Disposition是Content-Type的擴(kuò)展,告訴瀏覽器彈窗下載框,而不是直接在瀏覽器里展示文件。因?yàn)橐话銥g覽器對于它能夠處理的文件類型,如txt,pdf 等,它都是直接打開展示,而不是彈窗下載框。
下面的一個設(shè)置response的Content-Type的例子:
- 未準(zhǔn)確設(shè)置response的Content-type的情況,客戶端將json數(shù)據(jù)當(dāng)成普通文本
content-type →text/html;charset=UTF-8
- 準(zhǔn)確設(shè)置response的Content-type的情況,客戶端將json數(shù)據(jù)自動解析
content-type →application/json;charset=UTF-8
參考
《HTTP 權(quán)威指南》
以上所述是小編給大家介紹的HTTP中的Content-type詳解,希望對大家有所幫助。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
- HTML表格用于在網(wǎng)頁上展示數(shù)據(jù),通過標(biāo)簽及其相關(guān)標(biāo)簽來創(chuàng)建,表格由行和列組成,每一行包含一個或多個單元格,單元格可以包含文本、圖像、鏈接等元素,本文將詳細(xì)介紹HTML表格2025-03-12
- 本文介紹了三種禁止HTML頁面滾動的方法:通過CSS的overflow屬性、使用JavaScript的滾動事件監(jiān)聽器以及使用CSS的position:fixed屬性,每種方法都有其適用場景和優(yōu)缺點(diǎn),感興2025-02-24
使用HTML和CSS實(shí)現(xiàn)文字鏤空效果的代碼示例
在 Web 開發(fā)中,文本的視覺效果是提升用戶體驗(yàn)的重要因素之一,通過 CSS 技巧,我們可以創(chuàng)造出許多獨(dú)特的效果,例如文字鏤空效果,本文將帶你一步一步實(shí)現(xiàn)一個簡單的文字鏤空2024-11-17Html去除a標(biāo)簽的默認(rèn)樣式的操作代碼
在Html中,a標(biāo)簽?zāi)J(rèn)的超鏈接樣式是藍(lán)色字體配下劃線,這可能不滿足所有設(shè)計(jì)需求,如需去除這些默認(rèn)樣式,可以通過CSS來實(shí)現(xiàn),本文給大家介紹Html去除a標(biāo)簽的默認(rèn)樣式的操作代碼2024-09-25- 在HTML中,可以通過設(shè)置CSS的resize屬性為none,來禁止用戶手動拖動文本域(textarea)的大小,這種方法簡單有效,適用于大多數(shù)現(xiàn)代瀏覽器,但需要在老舊瀏覽器中進(jìn)行測試以確保2024-09-25
如何通過HTML/CSS 實(shí)現(xiàn)各類進(jìn)度條的功能
本文詳細(xì)介紹了如何利用HTML和CSS實(shí)現(xiàn)多種風(fēng)格的進(jìn)度條,包括基礎(chǔ)的水平進(jìn)度條、環(huán)形進(jìn)度條以及球形進(jìn)度條等,還探討了如何通過動畫增強(qiáng)視覺效果,內(nèi)容涵蓋了使用HTML原生標(biāo)簽2024-09-19HTML中Canvas關(guān)鍵知識點(diǎn)總結(jié)
Canvas 提供了一套強(qiáng)大的 2D 繪圖 API,適用于各種圖形繪制、圖像處理和動畫制作,可以幫助你創(chuàng)建復(fù)雜且高效的網(wǎng)頁圖形應(yīng)用,這篇文章主要介紹了HTML中Canvas關(guān)鍵知識點(diǎn)總結(jié)2024-06-03html table+css實(shí)現(xiàn)可編輯表格的示例代碼
本文主要介紹了html table+css實(shí)現(xiàn)可編輯表格的示例代碼,主要使用HTML5的contenteditable屬性,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2024-03-06HTML中使用Flex布局實(shí)現(xiàn)雙行夾批效果
本文主要介紹了HTML中使用Flex布局實(shí)現(xiàn)雙行夾批效果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)2024-02-22HTML+CSS實(shí)現(xiàn)炫酷登錄切換的項(xiàng)目實(shí)踐
在網(wǎng)站開發(fā)中,登錄頁面是必不可少的一部分,本文就來介紹一下HTML+CSS實(shí)現(xiàn)登錄切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需2024-02-02