Vue axios 封裝

1.為什么一定要封裝呢不是直接向ajax一樣直接使用呢, 原因如下

1.每家公司都會(huì)去云服務(wù)器注冊(cè)他們自己的域名這里不管是一級(jí)域名還是二級(jí)域名,axios提供的請(qǐng)求攔截器再加上我們項(xiàng)目的環(huán)境變量可靈活多變的在所有請(qǐng)求上面加上公司 的域名簡(jiǎn)直不要太爽哦。

2.如果你們接手過項(xiàng)目很多什么c端b端。后臺(tái)接口respons返回的難道你要一個(gè)個(gè)處理嗎。當(dāng)時(shí)不是,所有接口請(qǐng)求成功之前都要過你這個(gè)攔截器,axios為我們提供了響應(yīng) 攔截器。異常統(tǒng)一處理,只需要判斷HTTP狀態(tài)碼即可。一個(gè)字爽

3.封裝請(qǐng)求方法get post, put, delte。為你打開方便大門配合async 和await

 // 在http.js中引入axios
import axios from 'axios'; // 引入axios
import QS from 'qs'; // 引入qs模塊,用來序列化post類型的數(shù)據(jù),后面會(huì)提到
// vant的toast提示框組件,大家可根據(jù)自己的ui組件更改。
import { Toast } from 'vant';
axios.defaults.timeout = 10000;  //通過axios.defaults.timeout設(shè)置默認(rèn)的請(qǐng)求超時(shí)時(shí)間。例如超過了10s,就會(huì)告知用戶當(dāng)前請(qǐng)求超時(shí),請(qǐng)刷新等。
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //設(shè)置post請(qǐng)求頭
// 先導(dǎo)入vuex,因?yàn)槲覀円褂玫嚼锩娴臓顟B(tài)對(duì)象
// vuex的路徑根據(jù)自己的路徑去寫
import store from '@/store/index';
// 請(qǐng)求攔截器
axios.interceptors.request.use(   
    config => {       

        // 每次發(fā)送請(qǐng)求之前判斷vuex中是否存在token       

        // 如果存在,則統(tǒng)一在http請(qǐng)求的header都加上token,這樣后臺(tái)根據(jù)token判斷你的登錄情況

        // 即使本地存在token,也有可能token是過期的,所以在響應(yīng)攔截器中要對(duì)返回狀態(tài)進(jìn)行判斷

        const token = store.state.token;       

        token && (config.headers.Authorization = token);       

        return config;   

    },   

    error => {       

        return Promise.error(error);   

})

// 響應(yīng)攔截器

