axios 拦截器的配置

import axios from 'axios';
import qs from 'querystring';
import router from '../router/index.js';

// 返回登录页面 这是为接口中权限不够的人  返回登录页面所设置的
const toLogin = () =>{
    router.push({
        path:'/login'
    })
}

// 错误信息处理
const errorHandle = (status, other) => {
    switch(status) {
        case 400:
            console.log('请求错误');
            //前后端传参数据问题?
            break;
        case 401:
            console.log('权限不够')
            // 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
            // 甚至光返回登录页面还不行 还要清除vuex中用户信息 清除localStorage
            toLogin()
            break;
        case 403:
            // token 过时了?
            // 服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
            toLogin()
            break;
        case 404:
            console.log('资源未找到')
            break;
        default:
            console.log(other)
            break;
    }
}

var instance = axios.create({timeout:5000}); // 创建axios实例
// 注意这个也可能是 其他值 比如application/json
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

instance.interceptors.request.use(function(config){
    console.log(config)
    const user = localStorage.getItem('token')
    if(user){
        // 这个是可选的  使用token 并且和后端约定在请求头中添加的时候才需要
        config.headers.Authorization = 'Bearer ' + localStorage.getItem('token')
    }
    if(config.method === 'post') {
        //注意这是有意你之前设置的Content-Type的原因 否则这步骤可以省略
        // 而且你要考虑  后端如果不同的接口 有些事json 有些是 x-www-form-urlencoded 就要在具体调用接口的时候区别了 而省略这部
        config.data = qs.stringify(config.data) 
    }
    return config;
},function(err){
    return Promise.reject(err)
})

instance.interceptors.response.use(function(res){
    if(res.status === 200) {
      return Promise.resolve(res)
    }else{
      return Promise.reject(res)
    }
},function(err){
    const {response} = err; //解构
    if(response){
        errorHandle(response.status,response.data.message)
        return Promise.reject(response)
    }else{
        console.log('断网了')
    }
})

export default instance;

这是axios.js

这是需要引入vue的main.js  Vue.portotype.$axios = instance

this.$axios.get(url,{params:{id:1}}).then(()=>{
​​​​​​​)
this.$axios.post(url,{name:'刘少伟'}).then(()=>{
​​​​​​​)

注意:这种针对axios拦截器方式的封装 适合的是有登陆、退出等功能的完整项目,很大可能结合vuex、token等登陆状态功能和路由结合的项目

           如果你只是很简单的页面展示,获取数据,不涉及到页面登陆也不涉及记录用户登陆状态 的项目,呢就不需要设置这么多的封装了 直接使用axios或者简单的封装个get和post即可,不需要写这么多的封装代码。

简单axios封装在这里:https://blog.csdn.net/Future1994/article/details/109698273

也是我自己写的

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值