vue項目中對axios的二次封裝


近來在使用vue重構公司m站時,使用了axios來進行數據的請求,由於項目的需要,對axios進行了二次封裝,點擊進入axios

//引入axios
import axios from 'axios'
 
let cancel ,promiseArr = {}
const CancelToken = axios.CancelToken;
//請求攔截器
axios.interceptors.request.use(config => {
     //發起請求時,取消掉當前正在進行的相同請求
     if (promiseArr[config.url]) {
         promiseArr[config.url]( '操作取消' )
         promiseArr[config.url] = cancel
     } else {
         promiseArr[config.url] = cancel
     }
       return config
}, error => {
     return Promise.reject(error)
})
 
//響應攔截器即異常處理
axios.interceptors.response.use(response => {
     return response
}, error => {
     if (error && err.response) {
       switch (err.response.status) {
         case 400:
           err.message = '錯誤請求'
           break ;
         case 401:
           err.message = '未授權,請重新登錄'
           break ;
         case 403:
           err.message = '拒絕訪問'
           break ;
         case 404:
           err.message = '請求錯誤,未找到該資源'
           break ;
         case 405:
           err.message = '請求方法未允許'
           break ;
         case 408:
           err.message = '請求超時'
           break ;
         case 500:
           err.message = '服務器端出錯'
           break ;
         case 501:
           err.message = '網絡未實現'
           break ;
         case 502:
           err.message = '網絡錯誤'
           break ;
         case 503:
           err.message = '服務不可用'
           break ;
         case 504:
           err.message = '網絡超時'
           break ;
         case 505:
           err.message = 'http版本不支持該請求'
           break ;
         default :
           err.message = `連接錯誤${err.response.status}`
       }
     } else {
       err.message = "連接到服務器失敗"
     }
     message.error(err.message)
       return Promise.resolve(error.response)
})
 
axios.defaults.baseURL = '/api'
//設置默認請求頭
axios.defaults.headers = {
     'X-Requested-With' : 'XMLHttpRequest'
}
axios.defaults.timeout = 10000
 
export default {
   //get請求
     get (url,param) {
       return new Promise((resolve,reject) => {
         axios({
           method: 'get' ,
           url,
           params: param,
           cancelToken: new CancelToken(c => {
             cancel = c
           })
         }).then(res => {
           resolve(res)
         })
       })
     },
   //post請求
     post (url,param) {
       return new Promise((resolve,reject) => {
         axios({
           method: 'post' ,
           url,
           data: param,
           cancelToken: new CancelToken(c => {
             cancel = c
           })
         }).then(res => {
           resolve(res)
         })
       })
      }
   }

說明

1.為防止發起請求時,當前正在進行的相同請求,在請求攔截器中加入了hash判斷,將相同請求url攔截
2.將axios中get,post公共配置抽離出來

axios.defaults.baseURL = '/api'
//設置默認請求頭
axios.defaults.headers = {
     'X-Requested-With' : 'XMLHttpRequest'
}
axios.defaults.timeout = 10000

3.get,post請求的封裝

可能你會問,這里的axios返回的就是promise對象,為什么還要再次對get,post封裝一次promise.因為我這邊的話,在開發中使用async await會出現數據請求失敗的情況,報的錯就是返回的不是promise對象。(ps:可async await返回的就是promise呀,這個問題后續再搞一下)就直接return了一個promise對象,以避免上面的錯誤。下面是請求接口的一個例子

import req from '../api/requestType'
/**
  4. 拼團詳情
  */
export const groupDetail = param => {
     return req.get( '/RestHome/GroupDetail' ,param)
}

下面是數據的獲取

async getData() {
     const params = {
         TopCataID: 0,
         pageNumber: this .pageNumber,
         pageSize: this .pageSize
     }
     const res = await groupList(params)
},

1.在相應攔截器中對請求常見的錯誤進行了全局異常處理

axios.interceptors.response.use(response => {...

到這里我們就簡單的封裝了一下適合自己項目的axios

原文鏈接:https://segmentfault.com/a/1190000012332982


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM