前端數(shù)據(jù)請(qǐng)求方案:$.ajax俐末、axios 和 fetch

簡(jiǎn)介

傳統(tǒng)的請(qǐng)求方案是基于原生js的 XMLHttpReauest(XHR) 對(duì)象的,眾所周知庄蹋,ajax 可以實(shí)現(xiàn)無(wú)刷新請(qǐng)求數(shù)據(jù)瞬内,它的出現(xiàn)使前端的技術(shù)上升了一個(gè)臺(tái)階。但是隨著技術(shù)的革新限书,XHR 對(duì)象的弊端也漸漸的暴露出來(lái)虫蝶,直到現(xiàn)在,我們進(jìn)行前后端數(shù)據(jù)請(qǐng)求的主流方式大體有三種:$.ajax倦西、axiosfetch能真。

jQuery 中的 $.ajax

jQuery 是曾經(jīng)風(fēng)靡一時(shí)的 js 庫(kù),作為一個(gè)相對(duì)完善的方法庫(kù)扰柠,里邊自然有對(duì)前后端數(shù)據(jù)請(qǐng)求的封裝方法—— $.ajax 粉铐。

$.ajax 的用法如下,這里列出幾個(gè)常用的參數(shù)

$.ajax({
    // 請(qǐng)求方式
    type:'GET',
    // URL字符串
    url:url,
    // 發(fā)送到服務(wù)器的數(shù)據(jù)耻矮。將自動(dòng)轉(zhuǎn)換為請(qǐng)求字符串格式秦躯。
    data:data,
    // 預(yù)期服務(wù)器返回的數(shù)據(jù)類(lèi)型。如果不指定裆装,jQuery 將自動(dòng)根據(jù) HTTP 包 MIME 信息來(lái)智能判斷
    dataType:dataType,
    // 成功回調(diào)
    success:function(){},
    // 失敗回調(diào)
    error:function(){}
})

jQuery 中的 $.ajax 是基于原生 XHR 對(duì)象的相對(duì)完善的封裝版本踱承,使用起來(lái)非常便捷倡缠。但是目前來(lái)看也有一些不足的地方,比如:

$.ajax的缺點(diǎn):

  1. $.ajax 的回調(diào)邏輯在內(nèi)部茎活,本身是針對(duì) MVC 架構(gòu)的開(kāi)發(fā)模式而存在的昙沦,而不太符合現(xiàn)在更流行MVVM
  2. 基于原生的XHR對(duì)象開(kāi)發(fā),XHR本身的架構(gòu)不清晰
  3. 如果為了使用 $.ajax 這一個(gè)方法而引入整個(gè)jQuery的話载荔,會(huì)使項(xiàng)目太臃腫

axios

在Vue2.x出現(xiàn)之后盾饮,在項(xiàng)目中使用 axios 已經(jīng)成為主流。axios 的本質(zhì)也是對(duì)原生 XHR 對(duì)象的封裝懒熙,但是它更優(yōu)越的地方是用 Promise 實(shí)現(xiàn)丘损,符合最新的 ES 規(guī)范。

axios({
    method:'post',
    url:'/xxx/xxx',
    data:data
}).then((response)=>{
    console.log(response)
}).catch((err)=>{
    console.log(err)
})

axios 的特點(diǎn):

  1. 支持 Promise
  2. 從 node.js 中創(chuàng)建 http 請(qǐng)求
  3. 客戶端支持防止 CSRF
  4. 自身提供的方法可以對(duì) axios 進(jìn)行二次封裝工扎,攔截請(qǐng)求和響應(yīng)
  5. 提供了并發(fā)請(qǐng)求的接口

**axios 的自主封裝徘钥、配置攔截器 **

  • axios.create()

    創(chuàng)建一個(gè)自定義的 axios 實(shí)例

  • axios.interceptors.request.use()

    請(qǐng)求攔截, axios.interceptors.request.use() 方法用于定義在發(fā)送HTTP請(qǐng)求之前要運(yùn)行的代碼肢娘。

  • axios.interceptors.response.use()

    響應(yīng)攔截呈础, axios.interceptors.response.use() 方法用于定義在接收HTTP響應(yīng)之前要運(yùn)行的代碼。

