axios封装

Posted AlanTao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了axios封装相关的知识,希望对你有一定的参考价值。

axios.js

import axios from ‘axios‘;
import api from ‘./api‘;

// 创建一个axios实例
const axiosService = axios.create({
	timeout: 5000, // 设置超时时间为5s
});
// 添加请求拦截器
axiosService.interceptors.request.use(
	config => {
		//设置全局超时的请求次数,请求的间隙
		config.retry = 4;
		config.retryDelay = 1000;

		// console.log(‘添加请求拦截器‘);
		return config;
	},
	error => {
		return Promise.reject(error);
	}
);
// 添加响应拦截器
axiosService.interceptors.response.use(
	res => {
		const responseData = res.data;
		// 登录失效,请重新登录
		if (responseData.code === ‘10002‘) {
			console.log(responseData);
		}
		return responseData;
	},
	error => {
    // 超时重新连接
		var config = error.config;
		// 如果配置不存在或者没有设置重试选项,拒绝
		if (!config || !config.retry) return Promise.reject(error);
		// 设置变量以跟踪重试计数
		config.__retryCount = config.__retryCount || 0;
		// 检查我们是否已经达到重试的总数
		if (config.__retryCount >= config.retry) {
			return Promise.reject(error);
		}
		// 增加重试计数
		config.__retryCount += 1;

		//创造新的Promise来处理回调backoff
		var backoff = new Promise(resolve => {
			// 设置延迟时间
			setTimeout(() => {
				resolve();
			}, config.retryDelay || 1);
		});
		// 返回Promise,其中调用axios以重试请求
		console.log(axiosService, config);
		return backoff.then(() => {
			return axiosService(config);
		});
	}
);
// 请求响应回调
const http = options => {
	return new Promise((resolve, reject) => {
		// 请求方法等参数
		const requestData = api.formatConfig(options);
		// 请求方法
		axiosService(requestData)
			.then(data => {
				if (data.code.toString() === ‘0‘ || data.code.toString() === ‘200‘) {
					resolve(data.data);
				}
			})
			.catch(err => {
				reject(err);
			});
	});
};
// 这样可以用vuex?????, 下午试一试
export default {
	install: function(Vue) {
		Object.defineProperty(Vue.prototype, ‘$axios‘, { value: http });
	},
};

 

api.js 

import host from ‘./host‘;
export default {
	baseUrl: {
		ex: host.ex + ‘/exchange-web-api/‘,
		hd: host.hd + ‘/activity/‘,
	},
	/**
	 * 切换路线获取ex的域名
	 * @returns {String}  // 返回url
	 */
	getExHost() {
		// 测试环境
		if (process.env.NODE_ENV === ‘development‘) {
			if (window.loex_remote_domain && window.loex_remote_domain.web_api) {
				return window.loex_remote_domain.web_api + ‘/exchange-web-api/‘;
			}
			// 开发环境
		} else if (process.env.NODE_ENV === ‘production‘) {
			if (window.loex_remote_domain && window.loex_remote_domain.web_api) {
				return window.loex_remote_domain.web_api + ‘/exchange-web-api/‘;
			}
		}
		return this.baseUrl.ex;
	},
	/**
	 * 切换路线获取hd的域名
	 * @returns {String}  // 返回url
	 */
	getHdHost() {
		// 测试环境
		if (process.env.NODE_ENV === ‘development‘) {
			if (window.loex_remote_domain && window.loex_remote_domain.hd) {
				return window.loex_remote_domain.hd + ‘/activity/‘;
			}
			// 开发环境
		} else if (process.env.NODE_ENV === ‘production‘) {
			if (window.loex_remote_domain && window.loex_remote_domain.hd) {
				return window.loex_remote_domain.hd + ‘/activity/‘;
			}
		}
		return this.baseUrl.hd;
	},
	/**
	 * @param {Object} acHeaders  // 新增的请求头项
	 * @returns {Object}  // axios请求头列表
	 */
	formatHeaders(acHeaders) {
		let headers = {}; // ‘Content-Type‘: ‘multipart/form-data‘  // application/json
		headers[‘exchange-token‘] = localStorage.getItem(‘ex_token‘) || ‘‘;
		headers[‘exchange-language‘] = localStorage.getItem(‘lan‘) || ‘zh_CN‘;
		headers[‘exchange-client‘] = ‘app‘;
		if (acHeaders) {
			for (let i in acHeaders) {
				headers[i] = acHeaders[i];
			}
		}
		return headers;
	},
	/**
	 * @param {Object} options  // 请求参数
	 * @returns {Object}  // axios请求参数
	 */
	formatConfig(options) {
		// 请求基本参数
		let defaults = {
			url: ‘‘, // 请求url
			method: ‘GET‘, // 默认get方法
			hostType: ‘ex‘, // 默认ex域
			headers: null, // 要添加的请求头
			data: null, // post请求参数
			params: null, // get请求参数
		};
    // 整理参数筛选
		let config = {};
		options = options || {};
		for (var key in defaults) {
			if (typeof options[key] !== ‘undefined‘) {
				config[key] = options[key];
			} else {
				if (defaults[key]) {
					config[key] = defaults[key];
				}
			}
    }
    // 请求域名
		const hostMap = {
			ex: this.getExHost(),
			hd: this.getHdHost(),
    };
    // 请求url
    const fullUrl = config.hostType === ‘empty‘ ? ‘‘ : hostMap[config.hostType] + `${config.url}`;
    // 请求参数
		const requestData = {
			url: fullUrl,
			headers: this.formatHeaders(config.headers),
			method: config.method,
    };
    // 判断是get还是post
		if (config.method.toUpperCase() === ‘GET‘ && config.params) {
			requestData.params = config.params;
		} else if (config.method.toUpperCase() === ‘POST‘ && config.data) {
			requestData.data = config.data;
    }
		return requestData;
	},
};

  

host.js

export default {
	// ex: ‘https://webapi.loex.io‘,
	ex: ‘http://182.61.148.81‘,
	hd: ‘http://182.61.148.81‘,
};

  

 

以上是关于axios封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

回归 | js实用代码片段的封装与总结(持续更新中...)

项目集成element-plus和axios

vue_cli封装axios--完整代码

vue axios 封装解析

axios简单封装