1.jQuery ajax
?$.ajax({
????????type:?'POST',
????????url:?url,
????????data:?data,
????????dataType:?dataType,
????????success:?function()?{},
????????error:?function()?{}
????});
傳統(tǒng) Ajax 指的是 XMLHttpRequest(XHR)剥纷, 最早出現(xiàn)的發(fā)送后端請求技術(shù)闺金,隸屬于原始js中拒课,核心使用XMLHttpRequest對象狼牺,多個請求之間如果有先后關(guān)系的話羡儿,就會出現(xiàn)回調(diào)地獄礼患。
JQuery ajax 是對原生XHR的封裝是钥,除此以外還增添了對JSONP的支持掠归。經(jīng)過多年的更新維護(hù),真的已經(jīng)是非常的方便了悄泥,優(yōu)點(diǎn)無需多言虏冻;如果是硬要舉出幾個缺點(diǎn),那可能只有:
1.本身是針對MVC的編程,不符合現(xiàn)在前端MVVM的浪潮
2.基于原生的XHR開發(fā)弹囚,XHR本身的架構(gòu)不清晰厨相。
3.JQuery整個項(xiàng)目太大,單純使用ajax卻要引入整個JQuery非常的不合理(采取個性化打包的方案又不能享受CDN服務(wù))
4.不符合關(guān)注分離(Separation of Concerns)的原則
5.配置和調(diào)用方式非撑葛模混亂蛮穿,而且基于事件的異步模型不友好。
PS:MVVM(Model-View-ViewModel), 源自于經(jīng)典的 Model–View–Controller(MVC)模式毁渗。MVVM 的出現(xiàn)促進(jìn)了 GUI 前端開發(fā)與后端業(yè)務(wù)邏輯的分離践磅,極大地提高了前端開發(fā)效率。MVVM 的核心是 ViewModel 層灸异,它就像是一個中轉(zhuǎn)站(value converter)府适,負(fù)責(zé)轉(zhuǎn)換 Model 中的數(shù)據(jù)對象來讓數(shù)據(jù)變得更容易管理和使用,該層向上與視圖層進(jìn)行雙向數(shù)據(jù)綁定肺樟,向下與 Model 層通過接口請求進(jìn)行數(shù)據(jù)交互檐春,起呈上啟下作用。View 層展現(xiàn)的不是 Model 層的數(shù)據(jù)么伯,而是 ViewModel 的數(shù)據(jù)疟暖,由 ViewModel 負(fù)責(zé)與 Model 層交互,這就完全解耦了 View 層和 Model 層蹦狂,這個解耦是至關(guān)重要的誓篱,它是前后端分離方案實(shí)施的最重要一環(huán)。
如下圖所示:
image.png
2.axios
???axios({
????????method:?'post',
????????url:?'/user/12345',
????????data:?{
????????????firstName:?'Fred',
????????????lastName:?'Flintstone'
????????}
????}).then(function(response)?{
????????console.log(response);
????}).catch(function(error)?{
????????console.log(error);
????});
Vue2.0之后凯楔,尤雨溪推薦大家用axios替換JQuery ajax窜骄,想必讓axios進(jìn)入了很多人的目光中。
axios 是一個基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端摆屯,本質(zhì)上也是對原生XHR的封裝邻遏,只不過它是Promise的實(shí)現(xiàn)版本,符合最新的ES規(guī)范虐骑,它本身具有以下特征:
1.從瀏覽器中創(chuàng)建 XMLHttpRequest
2.支持 Promise API
3.客戶端支持防止CSRF
4.提供了一些并發(fā)請求的接口(重要准验,方便了很多的操作)
5.從 node.js 創(chuàng)建 http 請求
6.攔截請求和響應(yīng)
7.轉(zhuǎn)換請求和響應(yīng)數(shù)據(jù)
8.取消請求
9.自動轉(zhuǎn)換JSON數(shù)據(jù)
PS:防止CSRF:就是讓你的每個請求都帶一個從cookie中拿到的key, 根據(jù)瀏覽器同源策略,假冒的網(wǎng)站是拿不到你cookie中得key的廷没,這樣糊饱,后臺就可以輕松辨別出這個請求是否是用戶在假冒網(wǎng)站上的誤導(dǎo)輸入,從而采取正確的策略颠黎。
3.fetch
??try?{
????????letresponse?=?awaitfetch(url);
????????letdata?=?response.json();
????????console.log(data);
????}?catch?(e)?{
????????console.log("Oops,?error",?e);
????}
fetch號稱是AJAX的替代品另锋,是在ES6出現(xiàn)的滞项,使用了ES6中的promise對象。Fetch是基于promise設(shè)計的夭坪。Fetch的代碼結(jié)構(gòu)比起ajax簡單多了文判,參數(shù)有點(diǎn)像jQuery ajax。但是室梅,一定記住fetch不是ajax的進(jìn)一步封裝戏仓,而是原生js,沒有使用XMLHttpRequest對象亡鼠。
fetch的優(yōu)點(diǎn):
1.符合關(guān)注分離赏殃,沒有將輸入、輸出和用事件來跟蹤的狀態(tài)混雜在一個對象里
2.更好更方便的寫法
坦白說间涵,上面的理由對我來說完全沒有什么說服力嗓奢,因?yàn)椴还苁荍query還是Axios都已經(jīng)幫我們把xhr封裝的足夠好,使用起來也足夠方便浑厚,為什么我們還要花費(fèi)大力氣去學(xué)習(xí)fetch股耽?
我認(rèn)為fetch的優(yōu)勢主要優(yōu)勢就是:
1.語法簡潔,更加語義化2.基于標(biāo)準(zhǔn) Promise 實(shí)現(xiàn)钳幅,支持 async/await3.同構(gòu)方便物蝙,使用[isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)4.更加底層,提供的API豐富(request,response)5.脫離了XHR敢艰,是ES規(guī)范里新的實(shí)現(xiàn)方式
最近在使用fetch的時候诬乞,也遇到了不少的問題:
fetch是一個低層次的API,你可以把它考慮成原生的XHR钠导,所以使用起來并不是那么舒服震嫉,需要進(jìn)行封裝。
例如:
1)fetch只對網(wǎng)絡(luò)請求報錯牡属,對400票堵,500都當(dāng)做成功的請求,服務(wù)器返回 400逮栅,500 錯誤碼時并不會 reject悴势,只有網(wǎng)絡(luò)錯誤這些導(dǎo)致請求不能完成時,fetch 才會被 reject措伐。
2)fetch默認(rèn)不會帶cookie特纤,需要添加配置項(xiàng): fetch(url,{credentials:'include'})3)fetch不支持abort,不支持超時控制侥加,使用setTimeout及Promise.reject的實(shí)現(xiàn)的超時控制并不能阻止請求過程繼續(xù)在后臺運(yùn)行捧存,造成了流量的浪費(fèi)4)fetch沒有辦法原生監(jiān)測請求的進(jìn)度,而XHR可以
總結(jié):axios既提供了并發(fā)的封裝,也沒有fetch的各種問題昔穴,而且體積也較小短蜕,當(dāng)之無愧現(xiàn)在最應(yīng)該選用的請求的方式。