78 lines
2.4 KiB
React
78 lines
2.4 KiB
React
/**
|
|
* 使用方法:
|
|
* - 导入该http组件
|
|
* import http from '@/utils/http';
|
|
* - 发 GET 自动带cookie
|
|
* const { data } = await http.get('/userinfo');
|
|
* - 发 POST,也会自动带 cookie
|
|
* await http.post('/posts', { title: 'hello' });
|
|
*/
|
|
|
|
import axios from 'axios';
|
|
|
|
const http = axios.create({
|
|
baseURL: 'https://rop.cc/apitest/cookie',
|
|
timeout: 5000,
|
|
withCredentials: true //提示浏览器,带上cookie
|
|
});
|
|
|
|
// 请求拦截器:自动附加 token
|
|
// http.interceptors.request.use(cfg => {
|
|
// cfg.headers['Authorization'] = `Bearer ${token}`;
|
|
// return cfg;
|
|
// }, err => Promise.reject(err));
|
|
|
|
// 响应拦截器:统一处理 401(未授权)
|
|
http.interceptors.response.use(res => res, err => {
|
|
// 检查错误类型是否为 AxiosError,并且是否为超时错误
|
|
if (err.code === 'ECONNABORTED' && err.message.includes('timeout')) {
|
|
// 超时错误的处理
|
|
console.error('请求超时:', err.message);
|
|
alert('请求超时,请稍后再试');
|
|
return Promise.resolve(); // 返回一个 resolved promise,防止继续传播
|
|
}
|
|
if (err.response) {
|
|
const status = err.response.status;
|
|
|
|
switch (status) {
|
|
case 401:
|
|
// 重定向到登录页
|
|
window.location.href = '/apitest/login';
|
|
break;
|
|
case 403:
|
|
alert('权限不足,请联系管理员');
|
|
break;
|
|
case 404:
|
|
console.warn('请求的资源未找到');
|
|
break;
|
|
case 500:
|
|
alert('服务器出错,请稍后再试');
|
|
break;
|
|
case 502:
|
|
alert('网关错误,请稍后再试');
|
|
break;
|
|
case 503:
|
|
alert('服务不可用,请稍后再试');
|
|
break;
|
|
case 504:
|
|
alert('网关超时,请稍后再试');
|
|
break;
|
|
default:
|
|
console.error('请求失败:', err);
|
|
|
|
}
|
|
return Promise.resolve();
|
|
|
|
} else {
|
|
// 非响应错误
|
|
console.error('非响应错误:', err);
|
|
// 处理非响应错误
|
|
if (err instanceof Error) {
|
|
alert('请求失败,请检查网络连接');
|
|
}
|
|
}
|
|
return Promise.reject(err);
|
|
});
|
|
export default http;
|
|
|