关于axios的拦截和api统一管理

使用:

首先在src的目录里面创建一个http文件夹,在里面创建request.js、api.js两个文件
request.js文件用来封装我们的axios,api.js用来统一管理我们的接口。

在这里插入图片描述
reques.js:

/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
 import axios from 'axios';
 import QS from 'qs'; // 引入qs模块,用来序列化post类型的数据
 import {
    
     Toast } from 'vant';// vant的toast提示框组件
 import store from '../store/index'// 先导入vuex
 
 // 环境的切换
 if (process.env.NODE_ENV == 'development') {
    
        
     axios.defaults.baseURL = '/api';
 } else if (process.env.NODE_ENV == 'debug') {
    
        
     axios.defaults.baseURL = '';
 } else if (process.env.NODE_ENV == 'production') {
    
        
     axios.defaults.baseURL = 'http://api.123dailu.com/';
 }
 
 // 请求超时时间
 axios.defaults.timeout = 10000;
 
 // post请求头
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
 
 // 请求拦截器
 axios.interceptors.request.use(    
     config => {
    
    
         // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
         // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
         const token = store.state.token;        
         token && (config.headers.Authorization = token);        
         return config;    
     },    
     error => {
    
            
         return Promise.error(error);    
     })
 
 // 响应拦截器
 axios.interceptors.response.use(    
     response => {
    
            
         if (response.status === 200) {
    
                
             return Promise.resolve(response);        
         } else {
    
                
             return Promise.reject(response);        
         }    
     },
     // 服务器状态码不是200的情况    
     error => {
    
            
         if (error.response.status) {
    
                
             switch (error.response.status) {
    
                    
                 // 401: 未登录                
                 // 未登录则跳转登录页面,并携带当前页面的路径                
                 // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                 case 401:                    
                     router.replace({
    
                            
                         path: '/login',                        
                         query: {
    
     redirect: router.currentRoute.fullPath } 
                     });
                     break;
                 // 403 token过期                
                 // 登录过期对用户进行提示                
                 // 清除本地token和清空vuex中token对象                
                 // 跳转登录页面                
                 case 403:                     
                     Toast({
    
                            
                         message: '登录过期,请重新登录',                        
                         duration: 1000,                        
                         forbidClick: true                    
                     });                    
                     // 清除token                    
                     localStorage.removeItem('token');                    
                     store.commit('loginSuccess', null);                    
                     // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
                     setTimeout(() => {
    
                            
                         router.replace({
    
                                
                             path: '/login',                            
                             query: {
    
     
                                 redirect: router.currentRoute.fullPath 
                             }                        
                         });                    
                     }, 1000);                    
                     break; 
                 // 404请求不存在                
                 case 404:                    
                     Toast({
    
                            
                         message: '网络请求不存在',                        
                         duration: 1500,                        
                         forbidClick: true                    
                     });                    
                 break;                
                 // 其他错误,直接抛出错误提示                
                 default:                    
                     Toast({
    
                            
                         message: error.response.data.message,                        
                         duration: 1500,                        
                         forbidClick: true                    
                     });            
             }            
             return Promise.reject(error.response);        
         }       
     }
 );
 /** 
  * get方法,对应get请求 
  * @param {String} url [请求的url地址] 
  * @param {Object} params [请求时携带的参数] 
  */
 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)        
         })    
     });
 }
 /** 
  * post方法,对应post请求 
  * @param {String} url [请求的url地址] 
  * @param {Object} params [请求时携带的参数] 
  */
 export function post(url, params) {
    
        
     return new Promise((resolve, reject) => {
    
             
         axios.post(url, QS.stringify(params))        
         .then(res => {
    
                
             resolve(res.data);        
         })        
         .catch(err => {
    
                
             reject(err.data)        
         })    
     });
 }

api.js(接口的统一化管理)

import {
    
     get, post } from './request'

//请求地址api
 const apiAddress = query => post('/api/v1/',address, query);
//请求列表api
 const apiList = query => post('/api/v1/list', query);
 
export default {
    
    apiAddress,apiList}

组件中使用

import {
    
     apiAddress,apiList } from '@/http/api';// 导入我们的api接口
export default {
    
            
    name: 'Address',    
    created () {
    
    
        this.onLoad();
    },
    methods: {
    
                
        // 获取数据            
        onLoad() {
    
    
            // 调用api接口,并且提供了两个参数                
            apiAddress({
    
                        
                type: 0,                    
                sort: 1                
            }).then(res => {
    
    
                // 获取数据成功后的其他操作
                ………………                
            })            
        }        
    }
}

猜你喜欢

转载自blog.csdn.net/WuqibuHuan/article/details/118110894