91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue中怎么使用axios請求攔截

發布時間:2020-12-05 14:17:13 來源:億速云 閱讀:172 作者:小新 欄目:web開發

小編給大家分享一下Vue中怎么使用axios請求攔截,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、前言

axios的基礎使用就不過多的講解啦,如何使用可以看axios文檔使用說明·Axios中文說明

在這里和大家分享一下axios攔截在實際項目中的使用

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

二、說在前面的

項目使用的ui框架是iview

以下友好提示均使用iview ui的message提示組件,例如this.$Message.xxx
/api/request  僅僅只是例子接口,實際開發用后臺提供的接口。
code是后臺狀態碼,我這里也只是例子,不要問我為毛我的返回碼和你的怎么不一樣這樣的問題哈...這些都需要和后臺溝通約定的。
使用的請求頭是:axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';至于為什么使用這個請求頭可以看看我的另外一篇文章關于axios會發送兩次請求,有個OPTIONS請求的問題
因為使用的是這個請求頭所以需要用qs模塊,不然后臺不認這個數據。

三、不使用請求攔截

如果不使用請求攔截,也是可以的,但是會多了非常多的代碼,我們以登錄頁為例。

Vue中怎么使用axios請求攔截


一個單純,沒有花里胡哨的頁面,|ω?)

//雙向數據綁定獲取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password

this.$axios.post("/api/request", this.$qs.stringify(httpRequest)).then(data => {
    //特殊錯誤處理,狀態為10時為登錄超時
    if(data.data.code === 10){
        this.$Message.error("登錄已超時,請重新登錄")
        this.$router.push("/login")
    //其余錯誤狀態處理    
    }else if(data.data.code != 0){
        this.$Message.error(data.data.msg)
    //請求成功
    }else if(data.data.code === 0){
        //進行成功業務邏輯
    }
    //.......
});

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

三、使用請求攔截

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

在main.js中

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

  //這個例子中data是loginName和password
  let REQUEST_DATA = request.data
  //統一進行qs模塊轉換
  request.data = qs.stringify(REQUEST_DATA)
  //再發送給后臺
  return request;

}, function (error) {
  // Do something with request error
  return Promise.reject(error);
});

//請求返回攔截,把數據返回到頁面之前做些什么...
axios.interceptors.response.use((response) => {
  //特殊錯誤處理,狀態為10時為登錄超時
  if (response.data.code === 10) {
    iView.Message.error("登錄已超時,請重新登錄");
    router.push("/login")
  //其余錯誤狀態處理    
  } 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);
});
//雙向數據綁定獲取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password

this.$axios.post("/api/request", httpRequest).then(data => {
    //這是要先判斷data,如果請求的數據狀態code不為0,會被攔截,則data為undefined
    if(data){
        //進行請求返回成功邏輯
    }
});

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

四、其他

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

請求簽名是前臺和后臺約定的一種溝通方式,對數據進行加密,可以一定程度上保證數據的安全性

還是以這個登錄頁面為例

//雙向數據綁定獲取值
let httpRequest = {};
httpRequest.loginName = this.loginName
httpRequest.password= this.password

this.$axios.post("/api/request", httpRequest).then(data => {
    //這是要先判斷data,如果請求的數據狀態code不為0,會被攔截,則data為undefined
    if(data){
        //進行請求返回成功邏輯
    }
});

我們把httpRequest這個data信息數據發送給后臺之前,進行簽名,并加密數據
main.js中,我們對發送的數據進行攔截

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

  //獲取請求的數據,這里是loginName和password
  let REQUEST_DATA = request.data
  //獲取請求的地址,這里是/api/request
  let REQUEST_URL = request.url
   
  //設置簽名并進行qs轉換,且賦值給request的data,簽名函數另外封裝
  request.data = qs.stringify(requestDataFn(REQUEST_DATA, REQUEST_URL))
  //發送請求給后臺
  return request;

}, function (error) {
  // Do something with request error
  return Promise.reject(error);
});

//已封裝好的簽名函數
function requestDataFn(data, method) {

  let postData = {}

  //時間戳,時間戳函數不作展示,也是已封裝好的
  postData.timestamp = getNowFormatDate();

  //請求用戶的session以及secretKey信息,為空是未登錄,登錄后我把它存在localStorage中,這個存在哪里都可以,這里只作為例子。
  postData.session = localStorage.getItem('session') || '';
  postData.secretKey = localStorage.getItem('secretKey') || '';
  
  //請求的地址,這里是/api/request
  postData.method = method;
    
  //請求的數據這里是loginName和password,進行base64加密
  let base64Data = Base64.encode(JSON.stringify(data));
   
  //設置簽名并進行md5加密
  let signature = md5.hex(postData.secretKey + base64Data + postData.method + postData.session + postData.timestamp + postData.secretKey);
   
  //把數據再次進行加密
  postData.data = encodeURI(base64Data);

  postData.signature = signature;
   
  return postData
}

這樣我們就完成了對數據加密以及簽名,這樣再發送給后臺。

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

以上是“Vue中怎么使用axios請求攔截”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武鸣县| 长顺县| 晋中市| 沈丘县| 临湘市| 济阳县| 灌云县| 平顺县| 个旧市| 浦东新区| 韶关市| 姜堰市| 中阳县| 那曲县| 淮北市| 普定县| 治多县| 盐城市| 上饶市| 绵阳市| 六盘水市| 吴桥县| 苍南县| 浦北县| 深圳市| 新宁县| 冷水江市| 淮滨县| 新安县| 丽水市| 新民市| 青海省| 江川县| 青阳县| 清苑县| 太白县| 长垣县| 嵊州市| 元谋县| 尚志市| 宽城|