1.application/x-www-form-urlencoded
GET方式,會將表單中的數據(鍵值對)經過urlencode編碼后追加到url中。
POST方式,會將表單中的數據經過urlencode編碼后放在request body 中。
2.multipart/form-data
當需要在表單內上傳文件時(二進制流數據)時,就需要使用 multipart/form-data。
"application/x-www-form-urlencoded",他是默認的MIME內容編碼類型,一般可以用於所有的情況。但是他在傳輸比較大的二進制或者文本數據時效率極低。這種情況應該使用"multipart/form-data"。如上傳文件或者二進制數據和非ASCII數據。
在 application/x-www-form-urlencoded 消息中:
......
name=ryan+ou&email=ryan@rhythmtechnology.com
......
(不同的field會用"&"符號連接;空格被替換成"+";field和value間用"="聯系,等等)
再看multipart/form-data 消息中:
......
-----------------------------7cd1d6371ec
Content-Disposition: form-data; name="name"
ryan ou
-----------------------------7cd1d6371ec
Content-Disposition: form-data; name="email"
ryan@rhythmtechnology.com
-----------------------------7cd1d6371ec
Content-Disposition: form-data; name="Logo"; filename="D:\My Documents\My Pictures\Logo.jpg"
Content-Type: image/jpeg
......
(每個field被分成小部分,而且包含一個value是"form-data"的"Content-Disposition"的頭部;一個"name"屬性對應field的ID,等等)
-------------------------------------------------
application/x-www-form-urlencoded
1、它是post的默認格式,使用js中URLencode轉碼方法。包括將name、value中的空格替換為加號;將非ascii字符做百分號編碼;將input的name、value用‘=’連接,不同的input之間用‘&’連接。
2、百分號編碼什么意思呢。比如漢字‘丁’吧,他的utf8編碼在十六進制下是0xE4B881,占3個字節,把它轉成字符串‘E4B881’,變成了六個字節,每兩個字節前加上百分號前綴,得到字符串“%E4%B8%81”,變成九個ascii字符,占九個字節(十六進制下是0x244534254238253831)。把這九個字節拼接到數據包里,這樣就可以傳輸“非ascii字符的 utf8編碼的 十六進制表示的 字符串的 百分號形式”,^_^。
3、同樣使用URLencode轉碼,這種post格式跟get的區別在於,get把轉換、拼接完的字符串用‘?’直接與表單的action連接作為URL使用,所以請求體里沒有數據;而post把轉換、拼接后的字符串放在了請求體里,不會在瀏覽器的地址欄顯示,因而更安全一些。
---------------------
multipart/form-data
1、對於一段utf8編碼的字節,用application/x-www-form-urlencoded傳輸其中的ascii字符沒有問題,但對於非ascii字符傳輸效率就很低了(漢字‘丁’從三字節變成了九字節),因此在傳很長的字節(如文件)時應用multipart/form-data格式。smtp等協議也使用或借鑒了此格式。
2、此格式表面上發送了什么呢。用此格式發送一段一句話和一個文件,請求體如下
同時請求頭里規定了Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymNhhHqUh0p0gfFa8
可見請求體里不同的input之間用一段叫boundary的字符串分割,每個input都有了自己一個小header,其后空行接着是數據。
3、此格式實際上發送了什么呢。fiddler抓包如下
右邊明顯看到了一段亂碼,為什么呢,以漢字‘丁’為例,其utf8編碼為0xE4B881,這三個字節會直接拼接到數據包中,即其在實際發送時只占三字節,上圖右邊是逐字節轉為ascii字符顯示的,因此會顯示為三個亂碼字符。
4、由上可見,multipart/form-data將表單中的每個input轉為了一個由boundary分割的小格式,沒有轉碼,直接將utf8字節拼接到請求體中,在本地有多少字節實際就發送多少字節,極大提高了效率,適合傳輸長字節。
"application/x-www-form-urlencoded",他是默認的MIME內容編碼類型,一般可以用於所有的情況。但是他在傳輸比較大的二進制或者文本數據時效率極低。這種情況應該使用"multipart/form-data"。如上傳文件或者二進制數據和非ASCII數據。
---------------------
版權聲明:本文為CSDN博主「hula_好天氣」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013827143/article/details/86222486