/* * 对Axios的二次封装,目的:把当前项目中,所有请求的公共部分进行统一处理 * + axios.defaults 设置公共的配置项 * + axios.interceptors 基于拦截器做统一处理 */// 配置请求接口的统一前缀「webpack环境,我们根据环境变量的值,设置不同的前缀,来区分不同的环境」// + 开发 development// + 测试 test// + 灰度 grayscale// + 生产 production// $ npm run build/start/test/gray... 设置不同的环境变量/* const env = process.env.NODE_ENV || 'development';switch (env) { case 'development': axios.defaults.baseURL = 'http://127.0.0.1:9999'; break; case 'test': axios.defaults.baseURL = 'http://168.1.123.1:9999'; break; case 'production': axios.defaults.baseURL = 'http://api.zhufengpeixun.cn'; break;} */axios.defaults.baseURL = 'http://127.0.0.1:9999';// 设置超时时间{10S} & 设置跨域请求中是否携带资源凭证axios.defaults.timeout = 10000;axios.defaults.withCredentials = true;// 配置公共的自定义请求头信息 headers['common']/headers['post/get...']/headers/...axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';// POST系列请求对于请求主体信息的统一格式化axios.defaults.transformRequest = function (data, headers) { if (data === null || typeof data !== "object") return data; let contentType = headers['Content-Type'] || headers.post['Content-Type']; if (contentType.includes('urlencoded')) return Qs.stringify(data); if (contentType.includes('json')) return JSON.stringify(data); return data;};// 设置响应状态码的校验处理{规定服务器返回的状态码哪些是算请求成功,哪些算失败}axios.defaults.validateStatus = function (status) { return status >= 200 && status < 400;};// 请求拦截器,当所有配置处理完,在向服务器发送请求之前,我们拦截到现有的配置,再去做一些统一修改axios.interceptors.request.use(function (config) { // 例如:传递Token /* const token = sessionStorage.getItem('token'); if (token) { config.headers['Authorization'] = token; } */ return config;});// 响应拦截器,当前请求有结果之后,我们在业务层自己调用then/catch方法之间拦截一下,这样可以做一些成功或者失败的统一提示处理等...axios.interceptors.response.use(function onfulfilled(response) { // 成功:服务器正常返回结果 & validateStatus状态码校验成功 return response.data;}, function onrejected(reason) { // 失败:@1服务器返回了结果但是状态码没有经过validateStatus校验 || @2服务器压根没有返回任何的结果 || @3请求中断或者超时... let response = reason.response; if (response) { // @1 switch (response.status) { case 401: break; // ... } } else { if (reason && reason.code === 'ECONNABORTED') { // @3 } if (!navigator.onLine) { // @2 } } return Promise.reject(reason);});export default axios;