Axios 的安装和基本配置。
展示 Axios 的安装和配置过程。
# 使用 npm 安装
npm install axios
# 使用 yarn 安装
yarn add axios
# 使用 CDN
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
Axios 的基本配置。
展示基本配置的使用。
// 创建实例
const instance = axios.create({
baseURL: 'https://api.example.com',
timeout: 1000,
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
});
// 全局配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.timeout = 1000;
axios.defaults.headers.common['Authorization'] = 'Bearer token';
// 请求配置
const config = {
url: '/user',
method: 'get',
params: {
ID: 12345
},
data: {
firstName: 'Fred',
lastName: 'Flintstone'
},
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
};
Axios 的基本请求方法。
展示基本请求的使用。
// GET 请求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// POST 请求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// PUT 请求
axios.put('/user/12345', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// DELETE 请求
axios.delete('/user/12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Axios 的并发请求。
展示并发请求的使用。
// 并发请求
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 两个请求都完成
console.log(acct, perms);
}));
// 使用 async/await
async function getUserData() {
try {
const [user, permissions] = await Promise.all([
axios.get('/user/12345'),
axios.get('/user/12345/permissions')
]);
console.log(user, permissions);
} catch (error) {
console.error(error);
}
}
Axios 的请求拦截器。
展示请求拦截器的使用。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
config.headers.Authorization = 'Bearer ' + getToken();
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 移除请求拦截器
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
// 实例拦截器
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});
Axios 的响应拦截器。
展示响应拦截器的使用。
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response.data;
}, function (error) {
// 对响应错误做点什么
if (error.response) {
// 请求已发出,但服务器响应的状态码不在 2xx 范围内
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// 请求已发出,但没有收到响应
console.log(error.request);
} else {
// 发送请求时出了点问题
console.log('Error', error.message);
}
return Promise.reject(error);
});
// 实例拦截器
const instance = axios.create();
instance.interceptors.response.use(function () {/*...*/});
Axios 的错误类型。
展示错误类型的处理。
// 错误处理
axios.get('/user/12345')
.catch(function (error) {
if (error.response) {
// 请求已发出,但服务器响应的状态码不在 2xx 范围内
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// 请求已发出,但没有收到响应
console.log(error.request);
} else {
// 发送请求时出了点问题
console.log('Error', error.message);
}
console.log(error.config);
});
// 自定义错误处理
const handleError = (error) => {
if (error.response) {
switch (error.response.status) {
case 400:
console.log('请求错误');
break;
case 401:
console.log('未授权');
break;
case 403:
console.log('禁止访问');
break;
case 404:
console.log('资源不存在');
break;
case 500:
console.log('服务器错误');
break;
default:
console.log('未知错误');
}
}
return Promise.reject(error);
};
Axios 的取消请求。
展示取消请求的使用。
// 取消请求
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// 处理错误
}
});
// 取消请求
source.cancel('Operation canceled by the user.');
// 使用 executor 函数
const CancelToken = axios.CancelToken;
let cancel;
axios.get('/user/12345', {
cancelToken: new CancelToken(function executor(c) {
// executor 函数接收一个 cancel 函数作为参数
cancel = c;
})
});
// 取消请求
cancel();
Axios 的请求封装。
展示请求封装的最佳实践。
// 创建请求实例
const request = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
});
// 请求拦截器
request.interceptors.request.use(
config => {
// 在发送请求之前做些什么
if (store.getters.token) {
config.headers['Authorization'] = `Bearer ${store.getters.token}`;
}
return config;
},
error => {
// 对请求错误做些什么
console.log(error);
return Promise.reject(error);
}
);
// 响应拦截器
request.interceptors.response.use(
response => {
const res = response.data;
if (res.code !== 200) {
// 处理错误
return Promise.reject(new Error(res.message || 'Error'));
} else {
return res;
}
},
error => {
console.log('err' + error);
return Promise.reject(error);
}
);
// 封装请求方法
export function get(url, params) {
return request({
url,
method: 'get',
params
});
}
export function post(url, data) {
return request({
url,
method: 'post',
data
});
}
Axios 的错误处理最佳实践。
展示错误处理的最佳实践。
// 错误处理工具
const errorHandler = {
// 处理响应错误
handleResponseError(error) {
if (error.response) {
switch (error.response.status) {
case 400:
this.handleBadRequest(error);
break;
case 401:
this.handleUnauthorized(error);
break;
case 403:
this.handleForbidden(error);
break;
case 404:
this.handleNotFound(error);
break;
case 500:
this.handleServerError(error);
break;
default:
this.handleDefaultError(error);
}
} else if (error.request) {
this.handleNetworkError(error);
} else {
this.handleRequestError(error);
}
return Promise.reject(error);
},
// 处理具体错误
handleBadRequest(error) {
console.log('请求错误:', error.response.data);
},
handleUnauthorized(error) {
console.log('未授权:', error.response.data);
// 可以在这里处理重新登录逻辑
},
handleForbidden(error) {
console.log('禁止访问:', error.response.data);
},
handleNotFound(error) {
console.log('资源不存在:', error.response.data);
},
handleServerError(error) {
console.log('服务器错误:', error.response.data);
},
handleNetworkError(error) {
console.log('网络错误:', error.message);
},
handleRequestError(error) {
console.log('请求错误:', error.message);
},
handleDefaultError(error) {
console.log('未知错误:', error);
}
};
// 使用错误处理
axios.interceptors.response.use(
response => response,
error => errorHandler.handleResponseError(error)
);
建议按照章节顺序学习,每完成一个练习后再进行下一个。可以通过创建实际项目来实践所学知识。