import axios from 'axios';
import {Message } from 'element-ui'//element-ui提示框组件
import config from './config';
import {removeToken, getToken } from "@/utils/token";//获取token
import router from '@/router'

// 使用vuex做全局loading时使用
// import store from '@/store'

export default function $axios(options) {
return new Promise((resolve, reject) => {
const instance = axios.create({
baseURL: config.baseUrl,
headers: config.headers,
timeout: config.timeout,
withCredentials: config.withCredentials
})
// request 拦截器
instance.interceptors.request.use(
config => {
let token = getToken()
if (token) {
config.headers.Authorization = `Bearer ${token}`
} else {
// 重定向到登录页面
// router.push('/')
}
// 3. 根据请求方法,序列化传来的参数,根据后端需求是否序列化
if (config.method === 'post') {
// config.data = qs.stringify(config.data)
}
return config
},
error => {
// 请求错误时
console.log('request:', error)
// 1. 判断请求超时
if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
console.log('timeout请求超时')
// return service.request(originalRequest);// 再重复请求一次
}
// 2. 需要重定向到错误页面
const errorInfo = error.response
console.log(errorInfo)
if (errorInfo) {
error = errorInfo.data // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
const errorStatus = errorInfo.status; // 404 403 500 ...
router.push({
path: `/error/${errorStatus}`
})
}
return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
}
)
// response 拦截器
instance.interceptors.response.use(
response => {
let data;
// IE9时response.data是undefined,因此需要使用response.request.responseText(Stringify后的字符串)
if (response.data == undefined) {
data = JSON.parse(response.request.responseText)
} else {
data = response.data
}
// 根据返回的code值来做不同的处理
switch (data.code) {
case 401:
console.log(data.desc)
break;
case 0:
store.commit('changeState')
// console.log('登录成功')
default:
}
return data
},
err => {
if (err && err.response) {
switch (err.response.status) {
case 400:
err.message = '请求错误'
break
case 401:
Message({
type: 'error',
message: '未授权,请登录'
})
err.message = '未授权,请登录'
removeToken()
router.currentRoute.path !== 'login' &&
router.replace({
path: '/login',
query: { redirect: router.currentRoute.path },
})
break
// case 403:
// err.message = '拒绝访问'
// break
// case 404:
// err.message = `请求地址出错: ${err.response.config.url}`
// break
// case 408:
// err.message = '请求超时'
// break
// case 500:
// err.message = '服务器内部错误'
// break
// case 501:
// err.message = '服务未实现'
// break
// case 502:
// err.message = '网关错误'
// break
// case 503:
// err.message = '服务不可用'
// break
case 504:
Message({
type: 'error',
message: '网关超时'
})
err.message = '网关超时'
break
default:
Message({
type: 'error',
message: err.response.data.message,
})
}
}
console.error(err)
return Promise.reject(err) // 返回接口返回的错误信息
}
)
// 请求处理
instance(options).then(res => {
resolve(res)
return false
}).catch(error => {
reject(error)
})
})
}

使用

axiso封装的更多相关文章

  1. axiso 高级封装

    ​ import axios from 'axios'; import qs from 'qs'; const Unit = { async getApi(ajaxCfg){ let data = a ...

  2. Vue-axios 封装了一手好axios:)

    请求方式 很多种请求方式,重点还是第一种吧 下载 npm install axios --save 下载完成 直接导入 import axios from 'axios' 简单配置 axios({ u ...

  3. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  5. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  6. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  7. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  8. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  9. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  10. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

随机推荐

  1. Android MaterialButtonToggleGroup使用

    原文地址: Android MaterialButtonToggleGroup使用 - Stars-One的杂货小窝 觉得单选框不好看,发现了一个Material里的单选按钮组,感觉UI还不错,记下使 ...

  2. gradle安装单元测试坎坷历程

    参考,欢迎点击原文:https://blog.csdn.net/qq_42815122/article/details/85395111(灵感) 自己写的用户系统要加上单元测试,加就加吧,跟着网上的好 ...

  3. 大端(big endian) 小端(little endian) --- 在多字节存储 和 多字节通信中的含义(我还是太年轻了)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. 建民的JAVA课堂

    import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { String ...

  5. 智慧公安!3DCAT实时云渲染助力某公安机关打造数字孪生可视化系统

    近年来,随着大数据.数字孪生.云计算.人工智能等技术的飞速发展,数字化浪潮席卷全国各地公安系统.2022年全国公安工作会议中也提到,数字化改革是推动公安工作创新发展的大引擎.培育战斗力生成新的增长点. ...

  6. python高级技术(网络编程二)

    一 粘包现象(基于TCP协议实现远程执行命令) 1.TCP协议,会出现粘包现象 例:ipconfig命令,客户端收到的字符串比较短,客户端能够收完整, tasklist命令,客户端收到的字符串超过10 ...

  7. Linux快速入门(七)效率工具(Vim)

    Vim编辑器 所有的Linux系统都会内建一个Vi文本编辑器,而Vim是从Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩展名判别编程语言. 使用方式 ...

  8. 神经网络——基于sklearn的参数介绍及应用

    一.MLPClassifier&MLPRegressor参数和方法 参数说明(分类和回归参数一致): hidden_layer_sizes :例如hidden_layer_sizes=(50, ...

  9. C# 剪裁图片

    /// <summary> /// 剪裁图片 /// </summary> /// <param name="src">原图片</para ...

  10. spring boot @Scheduled

    例子 @EnableScheduling @Component public class Job { /** * 每秒执行一次 */ @Scheduled(cron = "0/1 * * * ...