成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

在Vue中如何使用axios請求攔截

_Dreams / 1085人閱讀

摘要:很多初學(xué)者就會放棄使用攔截器,畢竟攔截器是可以不使用的,但是使用攔截器,會在頁面中減少很多不必要的代碼。三不使用請求攔截如果不使用請求攔截,也是可以的,但是會多了非常多的代碼,我們以登錄頁為例。

一、前言 axios的基礎(chǔ)使用就不過多的講解啦,如何使用可以看axios文檔使用說明·Axios中文說明 在這里和大家分享一下axios攔截在實際項目中的使用

很多人都看過axios的官方文檔中攔截器這一欄,有的人可能會有點懵,因為文檔只告訴你有這個東西,而不告訴你在什么情況下使用。很多初學(xué)者就會放棄使用axios攔截器,畢竟攔截器是可以不使用的,但是使用攔截器,會在頁面中減少很多不必要的代碼。

二、說在前面的 項目使用的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模塊,不然后臺不認(rèn)這個數(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){
        //進(jìn)行成功業(yè)務(wù)邏輯
    }
    //.......
});

如果不使用請求攔截,那么對每一條請求每一個狀態(tài)都要特殊處理,如果請求特殊狀態(tài)有數(shù)十個,每個頁面有很多請求,那么頁面會變得很長很臃腫,不好維護(hù)。

三、使用請求攔截

相同的請求返回代碼我們可以抽取出來,寫在請求攔截中
當(dāng)我們設(shè)置了攔截之后,在我們的組件代碼中可以簡化很多,還是以登錄界面為例:

main.js
//請求發(fā)送攔截,把數(shù)據(jù)發(fā)送給后臺之前做些什么......
axios.interceptors.request.use((request) => {

  //這個例子中data是loginName和password
  let REQUEST_DATA = request.data
  //統(tǒng)一進(jìn)行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){
        //進(jìn)行請求返回成功邏輯
    }
});

這樣我們就對axios請求添加了攔截,可以減少很多代碼邏輯,頁面可讀性更高,可維護(hù)性也更高

四、其他

這就是axios攔截的最基礎(chǔ)的用法,當(dāng)然也不止于此,我們也可以進(jìn)行擴(kuò)展延伸,做更多的事情,只要你的業(yè)務(wù)有需求,axios攔截總能幫到你,這些就需要舉一反三,工具是死的人是活的,我可以再舉個小例子,比如設(shè)置請求簽名。

請求簽名是前臺和后臺約定的一種溝通方式,對數(shù)據(jù)進(jìn)行加密,可以一定程度上保證數(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){
        //進(jìn)行請求返回成功邏輯
    }
});

我們把httpRequest這個data信息數(shù)據(jù)發(fā)送給后臺之前,進(jìn)行簽名,并加密數(shù)據(jù)
main.js中,我們對發(fā)送的數(shù)據(jù)進(jìn)行攔截

//請求發(fā)送攔截
axios.interceptors.request.use((request) => {

  //獲取請求的數(shù)據(jù),這里是loginName和password
  let REQUEST_DATA = request.data
  //獲取請求的地址,這里是/api/request
  let REQUEST_URL = request.url
   
  //設(shè)置簽名并進(jìn)行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,進(jìn)行base64加密
  let base64Data = Base64.encode(JSON.stringify(data));
   
  //設(shè)置簽名并進(jìn)行md5加密
  let signature = md5.hex(postData.secretKey + base64Data + postData.method + postData.session + postData.timestamp + postData.secretKey);
   
  //把數(shù)據(jù)再次進(jìn)行加密
  postData.data = encodeURI(base64Data);

  postData.signature = signature;
   
  return postData
}

這樣我們就完成了對數(shù)據(jù)加密以及簽名,這樣再發(fā)送給后臺。

注意:這里只作為例子展示,如果需要用到簽名,如何簽名,是前臺和后臺溝通的結(jié)果!
axios請求攔截的用處遠(yuǎn)遠(yuǎn)不止這樣,具體如何使用,還需要在實際工作,實際項目中隨機(jī)應(yīng)變啦。

如果對你有幫助請點贊收藏支持一下,有什么疑問歡迎留言,有錯誤歡迎大力指出

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98653.html

相關(guān)文章

  • 后端開發(fā)者的Vue學(xué)習(xí)之路(五)

    摘要:由服務(wù)器提供的響應(yīng)來自服務(wù)器響應(yīng)的狀態(tài)碼來自服務(wù)器響應(yīng)的狀態(tài)信息服務(wù)器響應(yīng)的頭是為請求提供的配置信息所以請求返回后,我們可以通過來獲取響應(yīng)情況。攔截器攔截器攔截器用于攔截發(fā)起的請求或用于攔截返回的響應(yīng)。目錄 上節(jié)內(nèi)容回顧 使用第三方組件庫 如何發(fā)起請求 請求錯誤處理 請求帶參 ...

    jay_tian 評論0 收藏0
  • Spring Boot + Vue 前后端分離開發(fā),前端網(wǎng)絡(luò)請求封裝與配置

    摘要:今天松哥就帶大家來看看的使用。此時啟動前端項目,就可以順利發(fā)送網(wǎng)絡(luò)請求了。松哥將自己封裝的網(wǎng)絡(luò)請求庫已經(jīng)放在上,歡迎大家參考。前端網(wǎng)絡(luò)訪問,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,網(wǎng)絡(luò)訪問較多的采用 vue-resources,Vue2.0 之后,官方不再建議使用 vue-resources ,這個項目本身也停止維護(hù),目前建議使用的方案是 axios。今天松哥就帶大...

    Ku_Andrew 評論0 收藏0
  • 實戰(zhàn)Vue簡易項目(5)模擬數(shù)據(jù)

    摘要:若需要傳參,傳第二個參數(shù)不接受多個參數(shù)的傳入,最多只接收兩個參數(shù)請求數(shù)據(jù)目前,通過以上步驟,我們獨(dú)立的構(gòu)建了模擬數(shù)據(jù)和狀態(tài)管理,但還沒有將它們結(jié)合起來。驗證如果你想驗證寫出來的模擬數(shù)據(jù)是否正確,可以在示例頁打開控制臺,直接運(yùn)行。 關(guān)于模擬數(shù)據(jù),這里使用Mock.js這個庫,關(guān)于用法,官網(wǎng)說的也比較詳細(xì),這里我就簡單的帶一下。 列表數(shù)據(jù) 我們先將項目中src/components/Hel...

    Magicer 評論0 收藏0
  • vue封裝axios基本思路

    Axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。在vue項目之中使用axios是一個非常明智的選擇,因為vue官方已經(jīng)宣稱不再維護(hù)vue-resource,并且推薦使用axios. 1 為什么選擇axios? 使用axios可以統(tǒng)一做請求-響應(yīng)攔截,例如響應(yīng)時我們將響應(yīng)信息攔截起來,判斷狀態(tài)碼,從而彈出報錯信息 設(shè)定請求超時,例如3000ms未響應(yīng)...

    microcosm1994 評論0 收藏0
  • 淺談使用 Vue 構(gòu)建前端 10w+ 代碼量的單頁面應(yīng)用開發(fā)底層

    摘要:其實就是我們開始掛載上去的我們在這里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時服務(wù)器出錯等均通過攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項目,除去 node_modules, bu...

    rickchen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<