1. 程式人生 > 其它 >Axios二次封裝及使用

Axios二次封裝及使用

開發中把Axios進行二次封裝,可以更好的使用Axios的請求攔截器,以及響應攔截器去處理資料

實現程式碼如下 新建/api/request.js:

/* 對axios進行二次封裝 */
import axios from "axios";
// 引入進度條 start 進度條開始  done進度條結束
import nprogress from "nprogress";
//引入 進度條樣式
import "nprogress/nprogress.css"

//1. 利用axios物件的方法create方法去建立一個axios例項
// request就是axios,只不過稍微配置一下
const request = axios.create({
    // 基礎路徑:發請求的時候,路徑中會帶有api
    baseURL:'/api',
    //代表請求超時的時間為5s
    timeout:5000,
})

// 配置請求攔截器,在請求發出去之前,攔截器可以監測到,可以在請求發出之前做一些事情
 request.interceptors.request.use((config)=>{
    //config 是一個配置物件,物件裡有一個屬性很重要,就是header請求頭
    nprogress.start();
    return config;
 })

 // 響應攔截器
 request.interceptors.response.use((res)=>{
    //響應成功的回撥函式,伺服器響應資料回來以後,可以做一些事情
    nprogress.done();
    return res.data;
 },(error)=>{
    //響應失敗的回撥函式
    return error.msg
 })

 export default request;

現在其實以及封裝完畢了,需要用的時候可以直接引入使用,但是都做到這一步了,乾脆在做個api統一管理 /api/index

//該模組對所有的api進行統一管理

import request from "./request";

// 三級聯動介面 get /api/product/getBaseCategoryList 無引數
export const reqCategoryList = ()=>{
    //傳送請求,axios返回的結果是Promiss物件
    return request({url:'/product/getBaseCategoryList',method:'get'})
}

使用方法,因為本專案使用了vuex狀態管理,所以在需要請求的時候,直接dispatch給action,不使用vuex可以直接呼叫介面函式即可

    mounted(){
      //通知vuex發請求,獲取資料,儲存與倉庫當中
      this.$store.dispatch('categoryList');
    },

在action中處理:

import {reqCategoryList} from "@/api";

//actions 處理actions,可以寫自己的業務,也可以處理非同步
const actions = {
    //通過api介面向伺服器傳送請求
    async categoryList(commit){
        let result = await reqCategoryList();//傳送請求
        //commit 向state提交資料,提交的資料就是獲取到的資料
        if(result.code == 200){
            this.commit('CATEGORYLIST',result.data)
        }
    }
};

解決請求跨域問題,使用代理伺服器

    //代理跨域  只有瀏覽器有跨域問題  伺服器之間沒有
    devServer: {
        proxy: {
            '/api':{
                target:'http://39.98.123.211',
                //這裡路徑不需要重寫,因為請求伺服器上的路徑就帶api
                //pathRewrite: { '^/api':''},
            }
        }
    }

文中程式碼進度條的實現,其實也算是請求攔截器、響應攔截器的使用了。同理動態載入動畫也可以通過這種方式實現