一是數(shù)據(jù)包格式的區(qū)別,二是數(shù)據(jù)包中非ANSCII字符怎么編碼,,是百分號(hào)轉(zhuǎn)碼發(fā)送還是直接發(fā)送 一,、application/x-www-form-urlencoded 1、它是post的默認(rèn)格式,,使用js中URLencode轉(zhuǎn)碼方法,。包括將name、value中的空格替換為加號(hào),;將非ascii字符做百分號(hào)編碼,;將input的name、value用‘=’連接,,不同的input之間用‘&’連接,。 2、百分號(hào)編碼什么意思呢,。比如漢字‘丁’吧,,他的utf8編碼在十六進(jìn)制下是0xE4B881,占3個(gè)字節(jié),,把它轉(zhuǎn)成字符串‘E4B881’,,變成了六個(gè)字節(jié),每?jī)蓚€(gè)字節(jié)前加上百分號(hào)前綴,,得到字符串“%E4%B8%81”,,變成九個(gè)ascii字符,占九個(gè)字節(jié)(十六進(jìn)制下是0x244534254238253831),。把這九個(gè)字節(jié)拼接到數(shù)據(jù)包里,,這樣就可以傳輸“非ascii字符的 utf8編碼的 十六進(jìn)制表示的 字符串的 百分號(hào)形式”,^_^,。 3,、同樣使用URLencode轉(zhuǎn)碼,這種post格式跟get的區(qū)別在于,,get把轉(zhuǎn)換,、拼接完的字符串用‘?’直接與表單的action連接作為URL使用,所以請(qǐng)求體里沒(méi)有數(shù)據(jù),;而post把轉(zhuǎn)換,、拼接后的字符串放在了請(qǐng)求體里,不會(huì)在瀏覽器的地址欄顯示,,因而更安全一些,。 二、multipart/form-data 1,、對(duì)于一段utf8編碼的字節(jié),,用application/x-www-form-urlencoded傳輸其中的ascii字符沒(méi)有問(wèn)題,,但對(duì)于非ascii字符傳輸效率就很低了(漢字‘丁’從三字節(jié)變成了九字節(jié)),因此在傳很長(zhǎng)的字節(jié)(如文件)時(shí)應(yīng)用multipart/form-data格式,。smtp等協(xié)議也使用或借鑒了此格式,。 2、此格式表面上發(fā)送了什么呢,。用此格式發(fā)送一段一句話和一個(gè)文件,,請(qǐng)求體如下 同時(shí)請(qǐng)求頭里規(guī)定了Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymNhhHqUh0p0gfFa8 可見(jiàn)請(qǐng)求體里不同的input之間用一段叫boundary的字符串分割,每個(gè)input都有了自己一個(gè)小header,,其后空行接著是數(shù)據(jù),。 3、此格式實(shí)際上發(fā)送了什么呢,。fiddler抓包如下 右邊明顯看到了一段亂碼,,為什么呢,以漢字‘丁’為例,,其utf8編碼為0xE4B881,,這三個(gè)字節(jié)會(huì)直接拼接到數(shù)據(jù)包中,即其在實(shí)際發(fā)送時(shí)只占三字節(jié),,上圖右邊是逐字節(jié)轉(zhuǎn)為ascii字符顯示的,,因此會(huì)顯示為三個(gè)亂碼字符,。 4,、由上可見(jiàn),multipart/form-data將表單中的每個(gè)input轉(zhuǎn)為了一個(gè)由boundary分割的小格式,,沒(méi)有轉(zhuǎn)碼,,直接將utf8字節(jié)拼接到請(qǐng)求體中,在本地有多少字節(jié)實(shí)際就發(fā)送多少字節(jié),,極大提高了效率,,適合傳輸長(zhǎng)字節(jié)。 |
|
來(lái)自: liang1234_ > 《http》