axios的封裝

Axios的攔截器介紹:

  • axios的攔截器原理如下:
    image.png

    axios攔截器
    axios作為網(wǎng)絡(luò)請求的第三方工具, 可以進行請求和響應(yīng)的攔截
    通過create創(chuàng)建了一個新的axios實例
// 創(chuàng)建了一個新的axios實例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // 超時時間
})

請求攔截器
請求攔截器主要處理 token的統(tǒng)一注入問題

// 請求攔截器
service.interceptors.request.use(async config => {
  // 請求接口  config是請求配置
  // 取token
  if (store.getters.token) {
    // 只要有token 就要檢查token時效性
    if (CheckIsTimeOut()) {
      //  繼續(xù)?
      await store.dispatch('user/lgout')
      router.push('/login') // 跳到登錄
      return Promise.reject(new Error('您的token已經(jīng)失效'))
    }
    // 如果存在token
    config.headers.Authorization = `Bearer ${store.getters.token}`
    // return config
  }
  // 這里一定要注意
  // 一定要return config
  return config
}, error => {
  return Promise.reject(error)
})

處理axios的響應(yīng)攔截器

  • 響應(yīng)攔截器主要處理 返回的數(shù)據(jù)異常數(shù)據(jù)結(jié)構(gòu)問題

OK,除此之外,axios返回的數(shù)據(jù)中默認增加了一層data的包裹,我們需要在這里處理下
并且,如果執(zhí)行失敗,只是設(shè)置了successfalse,并沒有reject,我們需要一并處理下

image.png
// 響應(yīng)攔截器
service.interceptors.response.use(response => {
  // 成功執(zhí)行
  // axios默認加了一層data的包裹
  const { success, message, data } = response.data
  if (success) {
    // 此時認為業(yè)務(wù)執(zhí)行成功了
    return data // 返回用戶所需要的數(shù)據(jù)
  } else {
    // 當(dāng)業(yè)務(wù)失敗的時候
    Message.error(message) // 提示消息
    return Promise.reject(new Error(message))
  }
}, async error => {
  // error 有response對象 config
  if (error.response && error.response.data && error.response.data.code === 10002) {
    // 后端告訴前端token超時了
    await store.dispatch('user/lgout') // 調(diào)用登出action
    router.push('/login') // 跳到登錄頁
  }
  // 失敗
  // Message等同于 this.$message
  Message.error(error.message) // 提示錯誤
  // reject
  return Promise.reject(error) // 傳入一個錯誤的對象  就認為promise執(zhí)行鏈 進入了catch
})
// 檢查token是否過期
function CheckIsTimeOut() {
  // 當(dāng)前時間  - 存儲的時間戳 > 時效性  false   tr
  return (Date.now() - getTimeStamp()) / 1000 > TimeOut
}

處理登錄的返回結(jié)構(gòu)問題

  async login(context, data) {
    // 經(jīng)過響應(yīng)攔截器的處理之后 這里的result實際上就是 token
    const result = await login(data) // 實際上就是一個promise  result就是執(zhí)行的結(jié)果
    // axios默認給數(shù)據(jù)加了一層data
    // 表示登錄接口調(diào)用成功 也就是意味著你的用戶名和密碼是正確的
    // 現(xiàn)在有用戶token
    // actions 修改state 必須通過mutations
    context.commit('setToken', result)
  }
// 導(dǎo)出一個axios的實例  而且這個實例要有請求攔截器 響應(yīng)攔截器
import axios from 'axios'
const service = axios.create() // 創(chuàng)建一個axios的實例
service.interceptors.request.use() // 請求攔截器
service.interceptors.response.use() // 響應(yīng)攔截器
export default service // 導(dǎo)出axios實例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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