前后分離(一)---前后端數(shù)據(jù)交互,axios和jquery ajax的區(qū)別

2018年05月26日 11:47:55?心誠則靈--艾?閱讀數(shù) 7669

axios作為Vue生態(tài)系統(tǒng)中濃墨重彩的一筆,我學(xué)習(xí)這個(gè)東西也是花了一定的時(shí)間的。剛開始的時(shí)候,也是遇到了很多問題。

逐漸摸透了它的脾氣。

首先說說FormData和Payload兩種數(shù)據(jù)格式的區(qū)別:

先是提交一個(gè)FormData的請(qǐng)求試試看:

然后我們看后端:

然后我們提交一個(gè)以Payload傳輸數(shù)據(jù)的請(qǐng)求:

我們?cè)偾械胶笈_(tái):

這就是使用axios和jquery ajax最大的區(qū)別。

jquery提交數(shù)據(jù)的時(shí)候,默認(rèn)是以FormData的形式提交的,也就是Content-Type:"application/x-www-form-urlencoded",

而默認(rèn)axios是使用的是Payload形式提交數(shù)據(jù),也就是Content-Type:"application/json"

如何切換呢,我們需用應(yīng)用以下方式:

var?params?=?new?URLSearchParams();??

params.append('param1',?'value1');??

params.append('param2',?'value2');??

它的意思,其實(shí)就是把這樣的數(shù)據(jù)(對(duì)象){ name:"yangxu",age:23 } 轉(zhuǎn)換成這樣的數(shù)據(jù)(字符串) "name=yangxu&age=23"這樣的查詢字符串。

如果我們每次需要傳遞數(shù)據(jù)的時(shí)候,都這樣寫,是很復(fù)雜的,于是,我們可以進(jìn)行一次全局配置,將請(qǐng)求數(shù)據(jù)按照需求進(jìn)行相應(yīng)的轉(zhuǎn)化:

import?Vue?from?'vue'??

import?querystring?from?'querystring'??

import?axios?from?"axios"??


export?const?baseURL?=?process.env.NODE_ENV?===?'production'???'/'?:?'/api';??

export?const?http?=?axios.create({??

??baseURL:?baseURL,??

??timeout:?10000,??

withCredentials:true,??

headers:?{'X-Requested-With':?'XMLHttpRequest'},??

??transformRequest:?[data?=>?{??

return?querystring.stringify(data);??

??}]??

});??

然后,我們可以把這個(gè)axios的實(shí)例掛在到Vue的原型上:Vue.prototype.$http=http;

然后在Vue的組件里面,就可以這樣用:

this.$http.post('/Home/GetInfo',{??

????????sName:"yangxu",??

????????sId:20??

?})??

.then(function?(response)?{??

?????????console.log(response);??

???????})??

.catch(function?(error)?{??

?????????console.log(error);??

???????});??

這樣,問題雖然解決了,我們需要進(jìn)行反思。

FormData和Payload傳輸數(shù)據(jù)應(yīng)用場(chǎng)景:我個(gè)人根據(jù)自己的實(shí)際開發(fā)進(jìn)行總結(jié)得出,如果前臺(tái)提交給后臺(tái)的數(shù)據(jù)是確定的(什么是確定的,就是你提交的數(shù)據(jù)格式不會(huì)因?yàn)橛脩舻牟僮鞫淖?,如可選項(xiàng),用戶填寫了那么提交,沒就不提交,后臺(tái)接收是可空類型),如果是不確定的(比如我用戶點(diǎn)擊一個(gè)操作,就必須新增一條數(shù)據(jù),后臺(tái)記錄的是前臺(tái)提交過去的數(shù)組),此時(shí)可以采用Payload形式提交??傊?,根據(jù)自己的業(yè)務(wù)選擇合適的數(shù)據(jù)提交方式。

有一種特殊的業(yè)務(wù)場(chǎng)景,就是需要進(jìn)行文件上傳的時(shí)候,此時(shí)我們只能采用Payload的形式上傳。

先看業(yè)務(wù)場(chǎng)景截圖:

我們想在上傳文件的時(shí)候,并且同時(shí)帶給后端一些數(shù)據(jù),那么,我們采用HTML5提供的FormData API,這個(gè)對(duì)象比較特殊,不要嘗試破壞它的結(jié)構(gòu),否則是無法上傳的,具體的使用方式請(qǐng)參考MDN。

此時(shí),我們需要對(duì)我們的transformRequest方法進(jìn)行一些修改:

我們?cè)谡{(diào)用的時(shí)候,手動(dòng)指定Content-Type為“application/json”,告訴axios不要對(duì)我們的數(shù)據(jù)進(jìn)行任何操作即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容