要處理這個問題先要了解cors跨域資源共享,可以到阮大神的微博了解一下盛杰。http://www.ruanyifeng.com/blog/2016/04/cors.html
參考:https://segmentfault.com/a/1190000016040998
注:這個問題與用不用axios無關(guān),只是axios在我們項目上使用的比較多,所以大家才以為是axios出現(xiàn)的問題测砂。
前世今生:
產(chǎn)生原因:跨域請求中用了非簡單請求(not-so-simple request),因為axios默認(rèn)跨域請求Content-Type = “application/json”
啥是非簡單請求:非簡單請求是那種對服務(wù)器有特殊要求的請求百匆,比如請求方法是PUT或DELETE砌些,或者Content-Type字段的類型是application/json。
解決方法:讓axios的請求改為簡單請求加匈,修改axios的請求字段Content-Type改為'application/x-www-form-urlencoded',請求數(shù)據(jù)的時候用qs模塊進(jìn)行轉(zhuǎn)化一下存璃。
問題描述:
Vue的開發(fā)者都知道axios,很多都用axios來進(jìn)行數(shù)據(jù)交互雕拼,axios的默認(rèn)請求頭是Content-Type: application/json
使用這個請求頭會出現(xiàn)向服務(wù)器請求兩次的情況
為什么呢纵东?
原因是:瀏覽器會首先使用 OPTIONS 方法發(fā)起一個預(yù)請求,判斷接口是否能夠正常通訊啥寇,如果不能就不會發(fā)送真正的請求過來偎球,如果測試通訊正常,則開始真正的請求辑甜。
大概意思就是:
瀏覽器對后臺說:我可以請求你嗎衰絮?
后臺說:闊以。
結(jié)果是:發(fā)送原有的POST請求
后臺說:不闊以磷醋。
結(jié)果是:報錯
那么這樣每個請求都會發(fā)送兩次坚嗜,無形加重了服務(wù)器的負(fù)擔(dān)(如果服務(wù)器特厲害就當(dāng)我沒說)史简,網(wǎng)上有的解決辦法是讓后臺允許options請求瘟裸,但是并不返回任何數(shù)據(jù),那么就不會報錯乃戈,可是這樣治標(biāo)不治本,瀏覽器還是來撩后臺了亩进,只是后臺不讓撩而已症虑。
如何解決這個問題?
那就是在main.js中归薛,設(shè)置axios的默認(rèn)請求頭axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
可是傳值的格式問題怎么解決呢谍憔?
后臺不認(rèn)這個數(shù)據(jù)格式啊...
所以在傳遞的時候必須先把數(shù)據(jù)轉(zhuǎn)換格式
這時候我們需要用到qs模塊
先 npm install qs
在main.js中
引入qs模塊
import qs from 'qs
然后弄qs原型
Vue.prototype.$qs = qs
這樣我們就可以在axios post請求的時候?qū)⑽覀儌鬟f的數(shù)據(jù)轉(zhuǎn)換成后臺認(rèn)識的格式
this.$axios
.post("http://xxx/",
this.$qs.stringify(postData)
).then(data => {
if (data.data.status != 200) {
//xxx
} else {
//xxx
}
});
這樣就完美解決問題,減少了對服務(wù)器的請求主籍,減輕了對服務(wù)器的壓力.