Http之content-type

待學(xué)習(xí):https://blog.csdn.net/danielzhou888/article/details/72861097

常見媒體格式如下:

text/html : HTML格式
text/plain :純文本格式
text/xml : XML格式
image/gif :gif圖片格式
image/jpeg :jpg圖片格式
image/png:png圖片格式

以application開頭的媒體格式類型:

application/xhtml+xml :XHTML格式
application/xml : XML數(shù)據(jù)格式
application/atom+xml :Atom XML聚合格式
application/json : JSON數(shù)據(jù)格式
application/pdf :pdf格式
application/msword : Word文檔格式
application/octet-stream : 二進制流數(shù)據(jù)(如常見的文件下載)
application/x-www-form-urlencoded : 中默認的encType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認的提交數(shù)據(jù)的格式)

作者:一灰灰
鏈接:https://juejin.im/post/5b5efff0e51d45198469acea
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

作者:瀟湘待雨
鏈接:https://juejin.im/post/5cb34fc06fb9a068a75d3555
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

content-type :內(nèi)容類型

Content-Type:實體頭部用于指示資源的MIME類型。
默認:text/html
實際場景:在請求中 (如POST 或 PUT),客戶端告訴服務(wù)器實際發(fā)送的數(shù)據(jù)類型。

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

MIME 組成結(jié)構(gòu)如下: 由類型與子類型兩個字符串中間用'/'分隔而組成。不允許空格存在。對大小寫不敏感,但傳統(tǒng)都是小寫。 允許額外參數(shù),如后面所示:

結(jié)構(gòu):type/subtype;parameter=value

Multipart類型

Multipart類型指明被分為幾部分的一種文檔的類目,且經(jīng)常有不同的MIME類型。也可以用來表示屬于相同事物的多個且獨立的文件,這些獨立的文件構(gòu)成一個復(fù)雜的文檔。在電子郵件場景中常見。
有兩種Multipart類型:message和multipart。

  • message 一個包括其他信息的消息,常用于下面的場景,例如指明一個郵件包含轉(zhuǎn)發(fā)信息或者在多種信息的情況下,允許以chunk的形式發(fā)送數(shù)據(jù)量很大的信息。包括message/rfc822和message/partial
  • multipart
    由多個不同MIME類型組件構(gòu)成的數(shù)據(jù),例如 multipart/form-data(使用FormData API生成的數(shù)據(jù))

看完了基本定義,下面看看常見的類型及使用場景。

常見類型及使用場景

靜態(tài)資源、圖片、媒體類

對于靜態(tài)資源、圖片和媒體類,也就是text、image、video等比較清晰明了,不再詳細描述。

application類

  • application/json

    隨著json這種輕量級的數(shù)據(jù)交互格式的流行,特別是和腳本交互的便利,使得在前后接口中,越來越多采用json格式。對于http協(xié)議來說,最終傳輸?shù)倪€是字符。這里不再多進行描述。

  • application/x-www-form-urlencoded 作為表單提交中默認的類型,其表明數(shù)據(jù)以標(biāo)準(zhǔn)的編碼格式被編碼為鍵值對。 數(shù)據(jù)被編碼成以 '&' 分隔的鍵-值對, 同時以 '=' 分隔鍵和值. 非字母或數(shù)字的字符會被 percent-encoding: 這也就是為什么這種類型不支持二進制數(shù)據(jù)的原因 (應(yīng)使用 multipart/form-data 代替).
    我們以新浪為例,可以看到其請求報文(formdata那里選擇,view source可以看得比較清楚):

    image.png

  • multipart/form-data 這里為了對比,就也放到這里來說了。
    一般用于涉及文件的表單提交,用于post請求,其格式如下:

    Content-Type: multipart/form-data; boundary=aBoundaryString
    復(fù)制代碼
    

    其中boundary指明了請求體中每部分的分割符(對于multipart的類目,都會存在該字段,以區(qū)分請求體中數(shù)據(jù)的分割),其請求體中則是對應(yīng)表單每部分的內(nèi)容。每部分都會有自己的請求體和相關(guān)內(nèi)容。
    例如如下的文檔結(jié)構(gòu):

  <form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
  <input type="text" name="myTextField">
  <input type="checkbox" name="myCheckBox">Check</input>
  <input type="file" name="myFile">
  <button>Send the file</button>
</form>
復(fù)制代碼

其請求信息如下:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
// 以 ---------------------------8721656041911415653955004498 作為分割符
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465

-----------------------------8721656041911415653955004498
// 分段一 文本相關(guān)信息
Content-Disposition: form-data; name="myTextField"
// 對應(yīng)value
Test
-----------------------------8721656041911415653955004498
// checkbox
Content-Disposition: form-data; name="myCheckBox"

on
-----------------------------8721656041911415653955004498
// 文件
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain

