axios 攔截器

這是我參與更文挑戰的第5天,活動詳情查看: 更文挑戰ios

攔截器分爲 request請求攔截器response響應攔截器,建立 axios 實例後,可配置請求攔截器axios

axios 基礎使用及配置後端

請求攔截

在請求發送前統一執行某些操做,經常使用在請求頭中處理token等api

var instance = axios.create({
  timeout: 60000,
  withCredentials: true
})
// 請求攔截器
instance.interceptors.request.use(function (config){
    // 在發送請求以前能夠作一些事情
     config.headers.token = 'token'   //在headers中攜帶token
     return config
},function (error){
    // 處理請求錯誤
    return Promise.reject(error)
})
複製代碼

token 等 headers 信息處理也能夠在 axios 實例建立後全局處理,大部分 api 的攜帶信息應該不會再改了服務器

instance.defaults.headers.common["token"] = getCookie("accessToken")
instance.defaults.headers.common["SID"] = '3f25944323'
instance.defaults.headers.common["action"] = 'Server'
複製代碼

除了 common 以外還有其餘方法,這裏一塊兒列出來,方便後續須要處理時使用markdown

instance.defaults.headers.common["token"] = "Token"
instance.defaults.headers.get[CSRFToken'] = "Token"
instance.defaults.headers.put['CSRFToken'] = "Token"
instance.defaults.headers.delete['CSRFToken'] = "Token"
instance.defaults.headers.patch['CSRFToken'] = "Token"
複製代碼

響應攔截

在接收到服務器響應後統一執行某些操做,經常使用的是對各種狀態碼作統一處理session

// 響應攔截器
instance.interceptors.response.use(
  // 請求成功業務處理
  response => {
    //攔截響應,作統一處理 
    if (response.status === 200 && response.data.request_id) {
      // 與後端協定好對應需求的返回值code,這裏進行響應前處理
      if (response.data.code == 0) {
        return response.data;
      } else if (response.data.code == 1) {
        // 未登陸
        window.location.href = LOGIN_URL
      } else if (response.data.code == 2) {
        // 無權限
        router.push({ path: '/unauthorized' })
      } else if (response.data.code == 4) {
        // 未開通
        router.push({ path: '/buy' })
        return response.data;
      } else {
        // 錯誤信息
        let msg = response.data.msg
        Message.error({
          message: msg,
          duration: 3000,
          center: true,
          offset: 50,
          showClose: true
        })
        return Promise.reject(error)
      }
    }
    return response
  },
  //接口錯誤狀態處理,接口未能正常返回數據的狀況
  error => {
    // 對經常使用的錯誤狀態碼攔截處理,也可與後端協商特殊錯誤碼
    if (error.response.status === 500) {
      Message.error({
        message: '服務器內部錯誤',
        duration: 3000,
        center: true,
        offset: 50,
        showClose: true
      })
      router.push({ path: '/errorpage' })
      return Promise.reject(error)
    }
    if (error.response.status === 404) {
      router.push({ path: "/undefined" })
      return Promise.reject(error)
    }
    if (error.response.status === 403) {
      store.dispatch("app/setServerError", "403")
      removeCookie("csrftoken")
      removeCookie("sessionid")
      router.push({ path: "/errorpage" })
      return Promise.reject(error)
    }
    if (error.response.status === 422) {
      // let msg= error.response.data.msg
      // 翻譯後端返回的錯誤信息
      let msg = window.rootVueInstance.$i18n.t('Error.' + error.response.data.msg)
      Message.error({
        message: msg,
        duration: 3000,
        center: true,
        offset: 50,
        showClose: true
      })
      return Promise.reject(error)
    }
    if (error.response.status === 409) {
      let msg409 = '獲取列表失敗,請檢查AK信息是否正確'
      return Promise.reject(error)
    }
    // ...
    return Promise.reject(error.response.status)
  })
複製代碼

導出實例app

export default instance
複製代碼

axios 攔截器就配置好啦 ~post

相關文章
相關標籤/搜索