Skip to content
On this page

axios拦截器

axios实例

js
// axios可以使用.create()方法创建axios实例。
const instance = axios.create({
	baseURL: "https://some-domain.com/api",
	timeout: 1000
})

axios请求/响应拦截器

在请求或响应被 then 或 catch 处理前拦截它们。
便于将重复的代码集中处理.
例如每次响应结果都需要取data里的数据,可以提前将response处理为data,外界多次响应时,无需多次重复处理.

js
// 每个axios实例,包括axios自己,都有拦截器属性,
// 拦截器属性可以针对request和response, 使用use方法配置拦截器.
// use方法内部,传入两个回调函数作为参数
// 对于request: 分别处理  发送请求之前 需要对请求配置做啥, 请求错误 需要做啥.
// 对于response: 分别处理 响应到then之前,对响应数据 需要做啥, 响应错误该做啥.

// 全局拦截器
// 请求 axios.interceptors.request.use(...)
axios.interceptors.request.use(function(config){
	// config 表示 用户设置的请求配置
	return config
},function(error){
	// 此处使用Promise.reject, 便于catch 处理
	return Promise.reject(error);
});
// 响应 axios.interceptors.response.use(..)
axios.interceptors.respons.use(function(response){
	return response
},function(error){
	return Promise.reject(error)
})

// 创建实例的请求拦截器
// 例如在api.js
const api = axios.create({
	baseURL: "https://some-domain.com/api",
	timeout: 1000
})

api.interceptors.request.use(function(config){
	// 添加默认的data为'Fred'
	config.data.firstName = config.data.firstName || 'Fred'
	// 记得将结果返回出去
	return config;
},function(error){
	return Promise.reject(error);
})
api.interceptors.response.use(function(response){
	// 对响应数据做处理,让外界使用的时候更加方便
	// 如果有data,直接给response, 如果没有,给一个空消息
	response = response.data || {message: []}
	// 记得将结果返回出去
	return response;
},function(error){
	return Promise.reject(error);
})

拦截器案例:

html
<script src="./axios_1.3.6_axios.js"></script>
<body>
	<button onclick="" id="btn">发送请求</button>	
	<script type="text/javascript">
		// 创建响应拦截器
		// 创建实例
		const api = axios.create({
			baseURL: "http://ajax-api.itheima.net/api",
			timeout: 1000
		})

		// 利用实例的拦截器属性,响应属性和use方法,创建响应拦截器
		api.interceptors.response.use(function(response){
			var responseT;
			for(let key in response){
				if(key=='data'){
					responseT = response[key];
					console.log("浅拷贝成功");
				}
			}
			return responseT;
		});

		btn.onclick = function(){
			// 点击发送请求,如果请求成功,打印请求数据
			// axios.get('http://ajax-api.itheima.net/api/news').then(response=>{
			// 	console.log(response)
			// }).catch(error => {
			// 	console.log("请求失败" + error);
			// })

			// 使用axios实例,配合响应拦截器使用。
			api.get('/news').then(response=>{
				// 这样这个response就只是含data和message数据的对象了。
				console.log(response)
			}).catch(error => {
				console.log("请求失败" + error);
			})
		}
	</script>
</body>

一个陪你成长的前端博客 - XDocs