Simple file.
-----------------------------8721656041911415653955004498--
復(fù)制代碼
  • application/javascript application/x-javascript text/javascript
    對于js文件,常見MIME類型為text/javascript,但是前兩種應(yīng)該會有見到過。三者之間多少還是有點區(qū)別的。
    傳統(tǒng)的js程序?qū)?yīng)的MIME類型為text/javascript,其他的還有"application/x-javascript"(x前綴表示這是實驗性類型), 因為text/javascript是最常見的類型,所以RFC4329定義了“text/javascript”。不過,js文件實際上并不是真正的文本類型,因此推出了application/javascript類型,不過現(xiàn)行的支持性并不好,所以常常會用application/x-javascript來代替。

  • application/zip application/gzip
    zip 對應(yīng)zip壓縮文件,gzip是若干種文件壓縮程序的簡稱,通常指GNU計劃的實現(xiàn),此處的gzip代表GNU zip。

  • application/http
    這一種大家可能就不常見了,從類型可以知道,是http請求,但具體用途還是要翻下規(guī)范才能找到的。
    此類型包含的http請求包含在binary消息體中,在郵件協(xié)議傳輸中需要指明Content-Transfer-Encoding。
    在批量處理請求時會遇到,其表現(xiàn)如下:

--batch_0123456789
Content-Type: application/http
Content-ID: 
// 必須的字段,表明傳送內(nèi)容的編碼格式 即二進制流
Content-Transfer-Encoding: binary

POST https://www.googleapis.com/analytics/v3/management/accounts/XXXXXX/webproperties/UA-XXXXXX-1/customDimensions
Content-Type: application/json
Content-Length: 68

{
 "name": "Campaign Group",
 "scope": "SESSION",
 "active": true
} 
復(fù)制代碼

multipart類型

正如上文所述,multipart一般對應(yīng)單個消息頭對應(yīng)多個消息體。 常見語法如下:

Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p
復(fù)制代碼

其中boundary字段是必須的,用于區(qū)分消息體中的數(shù)據(jù)邊界,一般是兩個'-'的格式作為該端的開頭,例如:

--gc0p4Jq0M2Yt08jU534c0p
復(fù)制代碼

我們主要關(guān)注的也就是下面幾種:

  • multipart/form-data 見上面application部分。下面這幾部分可能不是那么常見,不過還是可以了解一下,以免遇到的時候懵逼。

  • multipart/mixed
    該類型用于,消息體由多個獨立的部分組成且想連續(xù)的展示。并且子數(shù)據(jù)類型有任一種無法被識別(此處指被瀏覽器直接識別的類型,例如text等)的類型時,都應(yīng)該為mixed。
    概括而言就是該郵件有二進制內(nèi)容,非可以直接識別的內(nèi)容

例如:

POST /batch/farm/v1 HTTP/1.1
Authorization: Bearer your_auth_token
Host: www.googleapis.com
Content-Type: multipart/mixed; boundary=batch_foobarbaz
Content-Length: total_content_length

--batch_foobarbaz
// 子內(nèi)容為http請求 不過是boundary編碼過的
Content-Type: application/http
Content-ID: <item1:12930812@barnyard.example.com>

GET /farm/v1/animals/pony

--batch_foobarbaz
Content-Type: application/http
Content-ID: <item2:12930812@barnyard.example.com>

PUT /farm/v1/animals/sheep
Content-Type: application/json
Content-Length: part_content_length
If-Match: "etag/sheep"

{
  "animalName": "sheep",
  "animalAge": "5"
  "peltColor": "green",
}

--batch_foobarbaz
Content-Type: application/http
Content-ID: <item3:12930812@barnyard.example.com>

GET /farm/v1/animals
If-None-Match: "etag/animals"

--batch_foobarbaz--
復(fù)制代碼

這里消息體中的內(nèi)容就是http請求,在google批量接口協(xié)議中用使用。

  • multipart/alternative
    該類型與mixed的語法相同,但語義不同。其表明,消息體中的不同部分應(yīng)該是相同信息的不同版本。即內(nèi)容相同傳輸類型不同,以適應(yīng)不同的接受者。
    還是舉例:
From:  Nathaniel Borenstein <nsb@bellcore.com> 
To: Ned Freed <ned@innosoft.com> 
Subject: Formatted text mail 
MIME-Version: 1.0 
Content-Type: multipart/alternative; boundary=boundary42 

--boundary42 
Content-Type: text/plain; charset=us-ascii 

...plain text version of message goes here.... 

--boundary42 
Content-Type: text/richtext 

.... richtext version of same message goes here ... 
--boundary42 
Content-Type: text/x-whatever 

.... fanciest formatted version of same  message  goes  here 
... 
--boundary42-- 

假如用戶的系統(tǒng)可以識別 text/x-whatever 類型,那么其將會只看到這一部分。不同的用戶看到什么內(nèi)容取決于其系統(tǒng)支持何種類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容