最合適的Ajax內(nèi)容編碼類型

最合適的Ajax內(nèi)容編碼類型

原文地址:我的博客

背景

在公司開發(fā)的一個(gè)頁面的[Ajax][Ajax]請(qǐng)求使用了contentType:application/json酵幕,被后臺(tái)的同事要求用x-www-form-urlencoded,撕逼撕不過他睹逃,趕緊回來學(xué)學(xué)知識(shí)迁霎。

引入

contentType是指http/https發(fā)送信息至服務(wù)器時(shí)的內(nèi)容編碼類型罕扎,contentType用于表明發(fā)送數(shù)據(jù)流的類型咨跌,服務(wù)器根據(jù)編碼類型使用特定的解析方式摹恰,獲取數(shù)據(jù)流中的數(shù)據(jù)辫继。內(nèi)容編碼類型的作用怒见,有點(diǎn)像本地文件的后綴名。

問題來了

發(fā)送Ajax請(qǐng)求最合適的內(nèi)容編碼類型是什么姑宽?

常見的contentType

x-www-form-urlencoded

這是Jquery/Zepto Ajax默認(rèn)的提交類型遣耍。最簡(jiǎn)例子為:

let userInfo = {
 name: 'CntChen',
 info: 'Front-End',
}

$.ajax({
  url: 'https://github.com',
  type: 'POST',
  data: userInfo,
  success: (data) => {},
});

此時(shí)默認(rèn)的提交的contentTypeapplication/x-www-form-urlencoded,此時(shí)提交的數(shù)據(jù)將會(huì)格式化成:

name=CntChen&info=Front-End

HTML的form表單默認(rèn)的提交編碼類型也是x-www-form-urlencoded,可能這就是Jquery/Zepto等類庫(其實(shí)是Ajax:XMLHttpRequest)也默認(rèn)使用contentType:x-www-form-urlencoded的原因,畢竟表單的歷史比Ajax早多了炮车。--我猜的舵变,待驗(yàn)證

如果請(qǐng)求類型typeGET,格式化的字符串將直接拼接在url后發(fā)送到服務(wù)端;如果請(qǐng)求類型是POST瘦穆,格式化的字符串將放在http body的Form Data中發(fā)送纪隙。

json

使用json內(nèi)容編碼發(fā)送數(shù)據(jù),最簡(jiǎn)例子為:

let userInfo = {
 name: 'CntChen',
 Info: 'Front-End',
}

$.ajax({
  url: 'https://github.com',
  contentType: 'application/json',
  type: 'POST',
  data: JSON.stringify(userInfo),
  success: (data) => {},
});

最主要的不同有3點(diǎn):

  • 需要顯式指定contentTypeapplication/json扛或,覆蓋默認(rèn)的contentType
  • 需要使用JSON.stringify序列化需要提交的數(shù)據(jù)對(duì)象绵咱,序列化的結(jié)果為:
{"name":"CntChen","info":"Front-End"}
  • 提交的類型不能為GET,使用GET的話,數(shù)據(jù)會(huì)在url中發(fā)送熙兔,此時(shí)就無法以json字符串的編碼發(fā)送

multipart/form-data

When you are writing client-side code, all you need to know is use multipart/form-data when your form includes any < input type="file" > elements.
-- [multipart/form-data][multipart/form-data]

multipart/form-data主要用于傳輸文件數(shù)據(jù)的悲伶。

JS對(duì)象編碼

對(duì)于扁平的參數(shù)對(duì)象,使用x-www-form-urlencodedjson并沒有大的差別住涉,后臺(tái)都可以處理成對(duì)象麸锉,并且數(shù)據(jù)編碼后的長(zhǎng)度差別不大。
但是對(duì)于對(duì)象中嵌套對(duì)象秆吵,或對(duì)象字段包含數(shù)組淮椰,此時(shí)兩種內(nèi)容編碼方式就有較大差別。

格式化demo

對(duì)象嵌套

{
    userInfo :{
     name: 'CntChen',
     info: 'Front-End',
     login: true,
    },
}
  • to x-www-form-urlencoded (1)
userInfo[name]=CntChen&userInfo[info]=Front-End&userInfo[login]=true
  • to json (2)
{"userInfo":{"name":"CntChen","Info":"Front-End","login":true}}

對(duì)象字段為數(shù)組

{
    authors:[
      {
        name: 'CntChen',
        info: 'Front-End',
      },
      {
        name: 'Eva',
        info: 'Banker',
      }
    ],
}
  • to x-www-form-urlencoded (3)
authors[0][name]=CntChen&authors[0][info]=Front-End&authors[1][name]=Eva&authors[1][info]=Banker
  • to json (4)
{"authors":[{"name":"CntChen","info":"Front-End"},{"name":"Eva","info":"Banker"}]}