// 創(chuàng)建一個(gè)自定義的 axios 實(shí)例
const myAxios = axios.create({
    // 請(qǐng)求超時(shí)時(shí)間
    timeout:3000
    // ... ...
})



// 請(qǐng)求攔截
myAxios.interceptors.request.use( config => {
    console.log('請(qǐng)求已發(fā)送');
    // 可以在此處打開(kāi)loading橱健,優(yōu)化用戶體驗(yàn)
    
    return config;
})



// 響應(yīng)攔截
myAxios.interceptors.response.use( config => {
    if(config.status == 200){
        // 響應(yīng)成功而钞,在此處關(guān)閉loading
        
        // 過(guò)濾響應(yīng)數(shù)據(jù)
        return config.data;
    }
},(err)=>{
    // 請(qǐng)求失敗時(shí)拋出異常
    return Promise.reject(err);
})

fetch

fetch 在 ES6 中問(wèn)世,是基于了 Promise 設(shè)計(jì)的拘荡。fetch 用起來(lái)有點(diǎn)像 $.ajax 臼节,但是底層天差地別。fetch 基于原生js珊皿,沒(méi)有使用 XHR 對(duì)象官疲。

const url = 'http://localhost/test.htm';
const options = {
    method: 'POST',
    headers: {
       'Accept': 'application/json',
       'Content-Type': 'application/json;charset=UTF-8'
    },
    //需手動(dòng)轉(zhuǎn)換為字符串
    body: JSON.stringify(bodyObj)
};

fetch(url, options)
.then(response => {
    console.log(response);
});

fetch 的優(yōu)點(diǎn):

  1. 比原生 XHR 對(duì)象的請(qǐng)求語(yǔ)法更簡(jiǎn)潔
  2. 基于 Promise 實(shí)現(xiàn),所以支持 async/await
  3. 脫離了 XHR 對(duì)象亮隙,原理更加底層途凫,提供的API更豐富

axios 和 fetch 的不同

  1. 發(fā)送數(shù)據(jù)時(shí), axios 使用 data 屬性溢吻, fetch 使用 body 屬性
  2. 使用 fetch 時(shí)维费,需手動(dòng)將數(shù)據(jù)進(jìn)行 JSON.stringify()
  3. 在 axios 中,url 在 options 對(duì)象中設(shè)置促王,在 fetch 中犀盟,url 作為第一個(gè)參數(shù)傳入
  4. axios 封裝的更完善,fetch 更底層蝇狼,使用起來(lái)沒(méi)有那么舒服

總結(jié)

$.ajax 只在 jQuery 項(xiàng)目中使用

fetch 更底層阅畴,對(duì)標(biāo)的是 XHR 對(duì)象,擁有很大的優(yōu)化迅耘,但是并沒(méi)有太完美的封裝

axios 體積小贱枣,功能完善监署,而且封裝了并發(fā)請(qǐng)求

能用 axios 就用 axios

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纽哥,隨后出現(xiàn)的幾起案子钠乏,更是在濱河造成了極大的恐慌,老刑警劉巖春塌,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晓避,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡只壳,警方通過(guò)查閱死者的電腦和手機(jī)俏拱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吼句,“玉大人彰触,你說(shuō)我怎么就攤上這事∶剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵分蓖,是天一觀的道長(zhǎng)尔艇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)么鹤,這世上最難降的妖魔是什么终娃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蒸甜,結(jié)果婚禮上棠耕,老公的妹妹穿的比我還像新娘。我一直安慰自己柠新,他們只是感情好窍荧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恨憎,像睡著了一般蕊退。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔恳,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天瓤荔,我揣著相機(jī)與錄音,去河邊找鬼钥组。 笑死输硝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的程梦。 我是一名探鬼主播点把,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橘荠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了愉粤?” 一聲冷哼從身側(cè)響起砾医,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衣厘,沒(méi)想到半個(gè)月后如蚜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡影暴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年错邦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片型宙。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撬呢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妆兑,到底是詐尸還是另有隱情魂拦,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布搁嗓,位于F島的核電站芯勘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腺逛。R本人自食惡果不足惜荷愕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棍矛。 院中可真熱鬧安疗,春花似錦、人聲如沸够委。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茁帽。三九已至掉冶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工贮缅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧亚。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親癣蟋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子透硝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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