axios.interceptors.response.use(   

    response => { 

        // 如果返回的狀態(tài)碼為200,說明接口請(qǐng)求成功,可以正常拿到數(shù)據(jù)   

        // 否則的話拋出錯(cuò)誤

        if (response.status === 200) {           

            return Promise.resolve(response);       

        } else {           

            return Promise.reject(response);       

        }   

    },   

    // 服務(wù)器狀態(tài)碼不是2開頭的的情況

    // 這里可以跟你們的后臺(tái)開發(fā)人員協(xié)商好統(tǒng)一的錯(cuò)誤狀態(tài)碼   

    // 然后根據(jù)返回的狀態(tài)碼進(jìn)行一些操作,例如登錄過期提示,錯(cuò)誤提示等等

    // 下面列舉幾個(gè)常見的操作,其他需求可自行擴(kuò)展

    error => {           

        if (error.response.status) {           

            switch (error.response.status) {               

                // 401: 未登錄

                // 未登錄則跳轉(zhuǎn)登錄頁(yè)面,并攜帶當(dāng)前頁(yè)面的路徑

                // 在登錄成功后返回當(dāng)前頁(yè)面,這一步需要在登錄頁(yè)操作。               

                case 401:                   

                    router.replace({                       

                        path: '/login',                       

                        query: {

                            redirect: router.currentRoute.fullPath

                        }

                    });

                    break;

                // 403 token過期

                // 登錄過期對(duì)用戶進(jìn)行提示

                // 清除本地token和清空vuex中token對(duì)象

                // 跳轉(zhuǎn)登錄頁(yè)面               

                case 403:

                    Toast({

                        message: '登錄過期,請(qǐng)重新登錄',

                        duration: 1000,

                        forbidClick: true                    });

                    // 清除token

                    localStorage.removeItem('token');

                    store.commit('loginSuccess', null);

                    // 跳轉(zhuǎn)登錄頁(yè)面,并將要瀏覽的頁(yè)面fullPath傳過去,登錄成功后跳轉(zhuǎn)需要訪問的頁(yè)面

                    setTimeout(() => {                       

                        router.replace({                           

                            path: '/login',                           

                            query: {

                                redirect: router.currentRoute.fullPath

                            }                       

                        });                   

                    }, 1000);                   

                    break;

                // 404請(qǐng)求不存在

                case 404:

                    Toast({

                        message: '網(wǎng)絡(luò)請(qǐng)求不存在',

                        duration: 1500,

                        forbidClick: true                    });

                    break;

                // 其他錯(cuò)誤,直接拋出錯(cuò)誤提示

                default:

                    Toast({

                        message: error.response.data.message,

                        duration: 1500,

                        forbidClick: true                    });

            }

            return Promise.reject(error.response);

        }

    }   

});



/**

這里封裝請(qǐng)求方法可根據(jù)個(gè)人喜好來填

* get方法,對(duì)應(yīng)get請(qǐng)求

* @param {String} url [請(qǐng)求的url地址]

* @param {Object} params [請(qǐng)求時(shí)攜帶的參數(shù)]

*/export function get(url, params){   

    return new Promise((resolve, reject) =>{       

        axios.get(url, {           

            params: params       

        }).then(res => {

            resolve(res.data);

        }).catch(err =>{

            reject(err.data)       

    })   

});

/**
 * 封裝get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function fetch(url,params={}){
  return new Promise((resolve,reject) => {
    axios.get(url,{
      params:params
    })
    .then(response => {
      resolve(response.data);
    })
    .catch(err => {
      reject(err)
    })
  })
}


/**
 * 封裝post請(qǐng)求
 * @param url
 * @param data
 * @returns {Promise}
 */

 export function post(url,data = {}){
   return new Promise((resolve,reject) => {
     axios.post(url,data)
          .then(response => {
            resolve(response.data);
          },err => {
            reject(err)
          })
   })
 }

 /**
 * 封裝patch請(qǐng)求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.patch(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

 /**
 * 封裝put請(qǐng)求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.put(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 安裝依賴 安裝axios npm i axios 安裝qs npm i qs 封裝 【utils/request....
    瞌睡大伯父閱讀 1,760評(píng)論 3 17
  • 為什么要對(duì)Axios進(jìn)行封裝 通常我們的項(xiàng)目會(huì)越做越大,頁(yè)面也會(huì)越來越多,如果頁(yè)面非常的少,直接用axios也沒有...
    Guyere閱讀 1,770評(píng)論 0 0
  • vue腳手架中,全局封裝axios,讓使用過程中更方便,更加容易管理各種api接口 一、axios封裝——http...
    coderluojz閱讀 345評(píng)論 0 2
  • 在vue項(xiàng)目中,和后臺(tái)交互獲取數(shù)據(jù)這塊,我們通常使用的是axios庫(kù),它是基于promise的http庫(kù),可運(yùn)行在...
    lan1997閱讀 1,418評(píng)論 0 1
  • vue中Axios的封裝和API接口的管理 我們所要的說的axios的封裝和api接口的統(tǒng)一管理,其實(shí)主要目的就是...
    古月夢(mèng)回閱讀 1,523評(píng)論 0 0

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