可見:x-www-form-urlencoded是先將對(duì)象鋪平纳寂,然后使用key=value的方式主穗,用&作為間隔。對(duì)于嵌套對(duì)象的每個(gè)字段毙芜,都要傳輸其前綴忽媒,如(1)中的userInfo重復(fù)傳輸了3次;(3)中authors傳輸了4次。
如果對(duì)象是多重嵌套的腋粥,或者嵌套對(duì)象的字段較多晦雨,x-www-form-urlencoded會(huì)產(chǎn)生更多冗余信息。同時(shí)隘冲,x-www-form-urlencoded可讀性不如json字符串闹瞧。

回答問題:json最好

較小的傳輸量

從前文可以看出,使用json字符串的形式展辞,可以減少冗余字段的傳輸奥邮,減少請(qǐng)求的數(shù)據(jù)量。

補(bǔ)充:可能你會(huì)覺得(4)中數(shù)組內(nèi)的nameinfo也傳輸了多次,是不是也存在冗余洽腺?其實(shí)這不是冗余脚粟。因?yàn)閷?duì)數(shù)組中的各對(duì)象,并不要求其具有相同的字段(數(shù)組中的對(duì)象并不是結(jié)構(gòu)化的)蘸朋,所以不能忽略“相同”的字段名核无。使用x-www-form-urlencoded編碼方式,數(shù)組內(nèi)對(duì)象的字段也是重復(fù)傳輸藕坯。

請(qǐng)求與返回統(tǒng)一

目前許多前后端交互的返回?cái)?shù)據(jù)是json字符串团南,這可能是考慮較小的傳輸量而作出的選擇。同時(shí)堕担,ES3.1添加了JSON對(duì)象已慢,許多瀏覽器可以[直接使用JSON對(duì)象][Can I use JSON]曲聂,可以將json字符串解析為JS對(duì)象(JSON.parse),將JS對(duì)象編碼為json字符串(JSON.stringify);
所以使用json編碼請(qǐng)求數(shù)據(jù)霹购,其編碼解碼非常方便,并且可以保持與后臺(tái)返回?cái)?shù)據(jù)的格式一致朋腋。
一致是一件很美好的事情齐疙。

框架的支持

目前Mvvm的前端框架如React,網(wǎng)絡(luò)請(qǐng)求通常是提交一個(gè)JS對(duì)象(傳輸?shù)臅r(shí)候編碼為json字符串)旭咽。后臺(tái)服務(wù)器如Koa贞奋,接收請(qǐng)求和響應(yīng)的數(shù)據(jù)是json字符串。

可讀性高

可讀性高是json格式[自帶buff][JSON]穷绵。

結(jié)論

趕緊使用contentType=applications/json轿塔。

References

  • Ajax

http://css88.com/doc/zeptojs_api/#$.ajax
[Ajax]:http://css88.com/doc/zeptojs_api/#$.ajax

  • x-www-form-urlencoded VS json - Pros and Cons. And Vulns.

http://homakov.blogspot.in/2012/06/x-www-form-urlencoded-vs-json-pros-and.html
[x-www-form-urlencoded VS json]:http://homakov.blogspot.in/2012/06/x-www-form-urlencoded-vs-json-pros-and.html

  • What does enctype='multipart/form-data' mean?

http://stackoverflow.com/questions/4526273/what-does-enctype-multipart-form-data-mean
[multipart/form-data]:http://stackoverflow.com/questions/4526273/what-does-enctype-multipart-form-data-mean

  • Can I use JSON

http://caniuse.com/#search=JSON
[Can I use JSON]:http://caniuse.com/#search=JSON

  • JSON

http://www.json.org/
[JSON]:http://www.json.org/

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仲墨,隨后出現(xiàn)的幾起案子勾缭,更是在濱河造成了極大的恐慌,老刑警劉巖目养,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩由,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡癌蚁,警方通過查閱死者的電腦和手機(jī)幻梯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碘梢,“玉大人,你說我怎么就攤上這事汰翠。” “怎么了妓局?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵存炮,是天一觀的道長(zhǎng)穆桂。 經(jīng)常有香客問我有额,道長(zhǎng)茴迁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任糖耸,我火速辦了婚禮,結(jié)果婚禮上倦蚪,老公的妹妹穿的比我還像新娘个束。我一直安慰自己沪悲,他們只是感情好阱表,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布殿如。 她就那樣靜靜地躺著,像睡著了一般捶枢。 火紅的嫁衣襯著肌膚如雪握截。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天烂叔,我揣著相機(jī)與錄音,去河邊找鬼固歪。 笑死蒜鸡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牢裳。 我是一名探鬼主播逢防,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蒲讯!你這毒婦竟也來了忘朝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤判帮,失蹤者是張志新(化名)和其女友劉穎局嘁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晦墙,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悦昵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但指。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棋凳,到底是詐尸還是另有隱情拦坠,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布剩岳,位于F島的核電站贪婉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卢肃。R本人自食惡果不足惜疲迂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莫湘。 院中可真熱鬧尤蒿,春花似錦、人聲如沸幅垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忙芒。三九已至示弓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呵萨,已是汗流浹背奏属。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潮峦,地道東北人囱皿。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像忱嘹,于是被迫代替她去往敵國(guó)和親嘱腥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容