如何用vue封装axios详解!

3 篇文章 0 订阅

如何用vue封装axios

该项目需要在登录之前添加验证码,为了更加方便请求接口的区分,可以封装两个请求接口,一个登录之前需要请求的接口,一个为登录之后请求的接口,使之互不干扰。
1.登录前设置一个文件夹axios,其中的index.js写请求的接口,config.js写配置

index.js

/*接口文件*/
//axios配置文件
import index from './config'

export default {
    API_VERIFY: (params) => index('get', '/login/getverify?', params),//验证码

    API_LOGIN: (body ) => index('post','login/index?' ,body),//登录
   
}

 config.js

import axios from 'axios'
import index from './index'

const instance = axios.create({
    //默认地址
    baseURL: 'http://192.168.10.26/v1',
    //响应时长
    timeout: 6000
})

//请求拦截器
instance.interceptors.request.use(
    /**
     * @param config    传入的url以及参数
     */
    (config) => {
        axios.defaults.headers['Content-Type'] = 'Access-Control-Allow-Origin'
        // console.log("发送请求",config)
        return config
    },
    (error) => {
        console.log("发送请求失败")
        return Promise.reject(error)
    }
)

//响应拦截器
instance.interceptors.response.use(
    (response) => {
        // console.log("响应成功",response)
        return response.data
    },
    (error) => {
        console.log("响应失败",error.response)
        return Promise.reject(error)
    }
)
/**
 * @param {请求方式} method 
 * @param {请求地址} path 
 * @param {请求参数} params
 */
export default function (method, url, params) {
    method = method.toLowerCase()
    switch (method) {
        case 'get':
            params = params || ''
            return instance.get(url + params)
        case 'post':
            params = params || null
            return instance.post(url,params)
        default:
        console.error('未知的method:'+method)
        return false
    }
}

2.登录后设置一个文件夹request,其中的api.js写请求的接口,http.js写配置

http.js

import axios from 'axios'
import router from 'vue-router'
import {
  Loading,
  Message
} from 'element-ui'
var instance = axios.create({
  baseURL: 'http://192.168.10.26/v1',
  timeout: 6000,
})
var access_token = localStorage.getItem("token");
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  access_token = localStorage.getItem("token");
  // console.log(access_token)
  if (access_token) {
    config.headers.Authorization = `${access_token}`;
  }  
    return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});
 
// http请求拦截器
var loadinginstace = "";
instance.interceptors.request.use(config => {
  loadinginstace = Loading.service({
    fullscreen: true
  })
  return config
}, error => {
  loadinginstace.close();
  Message.error({
    message: '加载超时'
  })
  return Promise.reject(error);
})
// http响应拦截器
instance.interceptors.response.use(data => { // 响应成功关闭loading
  loadinginstace.close();
  //  console.log(data)
  return data
}, error => {
  const {
    code
  } = error;
  if (code == 'ECONNABORTED') {
    loadinginstace.close();
    Message.error({
      message: '网络超时,请重新请求'
    })
    return Promise.reject(error);
  }
  const {
    status
  } = error.response; //在response中有一个status 我们用es6的方式解构出来
  if (status == 401) {
    //后台定义401为token过期
    // alert('请重新登录!');
    loadinginstace.close();
    //  如果token过期了;我们应该清token
    localStorage.removeItem("token");
    localStorage.removeItem("nickname");
    localStorage.removeItem("avatarImg");
    localStorage.removeItem("mobile");
    //   清楚后让它跳转到登录页面去
    location.href = "/Login";
  } else {
    alert('系统繁忙!');
  }
  
  loadinginstace.close();
  Message.error({
    message: '加载失败'
  })
  return Promise.reject(error)
})

export const get = (url, query) => {
  query = query || '';
  return instance.get(url + query)
}
export const post = (url, query) => {
  return instance.post(url, query)
}

api.js

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

export default {
    GET_GRADES:(obj)=>get('/schoolcls/getgrades?',obj),
    
    CLASS_MANAGE:(query,body)=>post('/schoolcls/index?'+query,body),
 
} 
 
 

3.在main.js引入

import api from './request/api'
import index from './axios/index'

Vue.prototype.$api = api
Vue.prototype.$index = index

4.在需要请求接口的页面调用

(1)登录前

如:登录页面login.js

//登录前
submitForm(){

 this.$index.API_LOGIN(obj).then(res=>{
console.log(res)
}).catch(err=>{
console.log(err);
})

}

(2)登录后

如:其中一登录后页面

//登录后子页面
getdata(){
this.$api.GET_GRADES().then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
}

实战结论,写得不好的地方请轻喷~有好的建议也可以评论告诉下~谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值