import axios from 'axios' // 引入 前后端交互方式
import Vue from 'vue'
import Router from '@/router/index' // 引入路由组件 当状态为 403 的时候跳转的登录界面
import baseConfig from '@/baseConfig' // 引入封装好的 IP 模块(url路径)
let baseURL = process.env.NODE_ENV === 'development' ? '/api' : baseConfig.proUrl + '/api'
// withCredentials: true,跨域请求时是否需要使用凭证 ,是否携带cookie,开启withCredentials后,服务器才能拿到你的cookie,当然后端服务器也要设置允许你获 取你开启了才有用
const api = axios.create({
baseURL,
withCredentials: true,
timeout: 5000 // 请求超时时间
})
api.interceptors.request.use(config => { // 请求拦截
// 在全局中的入口文件引入 import VueCookies from 'vue-cookies',并使用Vue.use(VueCookies),这样在使用的时候就可以直接在vue的实例上去使用(Vue.$cookies)或者 单个路由组件对象中(this.$cookies.set('登录的时候存储数据的名字', 存储的数据信息))
let token = Vue.$cookies.get('登录的时候存储数据的名字')
if (token) {
config.headers['Authorization'] = '拼接token使用的字符串' + token // 设置请求头
}
if(config.download){ // download设置responseType
config.responseType = 'blob'
}
return config
}, error => {
return Promise.reject(error)
})
api.interceptors.response.use(response => { // 返回拦截
if (response.status === 200) {
if(response.config.download){ // download
let objectUrl = URL.createObjectURL(new Blob([response.data])) // 转换文件下载路径
let fileName = decodeURI(response.headers['content-disposition'].split('=')[1]) // 获取文件名
const link = document.createElement('a')
link.download = fileName
link.href = objectUrl
link.click()
return Promise.resolve(response)
}
return Promise.resolve(response.data)
} else {
return Promise.reject(response)
}
}, error => {
if(error.response.status === 403){
Vue.$cookies.remove('登录的时候存储数据的名字')
Router.push({path: '/login', query: {overtime : true }}) // 跳转相应的界面 -- 一般都是直接返回到登录界面
}
return Promise.reject(error.response)
})
export default api