這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在Vue中利用axios攔截請求,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)主營太和網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),太和h5成都小程序開發(fā)搭建,太和網(wǎng)站營銷推廣歡迎太和等地區(qū)企業(yè)咨詢
項目使用的ui框架是iview
以下友好提示均使用iview ui的message提示組件,例如this.$Message.xxx
/api/request 僅僅只是例子接口,實際開發(fā)用后臺提供的接口。
code是后臺狀態(tài)碼,我這里也只是例子,不要問我為毛我的返回碼和你的怎么不一樣這樣的問題哈...這些都需要和后臺溝通約定的。
使用的請求頭是:axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
;至于為什么使用這個請求頭可以看看我的另外一篇文章關(guān)于axios會發(fā)送兩次請求,有個OPTIONS請求的問題
因為使用的是這個請求頭所以需要用qs模塊,不然后臺不認這個數(shù)據(jù)。
不使用請求攔截
如果不使用請求攔截,也是可以的,但是會多了非常多的代碼,我們以登錄頁為例。
一個單純,沒有花里胡哨的頁面,|ω?)
//雙向數(shù)據(jù)綁定獲取值 let httpRequest = {}; httpRequest.loginName = this.loginName httpRequest.password= this.password this.$axios.post("/api/request", this.$qs.stringify(httpRequest)).then(data => { //特殊錯誤處理,狀態(tài)為10時為登錄超時 if(data.data.code === 10){ this.$Message.error("登錄已超時,請重新登錄") this.$router.push("/login") //其余錯誤狀態(tài)處理 }else if(data.data.code != 0){ this.$Message.error(data.data.msg) //請求成功 }else if(data.data.code === 0){ //進行成功業(yè)務(wù)邏輯 } //....... });
如果不使用請求攔截,那么對每一條請求每一個狀態(tài)都要特殊處理,如果請求特殊狀態(tài)有數(shù)十個,每個頁面有很多請求,那么頁面會變得很長很臃腫,不好維護。
使用請求攔截
相同的請求返回代碼我們可以抽取出來,寫在請求攔截中
當(dāng)我們設(shè)置了攔截之后,在我們的組件代碼中可以簡化很多,還是以登錄界面為例:
在main.js中
//請求發(fā)送攔截,把數(shù)據(jù)發(fā)送給后臺之前做些什么...... axios.interceptors.request.use((request) => { //這個例子中data是loginName和password let REQUEST_DATA = request.data //統(tǒng)一進行qs模塊轉(zhuǎn)換 request.data = qs.stringify(REQUEST_DATA) //再發(fā)送給后臺 return request; }, function (error) { // Do something with request error return Promise.reject(error); }); //請求返回攔截,把數(shù)據(jù)返回到頁面之前做些什么... axios.interceptors.response.use((response) => { //特殊錯誤處理,狀態(tài)為10時為登錄超時 if (response.data.code === 10) { iView.Message.error("登錄已超時,請重新登錄"); router.push("/login") //其余錯誤狀態(tài)處理 } else if (response.data.code != 0) { iView.Message.error(response.data.msg) //請求成功 } else if(response.data.code === 0){ //將我們請求到的信息返回頁面中請求的邏輯 return response; } //...... }, function (error) { return Promise.reject(error); }); //雙向數(shù)據(jù)綁定獲取值 let httpRequest = {}; httpRequest.loginName = this.loginName httpRequest.password= this.password this.$axios.post("/api/request", httpRequest).then(data => { //這是要先判斷data,如果請求的數(shù)據(jù)狀態(tài)code不為0,會被攔截,則data為undefined if(data){ //進行請求返回成功邏輯 } });
這樣我們就對axios請求添加了攔截,可以減少很多代碼邏輯,頁面可讀性更高,可維護性也更高
其他
這就是axios攔截的最基礎(chǔ)的用法,當(dāng)然也不止于此,我們也可以進行擴展延伸,做更多的事情,只要你的業(yè)務(wù)有需求,axios攔截總能幫到你,這些就需要舉一反三,工具是死的人是活的,我可以再舉個小例子,比如設(shè)置請求簽名。
請求簽名是前臺和后臺約定的一種溝通方式,對數(shù)據(jù)進行加密,可以一定程度上保證數(shù)據(jù)的安全性
還是以這個登錄頁面為例
//雙向數(shù)據(jù)綁定獲取值 let httpRequest = {}; httpRequest.loginName = this.loginName httpRequest.password= this.password this.$axios.post("/api/request", httpRequest).then(data => { //這是要先判斷data,如果請求的數(shù)據(jù)狀態(tài)code不為0,會被攔截,則data為undefined if(data){ //進行請求返回成功邏輯 } });
我們把httpRequest這個data信息數(shù)據(jù)發(fā)送給后臺之前,進行簽名,并加密數(shù)據(jù)
在main.js中,我們對發(fā)送的數(shù)據(jù)進行攔截
//請求發(fā)送攔截 axios.interceptors.request.use((request) => { //獲取請求的數(shù)據(jù),這里是loginName和password let REQUEST_DATA = request.data //獲取請求的地址,這里是/api/request let REQUEST_URL = request.url //設(shè)置簽名并進行qs轉(zhuǎn)換,且賦值給request的data,簽名函數(shù)另外封裝 request.data = qs.stringify(requestDataFn(REQUEST_DATA, REQUEST_URL)) //發(fā)送請求給后臺 return request; }, function (error) { // Do something with request error return Promise.reject(error); }); //已封裝好的簽名函數(shù) function requestDataFn(data, method) { let postData = {} //時間戳,時間戳函數(shù)不作展示,也是已封裝好的 postData.timestamp = getNowFormatDate(); //請求用戶的session以及secretKey信息,為空是未登錄,登錄后我把它存在localStorage中,這個存在哪里都可以,這里只作為例子。 postData.session = localStorage.getItem('session') || ''; postData.secretKey = localStorage.getItem('secretKey') || ''; //請求的地址,這里是/api/request postData.method = method; //請求的數(shù)據(jù)這里是loginName和password,進行base64加密 let base64Data = Base64.encode(JSON.stringify(data)); //設(shè)置簽名并進行md5加密 let signature = md5.hex(postData.secretKey + base64Data + postData.method + postData.session + postData.timestamp + postData.secretKey); //把數(shù)據(jù)再次進行加密 postData.data = encodeURI(base64Data); postData.signature = signature; return postData }
上述就是小編為大家分享的怎么在Vue中利用axios攔截請求了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。